字符流:
成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設、網(wǎng)站設計、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務射陽,10年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18982081108
以Reader和Writer結尾的都是字符流,每次處理兩個Unicode字節(jié),Reader是輸入流,Writer是輸出流。常見的有FileReader,F(xiàn)ileWriter;BufferReader,BufferWriter等,查看jdkapi文檔就知道了。
字節(jié)流:
以OutputStream和InputStream結尾的流都是字節(jié)流,每次只能處理一個字節(jié),在使用時常常在字節(jié)流上套上字符流或緩沖流或轉換流等來方便對數(shù)據(jù)的處理。
首先,學習字符流這個知識的時候,你要明確一點:reader()這個方法是一個阻塞式的方法,關于阻塞式的方法這里就不詳細介紹了、所以當循環(huán)開始的時候,int c 從文件中拿是一個一個字節(jié)的拿,
其次,你要搞清楚字節(jié)與字符的含義:在ASCII碼中,一個英文字母(不分大小寫)占一個字節(jié)的空間,一個中文漢字占兩個字節(jié)的空間,
你可能受到了FileReader、FileInputStream之間傳輸?shù)淖止?jié)數(shù)不同的影響。
理論上是那樣的,但是在計算機中的存儲結構還是要考慮實際的編碼的因素;
希望對你有幫助哦,,
祝你好運
FileInputSream類
FileInputStream(String name)
FileInputStream(File file)
第一個構造方法是用給定的文件名name創(chuàng)建一個FileInputStream對象
第二個方法使用File對象創(chuàng)建FileInputStream對象
使用文件輸入流讀取文件
例如
FileInputStream istream=new FileInputStream(“myfile.dat”);
或
File f=new File(“myfile.dat”);
FileInputStream istream =new FileInputStream(f);
處理IO異常
Try{
FileInputStream istream=new FileInputStream(“myfile.dat”);
}
Catch(IOException e){}
從輸入流中讀取字節(jié)
Int read();從輸入流中順序讀取源中的單個字節(jié)數(shù)據(jù),返回字節(jié)值(0~255之間的一個整數(shù)),如果到達源的末尾,則返回-1
Read方法還可以吧多個字節(jié)讀入到字節(jié)數(shù)組中:
Int read(byte b[]);
Int read(byte b[],int off,int len);
關閉流
使用close();
FileOutputStream類
該類提供了基本的文件寫入能力,除了從OutputStream類繼承來的方法外,F(xiàn)ileOutputStream類還提供了兩個構造方法:
FileOutputStream(String name)
FileOutputStream(File file)
第一個構造方法,給指定的文件名name創(chuàng)建一個FileOutputStreak對象
第二個構造方法,使用File對象創(chuàng)建FileOutputStream對象
可以使用write()方法把字節(jié)寫入到輸出流到達目的地
Write的格式:
Public void write(byte b[]) 其功能就是把b.length個字節(jié)到輸出流
Public void write(byte b[],int off,int len)給定字節(jié)數(shù)組中,偏移off處寫入len個字節(jié)到輸出流
FileOutputStream流順序的寫文件,只要不關閉流,每次調用write方法就順序地向輸出流寫入內容,直到流被關閉。
以上代碼見hyh.io--File/Fileinputstream/Fileoutputsream
以上輸入輸出流容易出現(xiàn)的問題就是:漢字亂碼
FileReader類和FileWriter類
與FileInputStream和FileOutputStream字節(jié)流相對應的是FileReader和FileWriter字符流,其分別是Reader和Writer的子類,構造方法如下:
FileReader(String filename)
FileWriter(String filename)
使用字節(jié)讀取文件時,字節(jié)流不能直接操作Unicode字符,所以Java提供字符流。由于漢字在文件中占用了兩個字節(jié),如果使用字節(jié)流,讀取不當會出現(xiàn)亂碼現(xiàn)象,采用字符流就可以避免這個現(xiàn)象,因為在Unicode字符中,一個漢字被看做一個字符。
如果需要每次讀取一行數(shù)據(jù),F(xiàn)ileReader類沒有提供這樣的方法,所以必須把這個流再接到另外一個流傷,從后面的流中讀取一行數(shù)據(jù)。Java為其命名為BufferedReader類,構造方法:
BufferedReader(Reader in)
BufferedReader流能夠讀取文本行,方法是readLine()
通過向BufferedReader傳遞一個Reader對象,來創(chuàng)建一個BufferedReader對象,
FileReader inone=new FileReader(“Student.txt”);
BufferedReader intwo=BufferedReader(inone);
類似的可以將BufferedWriter流和FileWriter流連接在一起,然后使用BufferedWriter流將數(shù)據(jù)寫到目的地,
FileWriter tofile=new FileWriter(”hello.txt”);
BufferedWriter out=BufferedWriter(tofile)
然后out使用BufferedReader類的方法:
Write(String s,int off,int len)把字符串s寫入到文件中,off是s開始處的偏移量,len是寫入的字符數(shù)量
代碼詳情見hyh.javaio.FileReaderandWriter
代碼總結:FileReader和FileWriter可以進行漢字的讀取和寫入
BufferedReader有讀取行的功能,readLine()
RandomAccessFile類
RandomAccessFile類創(chuàng)建的流指向既可以作為源也可以作為目的地。換句話說,當想對一個文件進行讀寫操作時,可以創(chuàng)建一個指向該文件的RandomAccessFile流
構造方法:
RandomAccessFile(String name,String mode)參數(shù)name用來確定一個文件名,給出流的源。參數(shù)mode取r或者rw(只讀或者讀寫),決定對文件的訪問權限。
RandomAccessFile(File file,String mode)參數(shù)file是一個File對象,給出源,同時也是目的地。參數(shù)mode決定訪問權限。
該類中有一個seek(long a)方法,用來定位RandomAccessFile流的讀寫位置。參數(shù)a確定讀寫位置距離文件開頭的字節(jié)個數(shù)。
還可以調用getFilePointer()方法或者流當前的讀寫位置
類方法P280:
關閉文件
獲取讀寫位置等。。。。。。。。
使用RandomAccessFile流實現(xiàn)一個通訊錄的錄入與顯示系統(tǒng)
見RandomAccessFile
數(shù)據(jù)流P284
數(shù)組流P286
對象流P288
序列化與對象克隆P290
文件鎖FileLockP293
Process類中的流P295
帶進度條的輸入流P298(這個是我自己整理的一部分的學習筆記,教材為Java2實用教程第三版(耿祥義編著),因為使用了word進行整理,首字母大寫忘記取消和一些代碼在myeclipse上,但是不妨礙你查看)
import?java.io.File;
import?java.io.FileInputStream;
import?java.io.FileNotFoundException;
import?java.io.FileOutputStream;
import?java.io.IOException;
import?java.io.InputStreamReader;
import?java.io.OutputStreamWriter;
public?class?InputStreamReaderTest
{
public?static?void?main(String[]?args)
{
try
{
File?file=new?File("F:\\io\\abc.txt");
FileOutputStream?fos=new?FileOutputStream(file);
OutputStreamWriter?osw=new?OutputStreamWriter(fos);
osw.write('大');
osw.write('家');
osw.write('好');
osw.close();
FileInputStream?fis=new?FileInputStream(file);
InputStreamReader?isr=new?InputStreamReader(fis);
System.out.println((char)isr.read());
System.out.println((char)isr.read());
System.out.println((char)isr.read());
isr.close();
}
catch?(FileNotFoundException?e)
{
System.out.println("操作的文件不存在");
}
catch(IOException?e)
{
System.out.println("發(fā)生IO操作異常");
}
}
}