当前位置: 首页 > 知识库问答 >
问题:

使用BufferedInputStream包装后对原始InputStream的影响

云瑞
2023-03-14

假设我有一个接受InputStream的方法。

此方法需要使用BufferedInputStream包装此输入流,以使用其标记和重置功能。但是,传入的InputStream可能仍由方法的调用方使用。

public static void foo(InputStream is) throws Exception {
    BufferedInputStream bis = new BufferedInputStream(is);
    int b = bis.read();
}

public static void main(String[] args) {


    try {
        InputStream is = new FileInputStream(someFile);
        foo(is);
        int b = is.read(); // return -1
    }catch (Exception e) {
        e.printStackTrace();
    }
}

我的问题是:当读取(或初始化)BufferedInputStream时,原始InputStream到底会发生什么?

我的假设是,如果读取BufferedInputStream,原始InputStream也会向前移动。然而,在调试代码后,我发现InputStream在读取时将返回-1。

如果在该过程之后原始InputStream不可读,我应该如何实现我的目的:

InputStream is;
foo(is);               // Method only take in generic InputStream object
                       // Processing of the passed in InputStream object require mark and reset functionality
int b = is.read();     // Return the next byte after the last byte that is read by foo()

编辑:我想我要的是非常通用的,因此需要大量的工作。至于我在做什么,实际上我不需要满分

共有3个答案

杜俭
2023-03-14

BufferedInputStream将批量预加载来自底层InputStream的数据,这将触发底层InputStream位置的相应移动。如果缓冲区大小足以一次性消耗底层流中的所有数据,您很可能会观察到您描述的行为。

公良理
2023-03-14

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html#BufferedInputStream(java.io.输入流)

看起来BufferedInputStream使用InputStream来执行与数据流一起执行的操作。缓冲类只是实现了一个缓冲区数组供内部使用。

除了复制InputStream以便调用第二个对象之外,不确定可以使用什么替代。

蒲坚
2023-03-14

BufferedInputStream的默认缓冲区大小为8192,因此当您从BufferedInputStream读取时,它会尝试填充其缓冲区。因此,如果您必须从InputStream中读取的字节数小于缓冲区大小,则输入流的全部内容将被读取到缓冲区,因此从BufferedInputStream

请看一下BufferedInputStream的源代码:http://www.docjar.com/html/api/java/io/BufferedInputStream.java.html

 类似资料:
  • 问题内容: 我有一个采用InputStream并从中读取数据的方法。我也想将此方法与ByteBuffer一起使用。有没有办法包装ByteBuffer以便可以将其作为流访问? 问题答案: JDK中什么都没有,但是有很多实现,谷歌提供ByteBufferInputStream。基本上,它们包装一个或多个ByteBuffer并跟踪其中的索引,该索引记录已读取的数量。事情是这样来涨了不少,但显然是越野车,

  • 问题内容: 和 Java 的区别? 问题答案: 如果问题是:“这些类之间的区别是什么”,这里是一个摘要,但请阅读javadoc以获得更多信息: inputStream是从流(网络或文件)读取字节的基类。它提供了从流中读取字节并检测流结束的功能。 DataInputStream是一种InputStream,可以直接将数据作为原始数据类型读取。 BufferedInputStream是一种inputS

  • 我正在使用Java 8流,并试图修改forEach终端操作中的对象内容。 我在这里面临的问题是,我可以修改对象内容,但不能修改的内容 代码片段如下: 我想知道,由于在执行操作时取消了整数对象的装箱,所以该更改不会反映在列表中,但不确定。

  • 问题内容: 我一直在研究各种hibernate教程和示例,因为它们具有标识/主键属性,有些使用Java基本类型,有些使用包装器类型。 与 为什么以及何时将一个用作实体密钥? 问题答案: 从Hibernate的角度来看,它没有任何改变,因为Hibernate使用相同的Hibernate类型来表示它们。 然而,正如字节码忍者指出,你不能区分原始INT的默认值从分配的同时也有可能没有歧义(一个ID总是意

  • 首先,我理解了缓冲作为包装的概念,例如,充当从底层流读取内容的临时容器(让我们采取读取场景),在本例中-。 比方说,有100个字节要从流中读取(文件作为源)。 如果没有缓冲,代码(BufferedInputStream的读取方法)必须进行100次读取(一次一个字节)。 使用缓冲,取决于缓冲区大小,代码使 在这种情况下,虽然被一个包装,底层流(例如)仍然必须一次读取一个字节。那么,缓冲的好处在哪里(

  • 问题内容: 当我使用Jackson对该对象进行反序列化时,我试图在Java对象中包含原始JSON。为了测试此功能,我编写了以下测试: 代码输出以下行: JSON正是我想要的外观。不幸的是,当尝试将JSON读回对象时,代码将失败并出现异常。这是例外: org.codehaus.jackson.map.JsonMappingException:无法从[源:java.io.StringReader@d7