1. 程式人生 > >Java IO流-字節流

Java IO流-字節流

數據類型分類 抽象基類 數據 輸入輸出 高級 bytes 一次 div blog

2017-11-05 17:48:17

Java中的IO流按數據類型分類分為兩種,一是字節流,二是字符流。字符流的出現是為了簡化文本數據的讀入和寫出操作。

如果操作的文件是文本文件,那麽使用字符流會大大簡化操作,但是如果什麽都不知道,就用字節流。

技術分享

  • 字節流

字節流的兩個抽象基類是:InputStream

            OutputStream

抽象類顯然是無法實例化的,所以需要尋找相應的子類來進行操作。下面討論兩個很重要的字節輸入輸出流子類。

* FileOutputStream

FileOutputStream 用於寫入諸如圖像數據之類的原始字節的流。要寫入字符流,請考慮使用 FileWriter


**構造方法

技術分享

從Api中可以看出,既可以使用File類來初始化,也可以直接使用地址字符串來初始化。

如果文件不存在,會自動新建該文件。

**常用方法

技術分享

import java.io.FileOutputStream;
import java.io.IOException;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        FileOutputStream file = new FileOutputStream("E:\\text.txt");
        byte[] b = "Hello Spring.\r\n".getBytes();
        file.write(b);
        file.write("Hello World.".getBytes());
        file.close();
    }
}

換行符問題:在這裏需要註意一個問題,就是換行符的問題。不同系統針對換行符的識別是不同的。

首先解釋一下 \r:表示回車

       \n:表示換行

Windows系統裏面,每行結尾是 回車+換行(CR+LF),即“\r\n”;
Unix系統裏,每行結尾只有 換行CR,即“\n”; Mac系統裏,每行結尾是 回車CR 即‘\r‘。

高級記事本或者編輯器比如sublime裏會自動識別不同的換行符,如果寫的\n,在記事本中打開是不顯示換行的,但是在sublime中會正常換行。

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

public class Demo1 {
    public static void main(String[] args){
        FileOutputStream file = null;
        try{
        file=new FileOutputStream("E:\\text.txt");
        byte[] b = "Hello Spring.\n".getBytes();
        file.write(b);
        file.write("Hello World.".getBytes());}
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally {
            if(file!=null) {
                try {
                    file.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

* FileInputStream

FileInputStream 用於讀取諸如圖像數據之類的原始字節流。要讀取字符流,請考慮使用 FileReader

**構造方法

技術分享

**常用方法

技術分享

如果因為已經到達文件末尾而沒有更多的數據,則返回 -1

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

public class Demo1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fin = new FileInputStream("E:\\text.txt");
        FileOutputStream fout = new FileOutputStream("E:\\text2.txt");
        byte[] b = new byte[5];
        int len = 0;
        while ((len = fin.read(b)) != -1) {
            fout.write(b, 0, len);
        }
        fin.close();
        fout.close();
    }
}

返回值為當次讀取到的字節數,如果到達文件末尾則返回-1。在寫文件的時候,必須使用偏移法進行寫入,否則會有覆蓋問題。

一般一次讀1024或者1024的整數倍,就是一次讀1kb或者多kb。

==>顯然的,在讀寫的時候如果使用數組的話,會大大提高效率,所以Java在設計的時候也考慮到了這個問題並提供了

字節緩沖區流:BufferedOutputStream,BufferedInputStream。

* BufferedOutputStream

BufferedOutputStream:該類實現緩沖的輸出流。通過設置這種輸出流,應用程序就可以將各個字節寫入底層輸出流中,而不必針對每次字節寫入調用底層系統。

**構造方法

技術分享

構造方法可以指定緩沖區的大小,一般來說使用默認緩沖區大小就夠了。

**常用方法

技術分享

當然也可以直接寫byte[] b,指的是把長度為len的字節數組都寫入。

* BufferedInputStream

BufferedInputStream 為另一個輸入流添加一些功能,即緩沖輸入以及支持 markreset 方法的能力。在創建 BufferedInputStream 時,會創建一個內部緩沖區數組。在讀取或跳過流中的字節時,可根據需要從包含的輸入流再次填充該內部緩沖區,一次填充多個字節。mark 操作記錄輸入流中的某個點,reset 操作使得在從包含的輸入流中獲取新字節之前,再次讀取自最後一次 mark 操作後讀取的所有字節。

**構造方法

技術分享

**常用方法

技術分享

使用Buffered緩沖流在使用的時候和基本的File流沒有差異,不過在底層進行了優化,所以導致效率大大提高。

Java IO流-字節流