流是一組有序的數據序列,可分爲輸入流和輸出流兩種。I/O流提供了一條通道程序,可使用這條通道把源中的字節序列送到目的地。不只可使用在文件上,也能夠用於鍵盤、鼠標、顯示器等。java
輸入流
文件--->數據流--->目的地數組
輸出流
源-->數據流--->文件緩存
Java定義了許多類專門複雜各類方式的輸入/輸出。這些類都放在java.io包中。其中,輸入流類都是抽象類InputStream(字節輸入流)或抽象類Reader(字符輸入流)的子類;而全部輸出流都是OutputStream(字節輸出流)或抽象類Writer(字符輸出流)的子類。性能優化
InputStream類是字節輸入流的抽象類,是全部字節輸入流的父類。InputStream類的具體層次結構。性能
該類中全部方法遇到錯誤時都會觸發IOException異常。優化
Java中的字符時Unicode編碼,是雙字節的。InputStream是用來處理字節的,並不適合處理字符文本。Java爲字符文本的輸入提供了一套單獨的類Reader。編碼
OutputStream類是字節輸出流的抽象類。.net
OutputStream類中的全部方法均返回void,遇到錯誤時都會觸發IOException異常。code
Writer類是字符輸出流的抽象類,全部字符輸出類的實現都是它的子類。對象
File類是java.io包中惟一表明磁盤文件自己的對象。File類定義了一些與平臺物館的方法來操做文件,能夠實現建立、刪除、重命名文件等操做。File類的對象主要用來獲取文件自己的一些信息,如所在目錄,文件的長度,以及文件讀寫權限等。
使用File類建立一個文件對象,一般使用如下3種構造方法來建立文件對象。
// 1.File(String pathName) New File(String pathName) File file = new File("D:\\a.txt"); // 2.File(String parent, String child) // 該構造方法根據定義的父路徑和子路徑字符串建立一個新的File對象。 new File(String parent, String child); String parent = "D:/doc"; String child = "letter.txt"; // 3.File(File f,String child) // 該構造方法根據parent抽象路徑名和子路徑字符串建立一個新的File實例 String f = "D:/doc/"; String child = "letter.txt";
public static class { public static void main(String[] args) { File file = new File("test.txt"); if(file.exits()) { file.delete(); }else{ try{ file.createNewFile(); }catch(Exception e){ e.printStackTrace(); } } } }
兩個類都是用來操做磁盤文件的,該類繼承自InputStream,提供了基本的文件寫入能力。
FileInputStream類經常使用構造方法
- FileInputStream(String name);
- FileInputStream(File file); 該方法容許把文件鏈接輸入流以前對文件作進一步操做。
public static class { public static void main(String[] args) { File file = new File("test.txt"); try{ // 建立FileOutputStream對象 FileOutputStream out = new FileOutputStream(File); byte byt[] = "兩個類都是用來操做磁盤文件的,該類繼承自InputStream,提供了基本的文件寫入能力。".getBytes(); out.write(byt); out.close(); }catch(Exception e){ e.printStackTrace(); } try{ FileInputStream in = new FileInputStream(file); byte byt[] = new byte[1024]; int len = in.read(byt); // 將文件信息輸出,可是這個輸出new String有問題 System.out.println(new String(byt,0,len)); in.close() }catch(Exception e){ e.printStackTrace(); } } }
漢字採起上面的字節流讀入會產生亂碼的問題,因此使用字符流的FileReader和FileWriter類,便可避免該現象。
緩存是I/O的一種性能優化,緩存流爲I/O流增長了內存緩衝區,有了緩存,使得在流上執行skip(),mark(),和reset()方法成爲可能。
BufferedInputStream構造方法
第一種形式的構造方法建立了一個帶有32字節的緩存流;第二個按照指定的大小來建立最優的緩存區大小。
BufferedOutputStream構造方法
以上分別繼承了Reader和Writer類
BufferedReader類的經常使用方法
方法 | 描述 |
---|---|
read() | 讀取單個字符 |
readLine() | 讀取一個文本行,並將其返回爲一個字符串。若無數據,則返回null。 |
BufferedWriter經常使用方法
方法 | 描述 |
---|---|
write(String s,int off,int len) | 寫入字符串的某一部分 |
flush() | 刷新該流的緩存 |
newLine() | 寫入一個行分割符 |
在使用BufferedWriter類的Write()方法時,數據並無馬上被寫入值輸出流,而是首先進入緩存去中。若是想馬上將緩存區中的數據寫入輸出流,必定要調用flush()方法。
字符數據--> BufferedWriter--> OutputStreamWriter-->OutputStream --> 文件
package simple.java; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import sun.net.www.content.text.plain; public class FileTest { public static void main(String[] args) throws IOException { String[] array = {"取等","學家儘快","斷努力"}; File f = new File("C:\\pox.txt"); try{ FileWriter fileWriter = new FileWriter(f); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); for (int i=0;i<array.length;i++){ bufferedWriter.write(array[i]); bufferedWriter.newLine(); } bufferedWriter.close(); fileWriter.close(); }catch(Exception e){ e.printStackTrace(); } try{ FileReader fileReader = new FileReader(f); BufferedReader bufferedReader = new BufferedReader(fileReader); String s = null; int i = 0; // s=bufferedReader.readLine()很重要,不然會顯示不全,還不知道爲啥。 while((s=bufferedReader.readLine())!= null) { i++; System.out.println("第"+i+"行:"+s); } bufferedReader.close(); fileReader.close(); }