Java中的IO流 分類 根據流的方向:輸入流和輸出流 根據讀取文字的大小:位元組流和字元流(位元組按照位元組讀取,讀取中文容易亂碼,字元流按照字元讀取,通常用於讀取中文) 根據讀取的方式:節點流和緩存流 分類 根據流的方向:輸入流和輸出流 根據讀取文字的大小:位元組流和字元流(位元組按照位元組讀取,讀取中文容 ...
Java中的IO流
分類
- 根據流的方向:輸入流和輸出流
- 根據讀取文字的大小:位元組流和字元流
(位元組按照位元組讀取,讀取中文容易亂碼,字元流按照字元讀取,通常用於讀取中文) - 根據讀取的方式:節點流和緩存流
(一)位元組流
【基礎流】
FileInputStream
FileInputStream fis=new FileInputStream("F:\\test.txt"); // 可以傳入File對象
文件讀取方式
方式一
1 /** 2 * 按照位元組,一個個位元組讀取文件
3 */
4 int n=0;
5 StringBuffer sb=new StringBuffer();
6 while((n=fis.read())!=-1){
7 sb.append((char)n);
8 }
9 System.out.println(sb);
方式二
1 /**
2 * 文件<1024位元組,將byte數組直接聲明為輸入流的長度,一次性讀取所有文字
3 */
4 byte[] bytes=new byte[fis.available()];
5 StringBuffer sb=new StringBuffer();
6 fis.read(bytes);
7 sb.append(new String(bytes));
8 System.out.println(sb);
方式三
1 /** 2 *文件>1024位元組, 一次讀取1024個位元組 3 */ 4 StringBuffer sb=new StringBuffer(); 5 byte[] bytes=new byte[20]; 6 int n=0; 7 while((n=fis.read(bytes))!=-1){ 8 sb.append(new String(bytes)); 9 }
FileOutputStream
- FileOutputStream fos=new FileOutputStream("F:\\out.txt",true)
- 如果第二個參數省略或,或傳入false,則表示每次寫入時將原文件清空,從文件頭部開始寫入
- 如果第二個參數傳入true,每次寫入時,從原文件最後追加寫入
1 StringBuffer sb=new StringBuffer();
2 fos.write(sb.toString().getBytes());
3 System.out.println(sb);
close
- 輸入流關閉:fis.close();
- 輸出流關閉:fos.close();
【緩存流】
BufferedInputStream_BufferedOutputStream
- 在基本流的基礎上進行包裝,讀取或寫入文件時,將通過緩存進行即,先將內容寫到緩存區中,緩存區滿了以後,再進行讀取或寫入操作。
可大大減少文件的操作次數,提高寫入效率。稱之為IO鏈。1 BufferedInputStream bis=null; 2 bis=new BufferedInputStream(newFileInputStream("F:\\test.txt")); 3 BufferedOutputStream bos=null; 4 bos=new BufferedOutputStream(newFileOutputStream("F:\\out.txt",true));
- IO鏈關閉時,我們只需關閉最外層流,內層流將自動關閉
1 bis.close();
- BufferedOutputStream在關閉前通常調用flush()方法,將緩存區剩餘的內容刷新進行寫入或讀取操作。
1 bos.flush(); 2 bos.close();
【數據流】
DataInputStream_DataOutputStream
- Data系列流,也有read和write方法,操作與基本流相同。
- 採用二進位對文件進行讀寫操作,與基本流相比,可以直接讀寫Java中的基本數據類型。
1 String name="zhangsan"; 2 int age=23; 3 DataOutputStream dos=new DataOutputStream(new FileOutputStream("F:\\zhangsan.txt")); 4 5 //對基本數據進行寫入操作 6 dos.writeUTF(name); 7 dos.writeInt(age); 8 9 DataInputStream dis=new DataInputStream(new FileInputStream("F:\\zhangsan.txt")); 10 11 //對基本數據進行讀取操作 12 String uname=dis.readUTF(); 13 int uage=dis.readInt();
- 如果操作的文件是一個二進位文件,需要使用DataOutputStream替代FileOutputStream。
【對象流】
ObjectInputStream_ObjectOutputStream
- 與基本相同,可以直接使用read、write方法進行讀寫
- .與Data流相同,可以對Java基本數據類型進行直接讀寫,readInt(),writeInt()
- 可以只用readObject()和writeObject(),直接對對象進行操作。
Person user=new Person("zhangsan",23,178.5,"山東煙臺"); ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("F:\\user.txt")); oos.writeObject(user); ObjectInputStream ois=new ObjectInputStream(new FileInputStream("F:\\user.txt")); Person user1=(Person)ois.readObject();
【對象的序列化與反序列化】
- 對象的序列化:把對象的轉換成位元組序列永久地保存到硬碟上,通常存放在一個文件中;
- 對象的反序列化:位元組序列恢復為Java對象的過程。
- 如果:要將對象進行序列操作,那麼實體類必須實現可序化介面
1 class Person implements Serializable{}
- 當一個實體類實現可序化介面時,可以添加一個序列化版本號ID (警告提示,根據提示添加)
1 private static final long serialVersionUID = 1L;
(二)字元流
【基本流】
FileWriter_FileReader(不常用)
- 在處理數據單元時,以一個字元作為單位。
- 在讀寫文件時,只能使用系統預設編碼格式;無法指定編碼,如果文件格式與系統預設格式不一致,
那使用這兩個方法讀寫將造成中文亂碼。 - 讀寫方法也是read(),write(),用法與位元組流類似。
【位元組流轉字元流】
InputStreamReader_OutputStreamWriter
- 將位元組流轉為字元流,同時支持自定義讀寫的編碼格式;
InputStreamReader isr=null; isr=new InputStreamReader(new FileInputStream("F:\\oo.txt"),"UTF-8"); OutputStreamWriter osw=null; osw=new OutputStreamWriter(new FileOutputStream("F:\\text.txt"),"UTF-8");
- 常見編碼格式:
- ASCII:美國標準消息碼‘
- ISO08859-1:歐洲碼
- ANSI編碼:
- 簡體中文:GB2312 GBK
- 繁體中文:big-5
- Unicode編碼:國際標準碼。相容絕大部分國家的編碼格式。
UTF-6 UTF-8 UTF-16
【緩存流】
BufferedREader_BufferedWriter
- 作用與用法與位元組流相同
1 BufferedReader br=null; 2 3 br=new BufferedReader( 4 new InputStreamReader( 5 new FileInputStream("F:\\oo.txt"),"UTF-8")); 6 int n=-1; 7 while((n=br.read())!=-1){ 8 sb.append((char)n); 9 } 10 System.out.println(sb); 11 12 BufferedWriter bw=null; 13 bw=new BufferedWriter( 14 new OutputStreamWriter( 15 new FileOutputStream("F:\\oo.html"))); 16 String s=sb.toString()+"jijn看到福克斯";