Java I/O 教程(六) BufferedInputStream 類

indexman發表於2018-01-01

Java BufferedInputStream Class


Java BufferedInputStream class 用於從輸入流讀取資料,和BufferedOutStream一樣內部使用緩衝機制提高讀取效能。

需要注意的是:

當讀取流中位元組時,內部緩衝區每次會自動重新填滿多個位元組。

當一個緩衝輸入流建立時,一個內部緩衝區陣列也會建立。



類定義


public class BufferedInputStream extends FilterInputStream  

建構函式


BufferedInputStream(InputStream in)
Creates a BufferedInputStream and saves its argument, the input stream in, for later use.

BufferedInputStream(InputStream in, int size)
Creates a BufferedInputStream with the specified buffer size, and saves its argument, the input stream in, for later use.

方法

int available()                            返回輸入流中預計可讀取位元組數
int read()                                從輸入流讀取下一個位元組
int read(byte[] b, int off, int ln)        從指定的byte輸入流接收資料後寫入指定位元組陣列中,從指定偏移量開始
void close()                            關閉輸入流並釋放任何與流相關的系統資源
void reset()                            復位在mark方法最後一次呼叫的位置
void mark(int readlimit)                其實就是給輸入流在讀取到某個位元組時候打個標記,讓reset方法能夠回到這個標記的位置
long skip(long x)                        跳過並拋棄x個位元組
boolean markSupported()                    用於測試輸入流是否支援mark和reset方法

例子

package com.dylan.io;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author xusucheng
 * @create 2018-01-01
 **/
public class BufferedInputStreamExample {
    public static void main(String[] args) {
        try {
            FileInputStream fin = new FileInputStream("D:\\testout.txt");
            BufferedInputStream bin = new BufferedInputStream(fin);
            int i;
            while ((i = bin.read()) != -1) {
                //如果是中文,此方法不支援
                System.out.print((char)i);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}


輸出:Hello java.io!


關於mark和reset方法例子

package com.dylan.io;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * @author xusucheng
 * @create 2018-01-01
 **/
public class BufferedInputStreamMarkReset {
    public static void main(String[] args) throws Exception {

        InputStream iStream = null;
        BufferedInputStream bis = null;

        try {

            // read from file c:/test.txt to input stream
            iStream = new FileInputStream("D:/testmark.txt");

            // input stream converted to buffered input stream
            bis = new BufferedInputStream(iStream);

            // read and print characters one by one
            System.out.println("Char : " + (char) bis.read());
            System.out.println("Char : " + (char) bis.read());
            System.out.println("Char : " + (char) bis.read());

            // mark is set on the input stream
            bis.mark(0);
            System.out.println("Char : " + (char) bis.read());
            System.out.println("reset() invoked");

            // reset is called
            bis.reset();

            // read and print characters
            System.out.println("char : " + (char) bis.read());
            System.out.println("char : " + (char) bis.read());

        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            // releases any system resources associated with the stream
            if (iStream != null)
                iStream.close();
            if (bis != null)
                bis.close();
        }
    }
}

輸出:

Char : A
Char : B
Char : C
Char : D
reset() invoked
char : D
char : E


下一章

Java I/O 教程(七) DataOutputStream和DataInputStream





相關文章