Java I/O 教程(六) BufferedInputStream 类

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 laoxu
 * @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 laoxu
 * @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 

posted @   一锤子技术员  阅读(3)  评论(0编辑  收藏  举报  
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示