java io流读写文件换行_java基础io流——OutputStream和InputStream的故事(温故知新)...
io流概述:
IO流用來(lái)處理設(shè)備之間的數(shù)據(jù)傳輸,上傳文件和下載文件,Java對(duì)數(shù)據(jù)的操作是通過(guò)流的方式,Java用于操作流的對(duì)象都在IO包中。
IO流分類
按照數(shù)據(jù)流向
輸入流 讀入數(shù)據(jù)
輸出流 寫(xiě)出數(shù)據(jù)
按照數(shù)據(jù)類型
字節(jié)流
字符流
什么情況下使用哪種流呢?
如果數(shù)據(jù)所在的文件通過(guò)windows自帶的記事本打開(kāi)并能讀懂里面的內(nèi)容,就用字符流,其他用字節(jié)流。
如果你什么都不知道,就用字節(jié)流。
IO流常用基類
字節(jié)流的抽象基類:
InputStream ,OutputStream。
字符流的抽象基類:
Reader , Writer。
注:
由這四個(gè)類派生出來(lái)的子類名稱都是以其父類名作為子類名的后綴。
如:InputStream的子類FileInputStream。
如:Reader的子類FileReader。
OutputStream的子類FileOutputStream
構(gòu)造方法:
FileOutputStream(File file)
FileOutputStream(String name)
推薦第二種構(gòu)造方法:FileOutputStream?outputStream?=?new?FileOutputStream("a.txt");
創(chuàng)建字節(jié)輸出流對(duì)象了做了幾件事情:A:調(diào)用系統(tǒng)功能去創(chuàng)建文件
B:創(chuàng)建outputStream對(duì)象
C:把foutputStream對(duì)象指向這個(gè)文件
通過(guò)字節(jié)輸出流寫(xiě)出數(shù)據(jù)到文本public?void?write(int?b)public?void?write(byte[]?b)public?void?write(byte[]?b,int?off,int?len)
從方法中可看出,只能通過(guò)字節(jié)寫(xiě)出outputStream.write("hello".getBytes());?文本中出現(xiàn)hello
outputStream.write(96)??//文本中出現(xiàn)?abyte[]?bys={97,98,99,100,101};
outputStream.write(bys,1,3);?文本中出現(xiàn)bcd
如此寫(xiě)出,文本中數(shù)據(jù)不會(huì)換行,不會(huì)追加,每次寫(xiě)出都是覆蓋原來(lái)。
追加:FileOutputStream?outputStream?=?new?FileOutputStream("a.txt",true);//第二個(gè)參數(shù)true設(shè)置為可追加。
換行 \n\r :for?(int?i?=?0;?i?<5?;?i++)?{
outputStream.write("hello".getBytes());
outputStream.write("\n\r".getBytes());
}
注:用完流一定要記得關(guān)閉。outputStream.close();
完整示例:package?io2;import?java.io.FileOutputStream;import?java.io.IOException;/**
*?new?FileOutputStream("a.txt",true);??第二個(gè)參數(shù)true,設(shè)置為寫(xiě)入的數(shù)據(jù)拼接在尾部
*?\n\r?換行
*?write(bys,1,3);??寫(xiě)入字節(jié)數(shù)組
*/public?class?out?{????public?static?void?main(String?args[]){
FileOutputStream?outputStream?=?null;????????try?{????????????//FileOutputStream?fos?=?new?FileOutputStream(file);
outputStream?=?new?FileOutputStream("a.txt",true);????????????/*
*?創(chuàng)建字節(jié)輸出流對(duì)象了做了幾件事情:
*?A:調(diào)用系統(tǒng)功能去創(chuàng)建文件
*?B:創(chuàng)建outputStream對(duì)象
*?C:把foutputStream對(duì)象指向這個(gè)文件
*///????????????for?(int?i?=?0;?i?<5?;?i++)?{//????????????????outputStream.write("hello".getBytes());//????????????????outputStream.write("\n\r".getBytes());//????????????}
byte[]?bys={97,98,99,100,101};
outputStream.write(bys,1,3);
}?catch?(IOException?e)?{
e.printStackTrace();
}????????finally?{????????????try?{
outputStream.close();
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}
}
InputStream的子類FileInputStream
FileInputStream的構(gòu)造方法FileInputStream(File?file)
FileInputStream(String?name)
推薦第二種構(gòu)造方法:FileInputStream?inputStream?=?new?FileInputStream("a.txt");
把剛才寫(xiě)的數(shù)據(jù)現(xiàn)在讀取到控制臺(tái):public?int?read()public?int?read(byte[]?b)
第一個(gè)read是讀一個(gè)字節(jié),第二個(gè)read是讀一個(gè)字節(jié)數(shù)組。//讀一個(gè)字節(jié)int?by?=?0;while?((by=inputStream.read())!=-1){
System.out.println((char)by);
}
讀到?jīng)]數(shù)據(jù)了就返回-1,這個(gè)用來(lái)判斷是否讀完。//讀一個(gè)字節(jié)數(shù)組,一般是1024大小int?len?=?0?;byte[]?bys?=?new?byte[1024];while?((len?=?inputStream.read(bys))?!=?-1)?{
System.out.println(new?String(bys,0,len));
}
兩個(gè)read的返回值略有不同,read()返回讀取的字節(jié),讀到末尾返回-1,read(byte[] b)返回的是讀到的字節(jié)個(gè)數(shù),讀到的字節(jié)放在了bytes字節(jié)數(shù)組里,讀到末尾沒(méi)數(shù)據(jù)了返回-1。
兩種讀取方式圖解:
image
同樣的用完了流,也要及時(shí)的關(guān)閉,以防占用內(nèi)存。inputStream.close();
完整示例:
建議以字節(jié)數(shù)組的方式讀取數(shù)據(jù)。package?io2;import?java.io.FileInputStream;import?java.io.FileNotFoundException;import?java.io.IOException;/**
*?Create?by?stefan
*?Date?on?2018-05-27??23:00
*?Convertion?over?Configuration!
*/public?class?input2?{????public?static?void?main(String?args[]){
FileInputStream?inputStream?=?null;????????try?{
inputStream?=?new?FileInputStream("a.txt");//????????????byte[]?bys?=?new?byte[4];//????????????int?len?=?inputStream.read(bys);//????????????System.out.println(new?String(bys));??//bcd//????????????System.out.println(len);??//3//????????????System.out.println(inputStream.read(bys));??//-1
int?len?=?0?;????????????byte[]?bys?=?new?byte[1024];????????????while?((len?=?inputStream.read(bys))?!=?-1)?{
System.out.println(new?String(bys,0,len));
}????????????/**
*????public?String(byte?bytes[])?{
this(bytes,?0,?bytes.length);
}
*/
}?catch?(IOException?e)?{
e.printStackTrace();
}finally?{????????????try?{
inputStream.close();
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}
}
字節(jié)流復(fù)制文件
利用輸入流讀取一個(gè)文件里的字節(jié),再利用輸出流將讀取到的字節(jié)寫(xiě)出到另一個(gè)文件中(不存在會(huì)自動(dòng)創(chuàng)建)package?io2;import?java.io.FileInputStream;import?java.io.FileNotFoundException;import?java.io.FileOutputStream;import?java.io.IOException;import?java.util.Arrays;/**
*?Create?by?stefan
*?Date?on?2018-05-27??23:19
*?Convertion?over?Configuration!
*/public?class?copy?{????public?static?void?main(String?args[])?throws?IOException?{
FileInputStream?inputStream?=?new?FileInputStream("E:\\huge1.jpg");
FileOutputStream?outputStream?=?new?FileOutputStream("E:\\古月.jpg");
byte[]?bytes?=?new?byte[1024];????????int?len?=?0;????????while?((len=inputStream.read(bytes))?!=?-1)?{
outputStream.write(bytes,0,len);
}
inputStream.close();
outputStream.close();
}
}
作者:韻呀
鏈接:https://www.jianshu.com/p/63d1751d3eac
總結(jié)
以上是生活随笔為你收集整理的java io流读写文件换行_java基础io流——OutputStream和InputStream的故事(温故知新)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java中抽象类 接口_java中的抽象
- 下一篇: java的默认_java默认包的使用