1. 程式人生 > >【轉載】Java IO 轉換流 位元組轉字元流

【轉載】Java IO 轉換流 位元組轉字元流

位元組流
輸入位元組流:
---------| InputStream 所有輸入位元組流的基類。 抽象類。
------------| FileInputStream 讀取檔案的輸入位元組流。
------------| BufferedInputStream 緩衝輸入位元組流。 該類內部其實就是維護了一個8kb(8192b)位元組陣列而已。 該類出現的目的是為了提高讀取檔案資料的效率。

輸出位元組流:
---------| OutputStream 所有輸出位元組流的基類。 抽象類。
------------| FileOutputStream 向檔案輸出資料 的輸出位元組流。
------------| BufferedOutputStream 緩衝輸出位元組流。 該類出現的目的是為了提高向檔案寫資料的效率。 該類內部其實也是維護了一個8kb(8192b)的位元組陣列而已。

什麼情況使用位元組流
讀取到資料不需要經過編碼或者解碼的情況情況下這時候使用位元組流。比如:圖片資料

 

字元流
字元流 = 位元組流 + 編碼(解碼)

輸入字元流
--------| Reader 所有輸入字元流的基類。 抽象類。
-----------| FileReader 讀取檔案字元的輸入字元流。 
-----------| BufferedReader 緩衝輸入字元流。 該類出現的目的是為了提高讀取檔案字元的效率並且拓展了功能(readLine()),它內部 其實就是維護了一個8192個長度的字元陣列。

  ps:BufferedInputStream維護了一個8192長度的位元組陣列(byte[]),BufferedReader維護了一個8192長度的字元陣列(char[])

輸出字元流
-------| Writer 所有輸出字元流的基類。 抽象類。
------------| FileWriter 向檔案輸出字元資料的輸出字元流。
---------------| BufferedWriter 緩衝輸出字元流。該類出現的目的是為了提高寫檔案字元的效率並且拓展了功能(newLine())。

什麼情況下使用字元流:如果讀寫的都是字元資料,這時候我們就使用字元流。


位元組轉字元流(轉換流)
輸入位元組流的轉換流 輸入位元組流---------輸入字元流
InputSrteamReader

輸出位元組流的轉換流
OutputStreamWriter

轉換流的作用
1. 可以把對應的位元組流轉換成字元流使用。
2. 可以指定碼錶進行讀寫檔案的資料。

 

FileReader, FileWriter這兩個類預設是使用的是gbk編碼 表。不能由你來指定碼錶讀寫檔案資料。

public class Demo1 {

    public static void main(String[] args) throws Exception {
//        testInput();
//        writeFile();
        readFile();
    }
    
    
    public static void readFile() throws IOException{
        //建立檔案與程式的輸入資料通道
        FileInputStream fileInputStream = new FileInputStream("F:\\a.txt");
        //建立輸入位元組流的轉換流並且指定碼錶進行讀取
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"utf-8");
        int content = 0; 
        while((content = inputStreamReader.read())!=-1){
            System.out.println((char)content);
        }
        //關閉資源
        inputStreamReader.close();
        
        
        
        
        
        
        
        
        /*FileReader fileReader = new FileReader("F:\\a.txt");  //預設使用的是gbk碼錶
        int content = 0; 
        while((content = fileReader.read())!=-1){
            System.out.print((char)content);
        }
        
        //關閉資源
        fileReader.close();*/
        
        
        
        
        
        
    }
    
    
    
    
    //指定使用utf-8碼錶把資料寫出到檔案上。
    public static void writeFile() throws IOException{
        //建立了檔案與程式的資料 通道
        FileOutputStream fileOutputStream = new FileOutputStream("F:\\a.txt");
        //建立一個輸出位元組流的轉換流並且指定碼錶進行寫資料
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,"utf-8");
        outputStreamWriter.write("大家好");  //中文在utf-8碼錶中佔三個位元組。
        
        //關閉資源
        outputStreamWriter.close();
    }
    
    
    
    
    
    
    
    public static void testOutput() throws Exception{
        Socket socket = new Socket(InetAddress.getLocalHost(),9090);
        //獲取到socket的輸出流物件。
        OutputStream outputStream =     socket.getOutputStream();
        //把輸出位元組流轉換成輸出字元流
        OutputStreamWriter  outputStreamWriter = new OutputStreamWriter(outputStream);
        outputStreamWriter.write("不餓!");
    }
    
    
    
    public static void testInput() throws Exception{
        InputStream in = System.in; 
//        int  content = in.read(); // 每次只會讀取到一個位元組的資料
    
        //需要把位元組流轉換成字元流使用。
        InputStreamReader  inputStreamReader = new InputStreamReader(in);
        
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        
        System.out.println(bufferedReader.readLine());
    }
    
    
    
}

InputStreamReader/Writer路線:

1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 import java.io.InputStreamReader;
 9 import java.io.OutputStreamWriter;
10 import java.io.UnsupportedEncodingException;
11 
12 /**
13  * 用InputStreamReader/Writer路線 
14  * 
15  * @author ixenos
16  *
17  */
18 public class JDKIODemo1 {
19 
20     public static void main(String[] args) {
21         File file = new File("imUTF8.txt");
22         File file2 = new File("imOutput.txt");
23         try {
24             FileInputStream fis = new FileInputStream(file);
25             FileOutputStream fos = new FileOutputStream(file2);
26 
27             InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
28             OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
29 
30             BufferedReader br = new BufferedReader(isr);
31             BufferedWriter bw = new BufferedWriter(osw);
32 
33             String line;
34             while ((line = br.readLine()) != null) {
35                 System.out.println(line);
36 
37                 bw.write(line);
38                 bw.newLine();// 寫入分隔符(內部是line.separator)
39             }
40 
41             br.close();
42             bw.close();
43             isr.close();
44             osw.close();
45             fis.close();
46             fos.close();
47             System.out.println("done");
48 
49 //            
50 //            //不用BufferedReader時
51 //            FileInputStream fis = new FileInputStream(file);
52 //            FileOutputStream fos = new FileOutputStream(file2);
53 //            InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
54 //            OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
55 //            
56 //            char[] buf = new char[1024];
57 //            int len = 0; // 用以標誌最後一組字串的末尾值,防止多讀
58 //            while ((len = isr.read(buf)) != -1) {
59 //                System.out.println(new String(buf, 0, len));
60 //                osw.write(buf, 0, len);//自動寫分隔符
61 //            }
62 //            
63 //            isr.close();
64 //            osw.close();
65 //            fis.close();
66 //            fos.close();
67 //            System.out.println("done");
68             
69 
70         } catch (UnsupportedEncodingException e) {
71             e.printStackTrace();
72         } catch (FileNotFoundException e) {
73             e.printStackTrace();
74         } catch (IOException e) {
75             e.printStackTrace();
76         }
77 
78     }
79 
80 }

FileReader/Writer路線:

1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.File;
 4 import java.io.FileNotFoundException;
 5 import java.io.FileReader;
 6 import java.io.FileWriter;
 7 import java.io.IOException;
 8 
 9 /**
10  * FileReader/Writer路線
11  * 
12  * 關鍵:FileReader是InputStreamReader的子類
13  * JDK的FileReader只能用系統預設編碼,我把eclipse預設設為UTF-8,所以正常
14  * 
15  * @author ixenos
16  *
17  */
18 public class JDKIODemo2 {
19 
20     public static void main(String[] args) {
21         File file = new File("imGBK.txt");
22         File file2 = new File("imOutput.txt");
23         try {
24             FileReader fr = new FileReader(file);
25             FileWriter fw = new FileWriter(file2);
26             BufferedReader br = new BufferedReader(fr);
27             BufferedWriter bw = new BufferedWriter(fw);
28             String line = null;
29             while ((line = br.readLine()) != null) {
30                 System.out.println(line);
31                 bw.write(line);
32                 bw.newLine();// 需要手動換行
33             }
34             br.close();
35             bw.close();
36             fr.close();
37             fw.close();
38 
39             
40 //            // 不用BufferedReader時
41 //            FileReader fr = new FileReader(file);
42 //            FileWriter fw = new FileWriter(file2);
43 //            char[] buf = new char[1024];
44 //            int len = 0; // 用以標誌最後一組字串的末尾值,防止多讀
45 //            while ((len = fr.read(buf)) != -1) {
46 //                System.out.println(new String(buf, 0, len));
47 //
48 //                fw.write(buf, 0, len);// 自動換行
49 //            }
50 //            fr.close();
51 //            fw.close();
52 
53         } catch (FileNotFoundException e) {
54             e.printStackTrace();
55         } catch (IOException e) {
56             e.printStackTrace();
57         }
58 
59     }
60 
61 }

 


---------------------
作者:宇翔XGT
來源:CSDN
原文:https://blog.csdn.net/u012469528/article/details/78628585
版權宣告:本文為博主原創文章,轉載請附上博文連結!