接着上節字節流繼續講下,IO流這塊的內容挺重要,文件存儲
注:本文轉載自coder-pig
原文連接:http://blog.csdn.net/coder_pig/article/details/45333613
本節引言:
上一節中,我們對於Java IO流中的一些基本字節流進行了學習,他們都是InputStream與
OutputStream的子類;本節學習的字符流則是Reader與Writer的子類,好了,話不多說,
開始本節內容!
本節正文:
1.Reader類與Writer類的相關方法:
PS:~小豬比較懶,所以就不一個個敲方法與解析了,直接截API的圖吧,大家可自行翻閱API文檔:
①Reader類的相關方法:
②Writer類的相關方法:
一些要搞清楚的東西:
1)二進制文件與文本文件的區別:
答:如果一個文件專用於存儲文本字符,而又沒有包含文本之外的字符,
就可稱之爲文本文件。除此之外的文件就是二進制文件!
2)InputStream,OutputStream和Reader,Writer的區別:
答:前者是處理字節流,後者是處理字符流;
前者主要用於操作二進制數據的內容,後者則用於操作文本數據的內容;
前者直接操作byte數組,後者在操作時還會進行Decode和Encode~
2.FileReader與FileWriter類的使用:
構造方法:
代碼示例:
這裏演示的代碼是:讀取文件裏的內容,以及完成簡單的文件複製
接下來就來寫代碼了,大家自己寫的時候記得進行異常捕獲哦~
①往文件寫入數據,讀取數據顯示:
- FileWriter fileWriter = new FileWriter("D:/one.txt");
- fileWriter.write("我是萌萌的Coder-pig~");
- fileWriter.close();
- //讀取文件中的內容:
- FileReader fileReader = new FileReader("D:/one.txt");
- //用戶緩衝的字符數組
- char[] cbuf = new char[1024];
- int len = fileReader.read(cbuf);
- System.out.println(new String(cbuf,0,len));
- fileReader.close();
- fileWriter.close();
運行截圖:
②文件複製的實現:
這裏有兩種,隨你選
方法1:
- FileReader fileReader = new FileReader("D:/one.txt");
- FileWriter fileWriter = new FileWriter("E:/one.txt");
- //複製文件的最簡單寫法
- char [] cbuf=new char[1024]; //字符數組
- int len=fileReader.read(cbuf);
- fileWriter.write(cbuf);
- fileReader.close();
- fileWriter.close();
方法2:
- FileReader fileReader = new FileReader("D:/one.txt");
- FileWriter fileWriter = new FileWriter("E:/one.txt");
- char []buf = new char[1024];
- int len = 0;
- //讀一個數組大小,寫一個數組大小方法。
- while((len = fileReader.read(buf)) != -1){
- fileWriter.write(buf, 0, len);
- }
- fileReader.close();
- fileWriter.close();
③要注意的地方:
使用FileWriter的時候要注意:
FileReader與FileWriter讀寫文件採取的是平臺默認編碼(視操作系統而定),比如中文的win爲gbk,
英文的win爲iso,當要寫入的文本文件編碼和平臺默認編碼不一致時,就會出現中文亂碼的情況。
這時可用OutputStreamWriter來讀取。這個下面會講,莫急~
3.CharArrayReader與CharArrayWriter類:
前面我們學過了CharArrayInputStream與CharArrayOutputStream類,其實是類似的,只不過這個
是字符,前面兩個是字節的而已,同樣他有個toCharArray( )的方法!其實也沒什麼好講的,用的並不多,
而且還要藉助其他流..
這裏給大家寫個簡單的寫數據到文件的例子吧:
- CharArrayWriter f = new CharArrayWriter();
- String str = "才幾點,睡你麻痹,起來嗨~";
- char []buf1 = new char[str.length()];
- str.getChars(0, str.length(), buf1, 0);
- //寫入緩衝區
- f.write(buf1);
- char c[] = f.toCharArray();
- FileWriter f2 = new FileWriter("D:/test.txt");
- f.writeTo(f2);
- f2.close();
- }
運行後就能看到D盤生成一個test.txt文件了,感覺還不如直接用FileWriter
4.PipedReader與PipedWriter
這個和前面學的PipedInputStream與PipedWriter也是類似的,唯一的不同只是
byte[]變成了char[]而已!代碼相比之前只是改了一點點而已~
- import java.io.IOException;
- import java.io.PipedOutputStream;
- import java.io.PipedWriter;
- public class SendThread extends Thread{
- private PipedWriter out = new PipedWriter();
- public PipedWriter getOutputStream(){
- return out;
- }
- public void run(){
- String message = "我是PipedWriter寫入的東西" ;
- try {
- out.write(message.toCharArray());
- out.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- import java.io.IOException;
- import java.io.PipedInputStream;
- import java.io.PipedReader;
- public class ReceiverThread extends Thread {
- private PipedReader in = new PipedReader();
- public PipedReader getInputStream() {
- return in;
- }
- public void run() {
- char[] buf = new char[1024];
- try {
- int len = in.read(buf);
- //打印另外一個線程輸入的流
- System.out.println(new String(buf, 0, len));
- in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- import java.io.IOException;
- import java.io.PipedInputStream;
- import java.io.PipedOutputStream;
- import java.io.PipedReader;
- import java.io.PipedWriter;
- public class Test5 {
- public static void main(String[] args) {
- ReceiverThread rThread = new ReceiverThread();
- SendThread sThread = new SendThread();
- // 獲取對應流:
- PipedWriter out = sThread.getOutputStream();
- PipedReader in = rThread.getInputStream();
- try {
- // 管道鏈接
- out.connect(in);
- sThread.start();
- rThread.start();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
運行截圖:
5.InputStreamReader與InputStreamWriter
這兩個流是字節流與字符流進行轉換的流,但是有一點要注意,這兩個玩意竟然是:
FileReader與FileWriter的父類;
前者是Reader的子類,輸入字節流向字符流的橋樑;
後者是Writer的子類,輸出字符流向字節流的橋樑!
所以不管我們的操作如何,最後都是以字節的形式保存在文件中!!!
至於設置編碼,可以直接在構造方法中定義:
比如:
new InputStreamReader(new FileInputStream("d:\\books.txt"),"UTF-8");
好吧,寫個簡單例子:
- public static void main(String[] args) throws Exception {
- String filename1 = "D:/file.txt";
- String filename2 = "D:/副本-file.txt";
- InputStreamReader isr = new InputStreamReader(new FileInputStream(filename1),"GBK");
- OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filename2),"GBK");
- int ch = 0;
- while((ch = isr.read()) != -1)
- {
- System.out.print((char)ch);
- osw.write(ch);
- }
- System.out.println("\n文件複製完畢");
- isr.close();
- osw.close();
- }
最後說兩句:
好的,關於Java IO中的字節流就說到這裏,下一節我們要學習的是緩衝流,
最後回顧下本節內容:
①Reader類與Writer類的相關方法:
②2.FileReader與FileWriter類的使用:文件讀寫,但是他們是⑤的子類哦!
③CharArrayReader與CharArrayWriter類:字符數組類,用於緩衝的是字符數組;
④PipedReader與PipedWriter類:管道字符類,傳遞的是字符咯~
⑤InputStreamReader與InputStreamWriter:字符與字節的轉換流,是②的父類,所有文件都是以字節
流的形式存儲的哦,不管你是用FileInputStream,或者②⑤,結果都一樣~
ps:其實本節和Part 3的內容差不多,只是字節改成字符而已~