java io流读写文件换行_java基础io流——OutputStream和InputStream的故事(温故知新)...
io流概述:
IO流用來處理設備之間的數據傳輸,上傳文件和下載文件,Java對數據的操作是通過流的方式,Java用于操作流的對象都在IO包中。
IO流分類
按照數據流向
輸入流 讀入數據
輸出流 寫出數據
按照數據類型
字節流
字符流
什么情況下使用哪種流呢?
如果數據所在的文件通過windows自帶的記事本打開并能讀懂里面的內容,就用字符流,其他用字節流。
如果你什么都不知道,就用字節流。
IO流常用基類
字節流的抽象基類:
InputStream ,OutputStream。
字符流的抽象基類:
Reader , Writer。
注:
由這四個類派生出來的子類名稱都是以其父類名作為子類名的后綴。
如:InputStream的子類FileInputStream。
如:Reader的子類FileReader。
OutputStream的子類FileOutputStream
構造方法:
FileOutputStream(File file)
FileOutputStream(String name)
推薦第二種構造方法:FileOutputStream?outputStream?=?new?FileOutputStream("a.txt");
創建字節輸出流對象了做了幾件事情:A:調用系統功能去創建文件
B:創建outputStream對象
C:把foutputStream對象指向這個文件
通過字節輸出流寫出數據到文本public?void?write(int?b)public?void?write(byte[]?b)public?void?write(byte[]?b,int?off,int?len)
從方法中可看出,只能通過字節寫出outputStream.write("hello".getBytes());?文本中出現hello
outputStream.write(96)??//文本中出現?abyte[]?bys={97,98,99,100,101};
outputStream.write(bys,1,3);?文本中出現bcd
如此寫出,文本中數據不會換行,不會追加,每次寫出都是覆蓋原來。
追加:FileOutputStream?outputStream?=?new?FileOutputStream("a.txt",true);//第二個參數true設置為可追加。
換行 \n\r :for?(int?i?=?0;?i?<5?;?i++)?{
outputStream.write("hello".getBytes());
outputStream.write("\n\r".getBytes());
}
注:用完流一定要記得關閉。outputStream.close();
完整示例:package?io2;import?java.io.FileOutputStream;import?java.io.IOException;/**
*?new?FileOutputStream("a.txt",true);??第二個參數true,設置為寫入的數據拼接在尾部
*?\n\r?換行
*?write(bys,1,3);??寫入字節數組
*/public?class?out?{????public?static?void?main(String?args[]){
FileOutputStream?outputStream?=?null;????????try?{????????????//FileOutputStream?fos?=?new?FileOutputStream(file);
outputStream?=?new?FileOutputStream("a.txt",true);????????????/*
*?創建字節輸出流對象了做了幾件事情:
*?A:調用系統功能去創建文件
*?B:創建outputStream對象
*?C:把foutputStream對象指向這個文件
*///????????????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的構造方法FileInputStream(File?file)
FileInputStream(String?name)
推薦第二種構造方法:FileInputStream?inputStream?=?new?FileInputStream("a.txt");
把剛才寫的數據現在讀取到控制臺:public?int?read()public?int?read(byte[]?b)
第一個read是讀一個字節,第二個read是讀一個字節數組。//讀一個字節int?by?=?0;while?((by=inputStream.read())!=-1){
System.out.println((char)by);
}
讀到沒數據了就返回-1,這個用來判斷是否讀完。//讀一個字節數組,一般是1024大小int?len?=?0?;byte[]?bys?=?new?byte[1024];while?((len?=?inputStream.read(bys))?!=?-1)?{
System.out.println(new?String(bys,0,len));
}
兩個read的返回值略有不同,read()返回讀取的字節,讀到末尾返回-1,read(byte[] b)返回的是讀到的字節個數,讀到的字節放在了bytes字節數組里,讀到末尾沒數據了返回-1。
兩種讀取方式圖解:
image
同樣的用完了流,也要及時的關閉,以防占用內存。inputStream.close();
完整示例:
建議以字節數組的方式讀取數據。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();
}
}
}
}
字節流復制文件
利用輸入流讀取一個文件里的字節,再利用輸出流將讀取到的字節寫出到另一個文件中(不存在會自動創建)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
總結
以上是生活随笔為你收集整理的java io流读写文件换行_java基础io流——OutputStream和InputStream的故事(温故知新)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中抽象类 接口_java中的抽象
- 下一篇: java的默认_java默认包的使用