Java字節流之InputStream抽象類與OutputStream抽象類

一、InputStream抽象類

InputStream是字節輸入流的根類,它定義了很多方法,影響着字節輸入流的行爲。
InputStream主要方法如下:

  • int read():讀取一個字節,返回0到255範圍內的int字節值。如果已經到達流末尾,而且沒有可用的字節,則返回值-1。
  • int read(byte b[] ):讀取多個字節,數據放到字節數組b中,返回值爲實際讀取的字節的數量,如果已經到達流末尾,而且沒有可用的字節,則返回值-1。
  • int read(byte b[ ], int off, int len):最多讀取len個字節,數據放到以下標off開始字節數組b中,將 讀取的第一個字節存儲在元素b[off]中,下一個存儲在b[off+1]中,依次類推。返回值爲實際讀 取的字節的數量,如果已經到達流末尾,而且沒有可用的字節,則返回值-1。
  • void close():流操作完畢後必須關閉。

上述所有方法都可能會拋出IOException,因此使用時要注意處理異常。

二、OutputStream抽象類

OutputStream是字節輸出流的根類,它定義了很多方法,影響着字節輸出流的行爲。
OutputStream主要方法如下:

  • void write(int b):將b寫入到輸出流,b是int類型佔有32位,寫入過程是寫入b 的8個低位,b的24個高位將被忽略。
  • void write(byte b[ ]):將b.length個字節從指定字節數組b寫入到輸出流。
  • void write(byte b[ ], int off, int len):把字節數組b中從下標off開始,長度爲len的字節寫入到輸出流。
  • void close( ):流操作完畢後必須關閉。

上述所有方法都聲明拋出IOException,因此使用時要注意處理異常。

三、案例:文件複製

前面介紹了兩種字節流常用的方法,下面通過一個案例熟悉一下它們的使用,該案例實現了文件復 制,數據源是文件,所以會用到文件輸入流FileInputStream,數據目的地也是文件,所以會用到文件輸出流FileOutputStream。
FileInputStream和FileOutputStream中主要方法都是繼承自InputStream和OutputStream,這裏不再贅述。下面介紹一下它們的構造方法。
FileInputStream構造方法主要有:

  • FileInputStream(String name):創建FileInputStream對象,name是文件名。如果文件不存在則拋出 FileNotFoundException異常。
  • FileInputStream(File file):通過File對象創建FileInputStream對象。如果文件不存在則拋出 FileNotFoundException異常。
    FileOutputStream構造方法主要有:
  • FileOutputStream(String name):通過指定name文件名創建FileOutputStream對象。如果name文件存在,但如果是一個目錄或文件無法打開則拋出FileNotFoundException異常。
  • FileOutputStream(String name, boolean append):通過指定name文件名創建FileOutputStream對 象,append參數如果爲 true,則將字節寫入文件末尾處,而不是寫入文件開始處。如果name文 件存在,但如果是一個目錄或文件無法打開則拋出FileNotFoundException異常。
  • FileOutputStream(File file):通過File對象創建FileOutputStream對象。如果file文件存在,但如果 是一個目錄或文件無法打開則拋出FileNotFoundException異常。
  • FileOutputStream(File file, boolean append):通過File對象創建FileOutputStream對象,append參數 如果爲 true,則將字節寫入文件末尾處,而不是寫入文件開始處。如果file文件存在,但如果是 一個目錄或文件無法打開則拋出FileNotFoundException異常。

將/Users/caizhengjie/Desktop/qq/123.txt文件內容複製到/Users/caizhengjie/Desktop/qq/asd/123.txt,文件內容 是AI-162.3764568,實現代碼如下:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

//將/Users/caizhengjie/Desktop/qq/123.txt文件內容複製到/Users/caizhengjie/Desktop/qq/asd/123.txt
//    內容是AI-162.3764586,十四個字節
public class FileCopy {
    public static void main(String[] args) {
//        創建FileInputStream和FileOutputStream對象,這是自動資源管理,不需要自己關閉流
        try(FileInputStream in = new FileInputStream("/Users/caizhengjie/Desktop/qq/123.txt");
            FileOutputStream out = new FileOutputStream("/Users/caizhengjie/Desktop/qq/asd/1234.txt")) {
            //           開始時間
            long starttime = System.nanoTime();
//            準備一個緩衝區
            byte[] buffer = new byte[10];
//            先讀取一次,len實際是讀取的字節數
            int len = in.read(buffer);

            while (len != -1){
                String copyStr = new String(buffer);
//                打印複製的字符
                System.out.println(copyStr);
//                開始寫入數據
                out.write(buffer,0,len);
//               再讀取一次,這裏實際執行了兩次,第一次讀取了10個字節,第二次讀取了4個字節
                len = in.read(buffer);
            }
            //            結束時間
            long elapsedTime = System.nanoTime()-starttime;
            System.out.println("耗時"+(elapsedTime/1000000.0)+"毫秒");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上面的案例由於使用了字節輸入輸出流,所以不僅可以複製文本文件,還可以複製二進制文件。
以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!

發佈了59 篇原創文章 · 獲贊 7 · 訪問量 2939
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章