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

在Java中,InputStream、InputStreamReader和BufferedReader如何协同工作?

施洛城
2023-03-14
private String readFromStream(InputStream inputStream) throws IOException {
  StringBuilder output = new StringBuilder();
  if (inputStream != null) {
    InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
    BufferedReader reader = new BufferedReader(inputStreamReader);
    String line = reader.readLine();
    while (line != null) {
      output.append(line);
      line = reader.readLine();
    }
  }
  return output.toString();
}

我不明白InputStream、InputStreamReader和BufferedReader到底是做什么的。它们都有一个read()方法,对于BufferedReader,还有readLine()。为什么我不能只使用InputStream或者只添加inputStreamReader呢?为什么我需要添加BufferedReader?我知道这与效率有关,但我不明白怎么做。

我一直在研究BufferedReader的文档试图解释这一点,但我仍然不知道谁在做什么:

通常,对读取器的每个读取请求都会导致对底层字符或字节流的相应读取请求。因此,建议将BufferedReader包装在任何读取()操作可能代价高昂的读取器周围,例如FileReaders和InputStreamReaders。例如,

共有1个答案

颛孙越
2023-03-14

这个流中的Java概念和用法链接,给出了很好的解释。

Streams、Reader、Writer、BufferedReader、BufferedWriter--这些都是您将在Java中处理的术语。Java中提供了用于操作输入和输出的类。这确实值得了解这些是如何相关的,以及它是如何使用的。本文将详细探讨Java和其他相关类中的流。所以让我们开始:

让我们在更高层次上定义每一个,然后再深入挖掘。

InputStreams
java提供了许多类型的InputStreams。每个连接到不同的数据源,如字节数组,文件等。

例如,FileInputStream连接到文件数据源,并可用于从文件中读取字节。而ByteArrayInputStream可以将字节数组视为输入流。

OutputStream
这有助于将字节写入数据源。几乎每个InputStream都有一个相应的OutputStream,只要它有意义。

缓冲流

到目前为止,我们看到的大多数示例都使用无缓冲I/O。这意味着每个读或写请求都由底层OS直接处理。这会降低程序的效率,因为每个这样的请求通常会触发磁盘访问、网络活动或其他一些相对昂贵的操作。

为了减少这种开销,Java平台实现了缓冲I/O流。缓冲的输入流从称为缓冲器的存储器区域读取数据;只有当缓冲区为空时才调用本机输入API。类似地,缓冲输出流将数据写入缓冲区,只有当缓冲区已满时才调用本机输出API。

 类似资料:
  • 问题内容: 使用over 的好处是什么,反之亦然。 这是一个实际的例子: 这是一个使用InputStreamReader的示例(显然是在InputStream的帮助下): Reader是否以特殊方式处理数据? 只是想让我了解Java 的整个流数据方面。 问题答案: 它们代表了一些不同的东西。 它是所有可能的字节 流 的祖先类,它本身没有用,但是所有子类(如您正在使用的子类)都非常适合处理二进制数据

  • 问题内容: Java 和类之间有什么区别? 问题答案: BufferedReader是“ InputStreamReader / FileReader”的包装,它在每次调用本机I / O时都缓冲信息。 您可以想象在读取一个字符(或字节)与读取一个大号时的效率差异。一圈(或字节)中的字符数。使用BufferedReader,如果您希望读取单个字符,它将存储内容以填充其缓冲区(如果为空),并且对于进一

  • 本文向大家介绍InputStreamReader和BufferedReader用法及实例讲解,包括了InputStreamReader和BufferedReader用法及实例讲解的使用技巧和注意事项,需要的朋友参考一下 一、BufferedReader类 . 所属类库:          java.lang.Object                java.io.Reader         

  • 我试图创建一个简单的源代码阅读器,使用EditText视图中输入的网址读取和显示网页的源代码,但不能正确初始化InputSteramReader和BufferedReader。在Android 4.4.2上测试以下代码,LogCat显示此错误: URL url=null; url=新url(et.getText()。toString()); URLConnection conn=url。openC

  • 问题内容: 我对Java同步有疑问。我想知道我的类中是否有三个同步方法,并且一个线程在一个同步方法中获得了锁,另外两个将被锁定吗?我问这个问题是因为我对以下陈述感到困惑。 当线程处于对象的同步方法内部时,希望执行该同步方法或对象的任何其他同步方法的所有其他线程将必须等待。此限制不适用于已经具有锁并正在执行对象的同步方法的线程。这样的方法可以调用对象的其他同步方法而不会被阻塞。当然,任何线程都可以随

  • 我已经在互联网上闲逛了很长一段时间,我想知道如何在不打开不同端口的情况下一起使用BufferedReader和DataInputStream。我尝试过流式图像,但由于缓冲读取器存储了额外的字节,它创建了一个损坏的图像。当我尝试使用datainputstream.read()时,我无法轻松地读取整行文本。我的问题有什么解决办法吗?