IO流的【字節(jié)流】

一、InputStream中的讀取數(shù)據(jù)的方法如下:
1 、int read()
功能:讀取一個(gè)字節(jié)的數(shù)據(jù),并且返回讀到得數(shù)據(jù),如果返回-1,則表示讀到輸入流的末尾。
2、int read(byte[] b)
功能:從輸入流中讀取一定量的字節(jié),并將其存儲(chǔ)在字節(jié)數(shù)組b中,返回實(shí)際讀取的字節(jié)數(shù),如果返回-1,則表示讀到輸入流的末尾。
3、int read(byte[] b, int off, int len)
功能:將數(shù)據(jù)讀入一個(gè)字節(jié)數(shù)組,同時(shí)返回讀取的實(shí)際字節(jié)數(shù),如果返回-1,則表示讀到輸入流的末尾。off指定在數(shù)組b中存放數(shù)據(jù)的起始偏移位置,len指定讀取的最大字節(jié)數(shù)。
4、available()
功能:返回此輸入流下一個(gè)方法調(diào)用可以不受阻塞地從此輸入流讀取或跳過的估計(jì)字節(jié)數(shù)。
5、close()
功能:關(guān)閉輸入流,釋放這個(gè)流的相關(guān)資源。
二、OutputStream中寫入數(shù)據(jù)的方法如下:
1 、int write(int b)
功能:將b的最低的一個(gè)字節(jié)寫入此輸入流,其他三個(gè)字節(jié)丟棄。
2、int write(byte[] b)
功能:將指定的字節(jié)數(shù)組b寫入此輸入流。
3、int write(byte[] b, int off, int len)
功能:將指定byte數(shù)組中從偏移量off開始的len個(gè)字節(jié)寫入輸入流。
4、flush()
功能:刷新此輸入流并強(qiáng)制寫出所有緩沖的輸出字節(jié)數(shù)。
5、close()
功能:關(guān)閉輸出流,釋放這個(gè)流的相關(guān)資源。
①字節(jié)數(shù)組輸入流:
package com.iotest;import java.io.ByteArrayInputStream;import java.io.IOException;public class ByteArryInputStreamDemo { public static void main(String[] args) throws IOException { String str = "abcdefghijk"; byte[] strBuf = str.getBytes(); //字符串轉(zhuǎn)換成字節(jié)數(shù)組 ByteArrayInputStream bais = new ByteArrayInputStream(strBuf); int data = bais.read(); //從字節(jié)數(shù)組輸入流讀取字節(jié) while(data!=-1){ char upper = Character.toUpperCase((char)data); System.out.PRint(upper+" "); data = bais.read(); } bais.close(); }}程序運(yùn)行結(jié)果:A B C D E F G H I J K
②字節(jié)數(shù)組輸出流:
package com.iotest;import java.io.ByteArrayOutputStream;import java.io.IOException;public class ByteArrayOutputStreamDemo { public static void main(String[] args) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); String s = "welcome to use ByteArrayOutputStreamDemo"; byte[] buf = s.getBytes(); baos.write(buf); //將指定的byte數(shù)組寫到字節(jié)數(shù)組輸出流中 System.out.println(baos.toString()); //將字節(jié)數(shù)組輸出流內(nèi)容轉(zhuǎn)換成字符串輸出 //將字節(jié)數(shù)組輸出流中的內(nèi)容復(fù)制到字節(jié)數(shù)組中 byte[] b = baos.toByteArray(); for (int i = 0; i < b.length; i++) { System.out.print((char)b[i]); } baos.close(); }}程序運(yùn)行結(jié)果:welcome to use ByteArrayOutputStreamDemowelcome to use ByteArrayOutputStreamDemo③文件輸入輸出流的使用
package com.iotest;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;//復(fù)制圖片public class FileInputStreamDemo { public static void main(String[] args) throws IOException { File file = new File("F://shar//test//logo17.gif"); FileInputStream fis = new FileInputStream(file); //創(chuàng)建一個(gè)輸入流 //創(chuàng)建一個(gè)輸出流,后面一個(gè)參數(shù)true表示追加,原有內(nèi)容不會(huì)被清除,默認(rèn)為false FileOutputStream fos = new FileOutputStream("F://shar//test//logo18.gif",false); int ch = 0; //方式一 /*while((ch=fis.read()) != -1){ fos.write(ch); }*/ //方式二 /*byte[] b = new byte[1024]; while((ch=fis.read(b)) != -1){ fos.write(b,0,ch); }*/ //方式三 byte[] b = new byte[fis.available()]; fis.read(b); //首先把fis的內(nèi)容讀到字節(jié)數(shù)組b里面 fos.write(b);//再把字節(jié)數(shù)組b的內(nèi)容通過輸出流寫到指定文件 //關(guān)閉流 fos.close(); fis.close(); }}④管道流的使用: 一個(gè)PipedInputStream對(duì)象必須和一個(gè)PipedOutputStream對(duì)象進(jìn)行連接從而產(chǎn)生一個(gè)通信管道。通常一個(gè)線程從管道輸出流寫入數(shù)據(jù),另一個(gè)線程從管道輸入流中讀取數(shù)據(jù)。當(dāng)線程A執(zhí)行管道輸入流的read()方法時(shí),如果暫時(shí)沒有數(shù)據(jù),這個(gè)線程就會(huì)被阻塞,只有當(dāng)線程B想管道輸出流寫了數(shù)據(jù)后,線程A才會(huì)恢復(fù)運(yùn)行。package com.iotest;import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutputStream;/* * 管道流 */class Sender extends Thread{ private PipedOutputStream out = new PipedOutputStream(); public PipedOutputStream getOut() { return out; } @Override public void run() { String s = "hello world"; try { out.write(s.getBytes()); out.close(); } catch (Exception e) { // TODO: handle exception } }}public class Receiver extends Thread{ private PipedInputStream in; public Receiver(Sender sender) throws IOException { in = new PipedInputStream(sender.getOut()); } @Override public void run() { try { int data; while((data=in.read())!=-1){ System.out.print((char)data); } in.close(); } catch (Exception e) { // TODO: handle exception } } public static void main(String[] args) throws IOException { Sender sender = new Sender(); Receiver r = new Receiver(sender); sender.start(); r.start(); }}⑤緩沖流的使用:package com.iotest;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class TestPrime { private BufferedInputStream bis = null; private BufferedOutputStream bos = null; String fileName = "F://shar//test//test2.txt"; static int s,p; //判斷是否是質(zhì)數(shù) public boolean isPrime(int n){ for(int i=2;i<=n/2;i++){ if(n%i == 0){ return false; } } return true; } void printPrime(int m) throws IOException{ //將字節(jié)流轉(zhuǎn)緩沖流 bos = new BufferedOutputStream(new FileOutputStream(fileName)); int j = 0; for (int i = 2; i < m; i++) { if(isPrime(i)){ j++; if(j%s == 0){ String s = String.valueOf(i)+" "; bos.write(s.getBytes()); bos.write("/r/n".getBytes()); }else{ String s = String.valueOf(i)+" "; bos.write(s.getBytes()); } } } bos.flush(); bos.close(); } void getPrime() throws IOException{ //將字節(jié)流轉(zhuǎn)緩沖流 bis = new BufferedInputStream(new FileInputStream(fileName)); int c = bis.read(); while(c != -1){ char ch = (char)c; System.out.print(ch); c = bis.read(); } } /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { TestPrime t = new TestPrime(); p = 100; s = 10; t.printPrime(p); t.getPrime(); }}如果不用緩沖流的話,程序是讀一個(gè)數(shù)據(jù),寫一個(gè)數(shù)據(jù)。這樣在數(shù)據(jù)量大的程序中非常影響效率。 緩沖流作用是把數(shù)據(jù)先寫入緩沖區(qū),等緩沖區(qū)滿了,再把數(shù)據(jù)寫到文件里。這樣效率就大大提高了。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注