java I/O———轉換流

1.轉換流的基本使用

現在爲止已經知道了兩種數據流:字節流和字符流。實際上這兩種流是可以進行互相轉換處理的。

  1. OutputStreamWriter:將字節輸出流變爲字符輸出流(Writer對於文字的輸出要比OutputStream方便)
  2. InputStreamReader:將字節輸入流變爲字符輸入流(InputStream讀取的是字節,不方便中文的處理)

要想知道這兩個類的實際意義,我們首先來看這兩個類的繼承關係以及構造方法:

public class OutputStreamWriter extends Writer
public OutputStreamWriter(OutputStream out)
public class InputStreamReader extends Reader
public InputStreamReader(InputStream in)

範例:觀察字節流與字符流的轉換

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class TestOutputStreamWriter {
    public static void main(String[] args) throws Exception{
        File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
            + File.separator + "hello.txt");
        if (!file.getParentFile().exists()) { // 必須保證父目錄存在
            file.getParentFile().mkdirs() ; // 創建多級父目錄
        }
        OutputStream output = new FileOutputStream(file) ;
        Writer out = new OutputStreamWriter(output) ; // 字節流轉爲字符流
        String msg = "你好 world" ;
        out.write(msg) ;
        out.close();
    }
}

這種操作在實際開發中並沒有什麼意義,我們主要用它來分析FileOutputStream、FileInputStream、FileWriter、FileReader之間的繼承關係。

在這裏插入圖片描述

從整個繼承結構來講,發現所有字符流處理的時候是經過轉換後得來的。

2.文件拷貝(重要)

linux下文件拷貝命令:“cp 源文件路徑 目標文件路徑”

現在希望通過程序來實現這樣的操作。即,建立一個CopyFile程序類,這個類通過初始化參數接收源文件與目標文件路徑。

分析:

  1. 要想實現數據的拷貝肯定是要通過流的方式來完成,對於流有兩類,由於要拷貝的內容不一定是文字數據,所以次此處我們採用字節流。
  2. 在進行拷貝的時候需要確定模式:a.在程序中開闢一個數組,該數組長度爲文件長度,將所有數據一次性讀取到該數組中隨後進行輸出保存。b.採用同邊讀邊寫的方式完成。

範例:初期模型

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

這個時候的確成功執行了,但是這個代碼有兩個問題:

  1. 在開發裏儘量不要去使用do…while,儘量去使用while。
  2. 拷貝的速度特別慢

範例:解決do…while

     while((temp = inputStream.read()) !=-1 ) { // 判斷這個讀取後的字節(保存在temp)中是否爲-1,如果不是表示有內容
outputStream.write(temp) ;
}

以上的方式還是針對於一個字節的方式完成的,如果文件太大,這種做法實在太慢。

範例:解決讀取慢的問題

如果要想解決讀取慢的問題,那麼就要一次性讀取多個字節內容

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

這個程序最爲核心的部分就是:

在這裏插入圖片描述

這也是以後用到最多的代碼(後續在文件上傳之中都是這種模式)
如果現在要求你處理的數據都在InputStream裏面,就採用以上的模型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章