生活随笔
收集整理的這篇文章主要介紹了
Java-字节流
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、IO流概述和分類
IO流概述:
- IO:輸入/輸出(Input/Output)
- 流:是一種抽象概念,對數據傳輸的總稱。也就是說數據在設備間的傳輸稱為流,流的本質是數據傳輸
- IO流就是用來處理設備間數據傳輸問題的
IO流分類:
- 按照數據的流向
- 按照數據類型來分
- 字節流:字節輸入流;字節輸出流
- 字符流:字符輸入流;字符輸出流
一般來說,IO流的分類是按照數據類型來分的
字節流和字符流使用:
- 如果數據通過Window自帶的記事本軟件打開,我們還可以讀懂里面的內容,就使用字符流,否則使用字節流。如果不知道該使用哪種類型的流,就使用字節流
2、字節流寫數據
字節流抽象基類
- InputStream:這個抽象類是表示字節輸入流的所有類的超類
- OutputStream:這個抽象類是表示字節輸入流的所有類的超類
- 子類名特點:子類名稱都是以其父類名作為子類名的后綴
FileOutputStream:文件輸出流用于將數據寫入File
- ?FileOutputStream?(String?name):創建文件輸出流以寫入具有指定名稱的文件。
使用字節輸出流寫數據的步驟:
- 創建字節輸出流對象(調用系統功能創建文件;創建字節輸出流對象;讓字節輸出流對象指向創建好的文件)
- 調用字節輸出流對象的寫數據方法
- 釋放資源(關閉此文件輸出流并釋放與此流相關聯的任何系統資源)
package ByteStream01;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;/*FileOutputStream:文件輸出流用于將數據寫入FileFileOutputStream(String name):創建文件輸出流以寫入具有指定名稱的文件。*/
public class FileOutputStream01 {public static void main(String[] args) throws IOException {//創建字節輸出流對象//FileOutputStream(String name):創建文件輸出流以寫入具有指定名稱的文件FileOutputStream fos=new FileOutputStream("D:\\Document\\Java\\myByteStream\\fos.txt");/*做三件事情:1、調用系統功能創建文件2、創建了字節輸出流對象3、讓字節輸出流對象指向創建好的文件*///void write (int b):將指定的字節寫入此文件輸出流fos.write(97);
// fos.write(57);
// fos.write(55);//最后都要釋放資源//void close():關閉此文件輸出流并釋放與此流關聯的所有系統資源。fos.close();}
}
3、字節流寫數據的3種方式:
| 方法名 | 說明 |
| void write(int b) | 將指定的字節寫入此文件輸出流,一次寫一個字節數據 |
| void write(byte[] b) | 將b.length字節從指定的字節數組寫入此文件輸出流,一次寫一個字節數組數據 |
| void write(byte[] b,int off,int len) | 將len字節從指定的字節數組開始,從偏移量off開始寫入此文件輸出流,一次寫一個字節數組的部分數據 |
package ByteStream01;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;/*構造方法:FileOutputStream(String name):創建文件輸出流以寫入具有指定名稱的文件。FileOutputStream(File File):創建文件輸出流以寫入由指定的File對象表示的文件。字節流寫數據的3種方式:void write(int b):將指定的字節寫入此文件輸出流,一次寫一個字節數據void write(byte[] b):將b.length字節從指定的字節數組寫入此文件輸出流,一次寫一個字節數組數據void write(byte[] b,int off,int len):將len字節從指定的字節數組開始,從偏移量off開始寫入此文件輸出流,一次寫一個字節數組的部分數據*/
public class FileOutputStream02 {public static void main(String[] args) throws IOException {//FileOutputStream(String name):創建文件輸出流以寫入具有指定名稱的文件。FileOutputStream fos = new FileOutputStream("D:\\Document\\Java\\myByteStream\\fos.txt");//new File(name)//FileOutputStream fos = new FileOutputStream(new File("D:\\Document\\Java\\myByteStream\\fos.txt"));//FileOutputStream(File File):創建文件輸出流以寫入由指定的File對象表示的文件。
// File file = new File("D:\\Document\\Java\\myByteStream\\fos.txt");
// FileOutputStream fos2 = new FileOutputStream(file);
// FileOutputStream fos2 = new FileOutputStream(new File("D:\\Document\\Java\\myByteStream\\fos.txt"));//void write(int b):將指定的字節寫入此文件輸出流,一次寫一個字節數據
// fos.write(97);
// fos.write(98);
// fos.write(99);
// fos.write(100);
// fos.write(101);//void write(byte[] b):將b.length字節從指定的字節數組寫入此文件輸出流,一次寫一個字節數組數據//byte[] bys = {97, 98, 99, 100, 101};//byte[] getBytes():返回字符串對應的字節數組byte[] bys = "abcde".getBytes();//fos.write(bys);//void write(byte[] b,int off,int len):將len字節從指定的字節數組開始,從偏移量off開始寫入此文件輸出流,一次寫一個字節數組的部分數據//fos.write(bys,0,bys.length);fos.write(bys,1,3);//釋放資源fos.close();}
}
4、字節流寫數據的兩個小問題:
?????? 1、字節流寫數據如何實現換行?
?????????? window:\r\n
?????????? linux:\n
?????????? mac:\r
?????? 2、字節流寫數據如何實現追加寫入?
?????????? public FileOutputStream(String name,boolean append)
???????????創建文件輸出流以寫入具有指定名稱的文件。如果第二個參數是true,則字節將寫入文件的末尾而不是開頭。
package ByteStream01;import java.io.FileOutputStream;
import java.io.IOException;/*字節流寫數據的兩個小問題:1、字節流寫數據如何實現換行?window:\r\nlinux:\nmac:\r2、字節流寫數據如何實現追加寫入?public FileOutputStream(String name,boolean append)創建文件輸出流以寫入具有指定名稱的文件。如果第二個參數是true,則字節將寫入文件的末尾而不是開頭。*/
public class FileOutputStream03 {public static void main(String[] args) throws IOException {//創建字節輸出流對象
// FileOutputStream fos = new FileOutputStream("D:\\Document\\Java\\myByteStream\\fos.txt");FileOutputStream fos = new FileOutputStream("D:\\Document\\Java\\myByteStream\\fos.txt",true);//寫數據for (int i = 0; i < 10; i++) {fos.write("hello".getBytes());fos.write("\n".getBytes());}//釋放資源fos.close();}
}
5、字節流寫數據加入異常處理
finally:在異常處理時提供finally塊來執行所有清除操作。比如說IO流中的釋放資源
特點:被finally控制的語句一定會執行,除非JVM退出
使用:
????????try{可能出現異常的代碼;}catch(異常類名 變量名){異常的處理代碼;}finally{執行所有清除操作;}
package ByteStream01;
/*字節流寫數據加異常處理finally:在異常處理時提供finally塊來執行所有清除操作。比如說IO流中的釋放資源特點:被finally控制的語句一定會執行,除非JVM退出使用:try{可能出現異常的代碼;}catch(異常類名 變量名){異常的處理代碼;}finally{執行所有清除操作;}*/import java.io.FileOutputStream;
import java.io.IOException;public class FileOutputStream04 {public static void main(String[] args) {
// try {
// FileOutputStream fos = new FileOutputStream("D:\\Document\\Java\\myByteStream\\fos.txt");
// fos.write("hello".getBytes());
// fos.close();
// } catch (IOException e) {
// e.printStackTrace();
// }//加入finally類來實現釋放資源FileOutputStream fos = null;try {fos = new FileOutputStream("D:\\Document\\Java\\myByteStream\\fos.txt");fos.write("hello".getBytes());} catch (IOException e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
}
6、字節流讀數據
一次讀一個字節數據
FileInputStream:從文件系統中的文件獲取輸入字節
- FileInputStream(String name):通過打開與實際文件的連接來創建一個FileInputStream,該文件由文件系統中的路徑名name命名
使用字節輸入流讀取數據的步驟:
創建字節輸入流對象調用字節輸入流對象的讀數據方法釋放資源
package ByteStream02;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;/*需求:把文件fos.txt中的內容讀取出來在控制臺輸出FileInputStream:從文件系統中的文件獲取輸入字節FileInputStream(String name):通過打開與實際文件的連接來創建一個FileInputStream,該文件由文件系統中的路徑名name命名使用字節輸入流讀取數據的步驟:創建字節輸入流對象調用字節輸入流對象的讀數據方法釋放資源*/
public class FileOutputStreamDemo01 {public static void main(String[] args) throws IOException {//創建字節輸入流對象//FileInputStream(String name)FileInputStream fis = new FileInputStream("D:\\Document\\Java\\myByteStream\\fos.txt");//調用字節輸入流對象的讀數據方法//int read():從該輸入流讀取一個字節的數據;如果達到文件的末尾,返回-1/*//第一次讀取數據int by = fis.read();System.out.println(by);System.out.println((char) by);//第二次讀取數據by = fis.read();System.out.println(by);System.out.println((char) by);*//*int by= fis.read();while(by!=-1){System.out.print((char) by);by= fis.read();}*///優化上面的程序int by;/*(by = fis.read()) != -1:fis.read():讀數據by = fis.read():把讀取到的數據賦值給byby != -1:判斷讀取到的數據是否是-1*/while ((by = fis.read()) != -1) {System.out.print((char) by);}//釋放資源fis.close();}
}
一次讀一個字節數組數據
需求:把文件fos.txt中的內容讀取出來在控制臺輸出
使用字節輸入流讀取數據的步驟:
創建字節輸入流對象調用字節輸入流對象的讀數據方法釋放資源
package ByteStream02;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;/*需求:把文件fos.txt中的內容讀取出來在控制臺輸出使用字節輸入流讀取數據的步驟:創建字節輸入流對象調用字節輸入流對象的讀數據方法釋放資源*/
public class FileOutputStreamDemo02 {public static void main(String[] args) throws IOException {//創建字節輸入流對象FileInputStream fis = new FileInputStream("D:\\Document\\Java\\myByteStream\\fos.txt");//調用字節輸入流對象的讀數據方法//int read(byte[] b):從該輸入流讀取最多b.length個字節的數據到一個字節數組/*byte[] bys=new byte[5];//第一次讀取數據int len = fis.read(bys);System.out.println(len);//String (byte[] bytes)//System.out.println(new String(bys));System.out.println(new String(bys,0,len));//第二次讀取數據len = fis.read(bys);System.out.println(len);//System.out.println(new String(bys));System.out.println(new String(bys,0,len));//第三次讀取數據len = fis.read(bys);System.out.println(len);//String (byte[] bytes,int offset,int length)System.out.println(new String(bys,0,len));/*hello\nworld\n第一次:hello第二次:\nworl第三次:d\njav*/byte[] bys = new byte[1024];//1024及其整數倍int len;while ((len = fis.read(bys)) != -1) {System.out.print(new String(bys,0,len));}//釋放資源fis.close();}
}
7、字節緩沖流
字節緩沖流:
- BufferOutputStream:該類實現緩沖輸出流。通過設置這樣的輸出流,應用程序可以向底層輸出流寫入字節,而不必為寫入的每個字節導致底層系統的調用
- BufferInputStream:創建BufferInputStream將創建一個內部緩沖區數組。當從流中讀取或跳過字節時,內部緩沖區將根據需要從所包含的輸入流中重新填充,一次很多字節
構造方法:
- 字節緩沖輸出流:BufferOutputStream(OutputStream out)
- 字節緩沖輸入流:BufferInputStream(InputStream in)
為什么構造方法需要的是字節流,而不是具體的文件或者路徑?
- 字節緩沖流僅僅提供緩沖區,而真正的讀寫數據還得依靠基本的字節流字節流對象進行操作
package BufferStream;import java.io.*;/*字節緩沖流:BufferOutputStream:該類實現緩沖輸出流。通過設置這樣的輸出流,應用程序可以向底層輸出流寫入字節,而不必為寫入的每個字節導致底層系統的調用BufferInputStream:創建BufferInputStream將創建一個內部緩沖區數組。當從流中讀取或跳過字節時,內部緩沖區將根據需要從所包含的輸入流中重新填充,一次很多字節構造方法:字節緩沖輸出流:BufferOutputStream(OutputStream out)字節緩沖輸入流:BufferInputStream(InputStream in)*/
public class BufferStreamDemo01 {public static void main(String[] args) throws IOException {//字節緩沖輸出流:BufferOutputStream(OutputStream out)
// FileOutputStream fos = new FileOutputStream("D:\\Document\\Java\\myByteStream\\bos.txt");
// BufferedOutputStream bos = new BufferedOutputStream(fos);/*BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\Document\\Java\\myByteStream\\bos.txt"));//寫數據bos.write("hello\n".getBytes());bos.write("world\n".getBytes());bos.write("java\n".getBytes());//釋放資源bos.close();*///字節緩沖輸入流:BufferInputStream(InputStream in)BufferedInputStream bis=new BufferedInputStream(new FileInputStream("D:\\Document\\Java\\myByteStream\\bos.txt"));//一次讀取一個字節數據
// int by;
// while((by=bis.read())!=-1){
// System.out.print((char)by);
// }//一次讀取一個字節數組數據byte[] bys=new byte[1024];int len;while ((len=bis.read(bys))!=-1){System.out.print(new String(bys,0,len));}//釋放資源bis.close();}
}
總結
以上是生活随笔為你收集整理的Java-字节流的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。