字節(jié)流
字節(jié)流主要是操作byte類型數(shù)據(jù)饭耳,以byte數(shù)組為準(zhǔn),主要操作類就是OutputStream、InputStream
字節(jié)輸出流:OutputStream
OutputStream是整個(gè)IO包中字節(jié)輸出流的最大父類,此類的定義如下:
public?abstract?class?OutputStream?extends?Object?implements?Closeable,Flushable
從以上的定義可以發(fā)現(xiàn)蹦锋,此類是一個(gè)抽象類,如果想要使用此類的話欧芽,則首先必須通過子類實(shí)例化對(duì)象,那么如果現(xiàn)在要操作的是一個(gè)文件葛圃,則可以使用:FileOutputStream類千扔。通過向上轉(zhuǎn)型之后,可以為OutputStream實(shí)例化
Closeable表示可以關(guān)閉的操作库正,因?yàn)槌绦蜻\(yùn)行到最后肯定要關(guān)閉
Flushable:表示刷新曲楚,清空內(nèi)存中的數(shù)據(jù)
FileOutputStream類的構(gòu)造方法如下:
public?FileOutputStream(File?file)throws?FileNotFoundException
寫數(shù)據(jù):
1importjava.io.File;
2importjava.io.FileOutputStream;
3importjava.io.IOException;
4importjava.io.OutputStream;
5
6publicclassTest11?{
7publicstaticvoidmain(String[]?args)throwsIOException?{
8File?f?=newFile("d:"?+?File.separator+"test.txt");
9OutputStream?out=newFileOutputStream(f);//如果文件不存在會(huì)自動(dòng)創(chuàng)建
10String?str="Hello?World";
11byte[]?b=str.getBytes();
12out.write(b);//因?yàn)槭亲止?jié)流,所以要轉(zhuǎn)化成字節(jié)數(shù)組進(jìn)行輸出
13out.close();
14}
15}
也可以一個(gè)字節(jié)一個(gè)字節(jié)進(jìn)行輸出褥符,如下:
1importjava.io.File;
2importjava.io.FileOutputStream;
3importjava.io.IOException;
4importjava.io.OutputStream;
5
6publicclassTest11?{
7publicstaticvoidmain(String[]?args)throwsIOException?{
8File?f?=newFile("d:"?+?File.separator+"test.txt");
9OutputStream?out=newFileOutputStream(f);//如果文件不存在會(huì)自動(dòng)創(chuàng)建
10String?str="Hello?World";
11byte[]?b=str.getBytes();
12for(inti=0;i
13out.write(b[i]);
14}
15out.close();
16}
17}
以上輸出只會(huì)進(jìn)行覆蓋龙誊,如果要追加的話,請(qǐng)看FileOutputStream類的另一個(gè)構(gòu)造方法:
public?FileOutputStream(File?file,boolean?append)throws?FileNotFoundException
在構(gòu)造方法中喷楣,如果將append的值設(shè)置為true趟大,則表示在文件的末尾追加內(nèi)容。
1importjava.io.File;
2importjava.io.FileOutputStream;
3importjava.io.IOException;
4importjava.io.OutputStream;
5
6publicclassTest11?{
7publicstaticvoidmain(String[]?args)throwsIOException?{
8File?f?=newFile("d:"?+?File.separator+"test.txt");
9OutputStream?out=newFileOutputStream(f,true);//追加內(nèi)容
10String?str="\r\nHello?World";
11byte[]?b=str.getBytes();
12for(inti=0;i
13out.write(b[i]);
14}
15out.close();
16}
17}
文件中換行為:\r\n
字節(jié)輸入流:InputStream
既然程序可以向文件中寫入內(nèi)容铣焊,則就可以通過InputStream從文件中把內(nèi)容讀取進(jìn)來逊朽,首先來看InputStream類的定義:
public?abstract?class?InputStream?extends?Object?implements?Closeable
與OutputStream類一樣,InputStream本身也是一個(gè)抽象類曲伊,必須依靠其子類叽讳,如果現(xiàn)在是從文件中讀取,就用FileInputStream來實(shí)現(xiàn)坟募。
觀察FileInputStream類的構(gòu)造方法:
public?FileInputStream(File?file)throws?FileNotFoundException
讀文件:
1importjava.io.File;
2importjava.io.FileInputStream;
3importjava.io.IOException;
4importjava.io.InputStream;
5
6publicclassTest12?{
7publicstaticvoidmain(String[]?args)throwsIOException?{
8File?f?=newFile("d:"?+?File.separator+"test.txt");
9InputStream?in=newFileInputStream(f);
10byte[]?b=newbyte[1024];
11intlen=in.read(b);
12in.close();
13System.out.println(newString(b,0,len));
14}
15}
但以上方法是有問題的岛蚤,用不用開辟這么大的一個(gè)字節(jié)數(shù)組,明顯是浪費(fèi)嘛懈糯,我們可以根據(jù)文件的大小來定義字節(jié)數(shù)組的大小涤妒,F(xiàn)ile類中的方法:public?long?length()
1importjava.io.File;
2importjava.io.FileInputStream;
3importjava.io.IOException;
4importjava.io.InputStream;
5
6publicclassTest13?{
7publicstaticvoidmain(String[]?args)throwsIOException?{
8File?f?=newFile("d:"?+?File.separator+"test.txt");
9InputStream?in=newFileInputStream(f);
10byte[]?b=newbyte[(int)?f.length()];
11in.read(b);
12in.close();
13System.out.println(newString(b));
14}
15}
我們換種方式,一個(gè)字節(jié)一個(gè)字節(jié)讀入~
1importjava.io.File;
2importjava.io.FileInputStream;
3importjava.io.IOException;
4importjava.io.InputStream;
5
6publicclassTest14?{
7publicstaticvoidmain(String[]?args)throwsIOException?{
8File?f?=newFile("d:"?+?File.separator+"test.txt");
9InputStream?in=newFileInputStream(f);
10byte[]?b=newbyte[(int)?f.length()];
11for(inti=0;i
12b[i]=(byte)?in.read();
13}
14in.close();
15System.out.println(newString(b));
16}
17}
但以上情況只適合知道輸入文件的大小昂利,不知道的話用如下方法:
1importjava.io.File;
2importjava.io.FileInputStream;
3importjava.io.IOException;
4importjava.io.InputStream;
5
6publicclassTest15?{
7publicstaticvoidmain(String[]?args)throwsIOException?{
8File?f?=newFile("d:"?+?File.separator+"test.txt");
9InputStream?in=newFileInputStream(f);
10byte[]?b=newbyte[1024];
11inttemp=0;
12intlen=0;
13while((temp=in.read())!=-1){//-1為文件讀完的標(biāo)志
14b[len]=(byte)?temp;
15len++;
16}
17in.close();
18System.out.println(newString(b,0,len));
19}
20}
字符流
在程序中一個(gè)字符等于兩個(gè)字節(jié)届腐,那么java提供了Reader、Writer兩個(gè)專門操作字符流的類蜂奸。
字符輸出流:Writer
Writer本身是一個(gè)字符流的輸出類犁苏,此類的定義如下:
public?abstract?class?Writer?extends?Object?implements?Appendable,Closeable扩所,F(xiàn)lushable
此類本身也是一個(gè)抽象類围详,如果要使用此類,則肯定要使用其子類,此時(shí)如果是向文件中寫入內(nèi)容助赞,所以應(yīng)該使用FileWriter的子類买羞。
FileWriter類的構(gòu)造方法定義如下:
public?FileWriter(File?file)throws?IOException
字符流的操作比字節(jié)流操作好在一點(diǎn),就是可以直接輸出字符串了雹食,不用再像之前那樣進(jìn)行轉(zhuǎn)換操作了畜普。
寫文件:
1importjava.io.File;
2importjava.io.FileWriter;
3importjava.io.IOException;
4importjava.io.Writer;
5
6publicclassTest16?{
7publicstaticvoidmain(String[]?args)throwsIOException?{
8File?f?=newFile("d:"?+?File.separator+"test.txt");
9Writer?out=newFileWriter(f);
10String?str="Hello?World";
11out.write(str);
12out.close();
13}
14}
在默認(rèn)情況下再次輸出會(huì)覆蓋,追加的方法也是在構(gòu)造函數(shù)上加上追加標(biāo)記
1importjava.io.File;
2importjava.io.FileWriter;
3importjava.io.IOException;
4importjava.io.Writer;
5
6publicclassTest17?{
7publicstaticvoidmain(String[]?args)throwsIOException?{
8File?f?=newFile("d:"?+?File.separator+"test.txt");
9Writer?out=newFileWriter(f,true);//追加
10String?str="\r\nHello?World";
11out.write(str);
12out.close();
13}
14}
字符輸入流:Reader
Reader是使用字符的方式從文件中取出數(shù)據(jù)群叶,Reader類的定義如下:
public?abstract?class?Reader?extends?Objects?implements?Readable吃挑,Closeable
Reader本身也是抽象類,如果現(xiàn)在要從文件中讀取內(nèi)容街立,則可以直接使用FileReader子類舶衬。
FileReader的構(gòu)造方法定義如下:
public?FileReader(File?file)throws?FileNotFoundException
以字符數(shù)組的形式讀取出數(shù)據(jù):
1importjava.io.File;
2importjava.io.FileReader;
3importjava.io.IOException;
4importjava.io.Reader;
5
6publicclassTest18?{
7publicstaticvoidmain(String[]?args)throwsIOException?{
8File?f?=newFile("d:"?+?File.separator+"test.txt");
9Reader?input=newFileReader(f);
10char[]?c=newchar[1024];
11intlen=input.read(c);
12input.close();
13System.out.println(newString(c,0,len));
14}
15}
也可以用循環(huán)方式,判斷是否讀到底:
1importjava.io.File;
2importjava.io.FileReader;
3importjava.io.IOException;
4importjava.io.Reader;
5
6publicclassTest19?{
7publicstaticvoidmain(String[]?args)throwsIOException?{
8File?f?=newFile("d:"?+?File.separator+"test.txt");
9Reader?input=newFileReader(f);
10char[]?c=newchar[1024];
11inttemp=0;
12intlen=0;
13while((temp=input.read())!=-1){
14c[len]=(char)?temp;
15len++;
16}
17input.close();
18System.out.println(newString(c,0,len));
19}
20}
字節(jié)流與字符流的區(qū)別
字節(jié)流和字符流使用是非常相似的赎离,那么除了操作代碼的不同之外逛犹,還有哪些不同呢?
字節(jié)流在操作的時(shí)候本身是不會(huì)用到緩沖區(qū)(內(nèi)存)的梁剔,是與文件本身直接操作的虽画,而字符流在操作的時(shí)候是使用到緩沖區(qū)的
字節(jié)流在操作文件時(shí),即使不關(guān)閉資源(close方法)荣病,文件也能輸出狸捕,但是如果字符流不使用close方法的話,則不會(huì)輸出任何內(nèi)容众雷,說明字符流用的是緩沖區(qū)灸拍,并且可以使用flush方法強(qiáng)制進(jìn)行刷新緩沖區(qū),這時(shí)才能在不close的情況下輸出內(nèi)容