處理流類型

一、緩沖流
?緩沖流要“套接”在相應(yīng)的節(jié)點(diǎn)流之上,對(duì)讀寫的數(shù)據(jù)提供了緩沖的功能,提高了讀寫的效率,同時(shí)增加了一些新的方法。
?J2SDK提供了四種緩沖流,其常見(jiàn)的構(gòu)造方法為:
BufferedReader (Reader in)
BufferedReader (Reader in, int size) //sz為自定義緩存區(qū)的大小
BufferedWriter (Writer out)
BufferedWriter (Writer out, int size)
BufferedInputStream (InputStream in)
BufferedInputStream (InputStream in, int size)
BufferedOutputStream (OutputStream out)
BufferedOutputStream (OutputStream out, int size)
●緩沖輸入流支持其父類的mark 和reset 方法。
●BufferedReader 提供了readLine 方法用于讀取一行字符串。(以 /r 或 /n 分隔)
●BufferedWriter 提供了newLine 用于寫入一個(gè)行分隔符。
●對(duì)于輸出的緩沖流,寫出的數(shù)據(jù)會(huì)先在內(nèi)存中緩存,使用 flush 方法將會(huì)使內(nèi)存中的數(shù)據(jù)立刻寫出。
例1:TestBufferStream1.java
import java.io.*;public class TestBufferStream1 { public static void main(String[] args) { try{ FileInputStream fis = new FileInputStream("C://Users//Administrator//desktop//HelloWorld.java"); BufferedInputStream bis = new BufferedInputStream(fis); int c = 0; System.out.PRintln((char)bis.read()); System.out.println((char)bis.read()); bis.mark(100);//把標(biāo)記放到100,從100開(kāi)始讀 for(int i=0; i<=10 && (c=bis.read())!=-1 ; i++) { System.out.print((char)c+" "); } System.out.println(); bis.reset();//回到標(biāo)記的點(diǎn) for(int i=0; i<=10 && (c=bis.read()) != -1; i++) { System.out.print((char)c+" "); } bis.close(); }catch(IOException e) { e.printStackTrace(); } }}例2:TestBufferStream2.java
import java.io.*;public class TestBufferStream2 { public static void main(String[] args) { try { BufferedWriter bw = new BufferedWriter(new FileWriter("C://Users//Administrator//desktop//Result1.txt")); BufferedReader br = new BufferedReader(new FileReader("C://Users//Administrator//desktop//Result1.txt")); String s = null; for(int i=1; i<=100; i++) { s = String.valueOf(Math.random()); bw.write(s); bw.newLine(); } bw.flush(); while((s=br.readLine()) != null) { System.out.println(s); } bw.close(); br.close(); }catch(IOException e){ e.printStackTrace(); } }}
二、轉(zhuǎn)換流
●InputStreamReader 和 OutputStreamWriter 用于字節(jié)數(shù)據(jù)到字符數(shù)據(jù)之間的轉(zhuǎn)換。
簡(jiǎn)單的說(shuō),就是把InputStream轉(zhuǎn)換成Reader。于是現(xiàn)在可以直接寫入字符,而不是一個(gè)字節(jié)一個(gè)字節(jié)的寫入。
●InputStreamReader 需要和 InputStream “套接”。
●OutputStreamWriter 需要和 OutputStream “套接”。
●轉(zhuǎn)換流在構(gòu)造時(shí)可以指定其編碼集合,例如:
InputStream isr = new InputStreamReader(System.in, "ISO8859_1")
例1:TestTransform.java
import java.io.*;public class TestTransform1 { public static void main(String[] args) { try { OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream("C://Users//Administrator//desktop//Result2.txt")); osw.write("microsoftibmsunapplehp"); System.out.println(osw.getEncoding()); osw.close(); osw = new OutputStreamWriter( new FileOutputStream("C://Users//Administrator//desktop//Result2.txt",true), "ISO8859_1"); osw.write("microsoftibmsunapplehp"); System.out.println(osw.getEncoding()); osw.close(); }catch(IOException e) { e.printStackTrace(); } }}例2:TestTransform2.java(阻塞/同步)
import java.io.*;public class TestTransform2 { public static void main(String[] args) { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s = null; try { s = br.readLine(); while(s!=null) { if(s.equalsIgnoreCase("exit")) { break; } System.out.println(s.toUpperCase()); s = br.readLine(); } br.close(); }catch(IOException e) { e.printStackTrace(); } }}三、數(shù)據(jù)流
●DataInputStream 和 DataOutputStream 分別繼承自 InputStream 和 OutputStream ,它屬于處理流,需要分別“套接”在 InputStream 和 OutputStream 類型的節(jié)點(diǎn)流上。
●DataInputStream 和 DataOutputStream 提供了可以存取與機(jī)器無(wú)關(guān)的Java原始類型數(shù)據(jù)(如:int, double等)的方法。
●DataInputStream 和 DataOutputStream 的構(gòu)造方法為:
DataInputStream (InputStream in)
DataOutputStream (OutputStream out)
例3:TestDataStream
import java.io.*;public class TestDataStream { public static void main(String[] args) { ByteArrayOutputStream baos = new ByteArrayOutputStream();//第一步在內(nèi)存中分配了一個(gè)字節(jié)數(shù)組,第二步把管道插上去 DataOutputStream dos = new DataOutputStream(baos);// try { dos.writeDouble(Math.random()); dos.writeBoolean(true); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); System.out.println(bais.available()); DataInputStream dis = new DataInputStream(bais); System.out.println(dis.readDouble()); System.out.println(dis.readBoolean()); dos.close(); dis.close(); }catch(IOException e) { e.printStackTrace(); } }}注:隊(duì)列。先進(jìn)先出,先寫的先讀
四、Print 流
●PrintWriter 和 PrintStream 都屬于輸出流,分別針對(duì)字符和字節(jié)。
●PrintWriter 和 PrintStream 提供了重載的 Print 方法
●Println 方法用于多種數(shù)據(jù)類型的輸出。
●PrintWriter 和 PrintStream 的輸出操作不會(huì)拋出異常,用戶通過(guò)檢測(cè)錯(cuò)誤狀態(tài)獲取錯(cuò)誤信息。
●PrintWriter 和 PrintStream 有自動(dòng) flush 功能
例1:TestPrintStream1.java
import java.io.*;public class TestPrintStream1 { public static void main(String[] args) { PrintStream ps = null; try { FileOutputStream fos = new FileOutputStream("C://Users//Administrator//Desktop//log.dat"); ps = new PrintStream(fos); }catch(IOException e){ e.printStackTrace(); } if(ps != null) { System.setOut(ps); } int ln = 0; for(char c = 0; c <= 60000; c++) { System.out.print(c+" "); ln++; if(ln >=100) { System.out.println(); ln = 0; } } }}例2:TestPrintStream2.java
import java.io.*;public class TestPrintStream2 { public static void main(String[] args) { String filename = args[0]; if(filename!=null) { list(filename,System.out);//System.out是PrintStream類型 } } public static void list(String f,PrintStream fs) { try{ BufferedReader br = new BufferedReader(new FileReader(f)); String s = null; while((s=br.readLine()) != null) { fs.println(s); } br.close(); }catch(IOException e){ fs.println("無(wú)法讀取文件"); } }}例3:TestPrintStream3.java
import java.util.*;import java.io.*;public class TestPrintStream3 { public static void main(String[] args) { String s = null; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { FileWriter fw = new FileWriter("C://Users//Administrator//Desktop//logfile.log",true); PrintWriter log = new PrintWriter(fw); while( (s=br.readLine()) != null ) { if(s.equalsIgnoreCase("exit")) { break; } System.out.println(s.toUpperCase()); log.println("_____"); log.println(s.toUpperCase()); log.flush(); } log.println("==="+new Date()+"==="); log.flush(); log.close(); }catch(IOException e) { e.printStackTrace(); } }}五、Object 流
?直接將Object 寫入或讀出
●transient 關(guān)鍵字
transient修飾的成員變量在序列化的時(shí)候不予考慮
●serializable接口
標(biāo)記性接口。想把某個(gè)對(duì)象序列化,必須實(shí)現(xiàn)這個(gè)接口,打上標(biāo)記。
●externalizable 接口
一個(gè)serializable的子接口,可以控制序列化的過(guò)程。有兩個(gè)方法:readExternal(ObjectInput in) 和 writeExternal(ObejectOutput out)
例1:TestObjectIO.java
import java.io.*;public class TestObjectIO { public static void main(String[] args) { try{ T t = new T(); t.k = 8; FileOutputStream fos = new FileOutputStream("C://Users//Administrator//Desktop//testobjectio.dat"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(t); oos.flush(); oos.close(); FileInputStream fis = new FileInputStream("C://Users//Administrator//Desktop//testobjectio.dat"); ObjectInputStream ois = new ObjectInputStream(fis); T tReaded = (T)ois.readObject(); System.out.println(tReaded.i + " "+tReaded.j + " "+tReaded.d+" "+tReaded.k); }catch(IOException e){ e.printStackTrace(); }catch(ClassNotFoundException e1){ e1.printStackTrace(); } }}class T implements Serializable { int i = 0; int j = 9; double d = 2.3; int k = 15;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注