BufferedInputStream的用法

时间:2010-06-26 02:08:04

标签: java fileinputstream bufferedinputstream

让我以一个小心谨慎的方式为这篇文章做准备。在Java方面,我是一个初学者。我已经开启和关闭了一段时间的PHP编程,但我已经准备好制作一个桌面应用程序,所以我决定使用Java,原因有很多。

我正在处理的应用程序处于开始阶段(少于5个类),我需要从本地文件中读取字节。通常,文件目前小于512kB(但将来可能会变大)。目前,我使用FileInputStream将文件读入三个字节数组,完全满足我的要求。但是,我看到提到了BufferedInputStream,并且想知道我目前这样做的方式是否最好,或者我是否应该使用BufferedInputStream

我已经完成了一些研究,并在Stack Overflow上阅读了一些问题,但我仍然无法理解何时使用而不使用BufferedInputStream的最佳情况。在我的情况下,我读取字节的第一个数组只有几个字节(小于20)。如果我收到的数据在这些字节中是好的,那么我将文件的其余部分读入另外两个不同大小的字节数组。

我也听过很多人提到分析,看看哪个在每个特定情况下效率更高,但是,我没有剖析经验,我不确定从哪里开始。我也会喜欢这方面的一些建议。

我很抱歉这么长的帖子,但我真的想学习并理解做这些事情的最佳方法。我总是习惯于第二次猜测我的决定,所以我会喜欢一些反馈。谢谢!

5 个答案:

答案 0 :(得分:77)

如果你一直在做小读,那么BufferedInputStream会给你带来明显更好的表现。无缓冲流上的每个读取请求通常导致对操作系统的系统调用以读取所请求的字节数。进行系统调用的开销可能是每个系统调用数千个机器指令。缓冲流通过对内部缓冲区执行(例如)高达8k字节的大量读取,然后从该缓冲区分配字节来减少此操作。这可以大大减少系统调用次数。

但是,如果您一直在进行大量读取(例如8k或更多),那么BufferedInputStream会减慢速度。您通常不会减少系统调用的数量,缓冲会引入额外的数据复制步骤。

在你的用例中(你首先读取了20个字节的块然后是很多大块)我会说使用BufferedInputStream更有可能降低性能而不是增加它。但最终,它取决于实际的阅读模式。

答案 1 :(得分:4)

如果您使用相对较大的数组一次读取一个数据块,那么BufferedInputStream只会引入一个浪费的副本。 (请记住,read并不一定会读取所有数组 - 您可能需要DataInputStream.readFully)。 BufferedInputStream获胜的地方是进行大量小读取。

答案 2 :(得分:1)

BufferedInputStream提前读取您需要的更多文件。据我了解,它提前做了更多的工作,比如,1个连续的磁盘读取与在紧密循环中做很多。

就分析而言 - 我喜欢内置于netbeans中的分析器。开始使用真的很容易。 : - )

答案 3 :(得分:1)

我不能说分析,但根据我开发Java应用程序的经验,我发现使用任何缓冲类 - BufferedInputStream,StringBuffer - 我的应用程序非常快。因此,即使是最小的文件或字符串操作,我也会使用它们。

答案 4 :(得分:0)

    import java.io.*;
    class BufferedInputStream
    {
            public static void main(String arg[])throws IOException
            {
                FileInputStream fin=new FileInputStream("abc.txt");
                BufferedInputStream bis=new BufferedInputStream(fin);
                int size=bis.available();
                while(true)
                {
                        int x=bis.read(fin);
                        if(x==-1)
                        {
                                bis.mark(size);
                                System.out.println((char)x);
                        }
                }
                        bis.reset();
                        while(true)
                        {
                                int x=bis.read();
                                if(x==-1)
                                {
                                    break;
                                    System.out.println((char)x);
                                }
                        }

            }

    }