【问题标题】:Read multiple lines from InputStreamReader (JAVA)从 InputStreamReader (JAVA) 读取多行
【发布时间】:2011-01-26 22:23:38
【问题描述】:

我有一个 InputStreamReader 对象。我想使用一个函数调用将多行读入缓冲区/数组(不创建大量字符串对象)。有简单的方法吗?

【问题讨论】:

  • 你想读取的行数是固定的还是可变的?
  • 已修复,例如每次读取 100 行
  • 如果您对垃圾敏感,可能需要使用 nio 将文件映射到字节缓冲区(或字符缓冲区)。
  • 您有什么特别的原因不想创建临时字符串吗?您是否遇到过内存使用问题?

标签: java string inputstream


【解决方案1】:

如果您对多行有一些分隔符,您可以使用带有长度和偏移量的读取方法读取那么多字符。否则,使用 StringBuilder 附加 BufferedReader 读取的每一行应该很适合您,而不会占用太多临时内存

【讨论】:

    【解决方案2】:

    首先要注意InputStreamReader 效率不高,您应该将它包裹在BufferedReader 对象上以获得最佳性能。

    考虑到这一点,您可以执行以下操作:

    public String readLines(InputStreamReader in)
    {
      BufferedReader br = new BufferedReader(in);
      // you should estimate buffer size
      StringBuffer sb = new StringBuffer(5000);
    
      try
      {
        int linesPerRead = 100;
        for (int i = 0; i < linesPerRead; ++i)
        {
          sb.append(br.readLine());
          // placing newlines back because readLine() removes them
          sb.append('\n');
        }
      }
      catch (Exception e)
      {
        e.printStackTrace();
      }
    
      return sb.toString();
    }
    

    注意readLine()返回null是达到EOF,所以你应该检查并照顾它。

    【讨论】:

    • 不逐行读取的目标,因为它用多余的字符串对象填充我的堆并使 GC 变得疯狂。我想从 inputstreamreader 读取(使用 bufferedReader /whatever),而不创建许多 String 对象。可能直接读入缓冲区(中间不创建字符串),或者以其他方式读取多行以避免字符串垃圾...
    • 如何使用 RandomAccessFile 直接读取字节缓冲区?还有整个文件 (readFull(byte[] b))
    • 字符串在 JVM v. 1.6 中进行了非常优化。您是否一直在使用分析器并真正发现了问题?还是你只是在猜测?
    猜你喜欢
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2020-10-05
    • 2023-03-04
    • 2020-01-17
    相关资源
    最近更新 更多