您好,登錄后才能下訂單哦!
java IO 字節流詳解
1. 如何理解輸入輸出流?
這是我當初在學習Java IO這一塊很難理解的一塊,輸入輸出流我們可必須以一個為參照物:我們以內存為參照物,凡是寫入內存的我們叫輸入流,從內存中寫出的我們叫輸出流。看下面的示例圖
有了這樣的一個概念對于我們再學習Java中的IO流我相信就會變得特別簡單了。
2. 再看流的分類
流的分類,Java的流分類比較豐富,剛接觸的人看了后會感覺很暈。流分類的方式很多:
1、按照輸入的方向分,輸入流和輸出流,輸入輸出的參照對象是Java程序。(InputStream OutPutStream)
2、按照處理數據的單位不同分,字節流和字符流,字節流讀取的最小單位是一個字節(1byte=8bit),而字符流一次可以讀取一個字符(1char = 2byte = 16bit)。(InputStream Reader)
3、按照功能的不同分,分節點流和處理流,節點流是直接從一個源讀寫數據的流(這個流沒有經過包裝和修飾),處理流是在對節點流封裝的基礎上的 一種流,FileInputStream是一個接點流,可以直接從文件讀取數據,但是BufferedInputStream可以包裝 FileInputStream,使得其有緩沖功能。(FileInputStream BufferedInputStream)
其實除了以上三種分類外,還有一些常常聽到的一些分類比如:對象流、緩沖流、壓縮流、文件流等等。其實都是節點流和處理流的子分類。當然你也可以創建新的流類型,只要你需要。
3. 字節流:
字節流主要操作byte類型數據,以byte數組為準,主要操作類有InputStream(字節輸入流)、OutputSteam(字節輸出流)由于IputStream和OutputStream都是抽象類,所要要用這兩個類的話,則首先要通過子類實例化對象。下面就是這兩個類的一些子類結構圖
1) 字節輸出流:OutputStream
OutputStream是一個抽象類,要想使用它,必須通過子類來實例化它。
OutputStream類的常用方法
方法名稱 |
描述 |
public void close() throws IOException |
關閉輸出流 |
public void flush() throws IOException |
刷新緩沖區 |
public void write(byte[] b) throws IOException |
將一個byte數組寫入數據流 |
public void write(byte[] b,int off,int len) throws IOException |
將一個指定范圍的byte數組寫入數據流 |
public abstract void write(int b) throws IOException |
將一個字節數據寫入數據流 |
實例1:Helloworld從HelloWorld開始
功能:(向一個名為”hello.txt”的文本文件中寫一個“HelloWorld”)
public static void main(String[] args) throws Exception { // 創建一個以當前工程目錄下的名為“helloworld.txt”的文本文件 File file = new File("hellowolrd.txt"); OutputStream outputStream = null; // 通過FileOutPutStream的子類實例化OutputStream對象 outputStream = new FileOutputStream(file); // 聲明一個字符串 String str = "hello,world"; // 將字符串轉換成字節數組 byte[] b = str.getBytes(); // 寫入數據 outputStream.write(b); // 關閉輸出流 outputStream.close(); outputStream.flush(); }
我們可以看到當前工程目錄下已經有一個helloworld.txt且里面已經有數據,如果我們把str的值改變的話,文本文件里的數據也會改變,所以我們想是不是可以不刪除原來的數據,在追尾上追加上。
我們只要在構造FileOutputStream對象的時候選擇另一種構造方法就可以了
FileOutputStream(File file,boolean append)
第二個參數就是是否采用追加的方式寫入到文本文件中
把上面的代碼修改下就可以了
outputStream = new FileOutputStream(file,true);
再從例子1我們理解我們對輸入輸出流的理解,在這個例子里,我們聲明的字符串肯定是在內存中的,現在我們要從內存中把數據寫到文本中,所以我們用到輸出流。這也正符合了我對輸入輸出流的理解,當然大家肯定還有其他的理解方式。
2) 字節輸入流:InputStream
InputStream類的常用方法
方法名稱 |
描述 |
public void avaliable() throws IOException |
可以取得輸入文件的大小 |
public void close() throws IOException |
關閉輸入流 |
public abstract int read() throws IOException |
讀取內容,以數字的方式讀取 |
public int read (byte b) throws IOException |
將內容讀到byte數組,同時返回讀入的個數 |
與OutputStream類一樣,InputStream本身也是一個抽象類,要想使用它,也必須依靠其子類。
實例2:還是HelloWorld
在上一個例子的基礎上我們從文本中讀取數據并且把它顯示在控制臺上
public static void main(String[] args) throws Exception { // 創建一個以當前工程目錄下的名為“helloworld.txt”的文本文件 // 這個文件在上一個例子里已經創建,并且里面已有數據 File file = new File("hellowolrd.txt"); // 聲明InputStream對象 InputStream inputStream = null; // 通過FileInputStream子類實例化InputStream對象 inputStream = new FileInputStream(file); // 聲明一個字節數組用以接收讀入的數據 byte[] b = new byte[1024]; // 開始讀入數據,將數據內容讀到此數組中 inputStream.read(b); // 關閉輸入流 inputStream.close(); // 在控制臺打印 System.out.println(new String(b)); }
如果以這種方式打印,我們可以看到雖然控制臺里是打印出了文本文件中的內容,但是后面跟了很多空格,這是我們不需要的,對于這種情況我們有兩種解決方式
方式一:聲明字節數組的時候指定字節數組的長度為文本內容的長度
byte[] b=new byte[(int)file.length()];
方式二:在將字節數組轉換成字符串的調用String(byte b,int off,int len)這個構造函數
System.out.println(new String(b,0,(int)file.length()));
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。