【问题标题】:Looping over InputStream truncating data循环输入流截断数据
【发布时间】:2013-06-05 10:51:44
【问题描述】:

所以这是一个非常简单的问题,我只是没有看到一个简单的解决方案:

我正在尝试通过 InputStream 获取数据列表,循环直到到达流的末尾。在每次迭代中,我打印通过 InputStream 传递的下一行文本。我有它的工作,但有一个小问题:我截断每行的第一个字符。

代码如下:

while (dataInputStream.read() >= 0) {
    System.out.printf("%s\n", dataInputReader.readLine());
}

还有输出:

classpath
project
est.txt

现在,我知道这里发生了什么:read() 在我的while 循环中调用每行的第一个字符,因此当该行被传递到循环中时,该字符丢失了。问题是,我不知道如何设置循环来防止这种情况发生。

我想我只是需要用新的眼光来看待这个问题。

【问题讨论】:

  • 这个类上有一个available()方法,你试过了吗?
  • 您的变量是dataInputStream 还是dataInputReader?它的类型是什么?请让问题更清楚。
  • @JonSkeet 我的猜测是有一个阅读器包裹在输入流上(并且该流已经过数据测试......奇怪的操作方式但是哦)
  • 对不起,dataInputStream是来自socket的流,dataInputReader是来自dataInputStream的BufferedReader。我是这种事情的新手,所以我欢迎 C&C。
  • 好的,你最终想对你的数据做什么?只能逐行阅读?

标签: java loops input io


【解决方案1】:

DataInputStreamreadLine 已弃用。您可以尝试用BufferedReader 包装它:

try
{
    String line;
    BufferedReader bufferedReader = new BufferedReader( new InputStreamReader( dataInputStream ) );
    while( (line = bufferedReader.readLine()) != null )
    { 
        System.out.printf("%s\n", line);
    }  
} 
catch( IOException e )
{
    System.err.println( "Error: " + e );
}

另外,我不确定,由于这个规范,使用 available() 是个好主意:

* <p>Note that this method provides such a weak guarantee that it is not very useful in
* practice.

【讨论】:

  • 这修复了截断问题,但它不会跳出 while 循环。不过,这可能是传递给它的字符串的问题。
  • 然后你可以在没有缓冲包装的情况下使用简单的 read() 直到它给你'-1'。
  • 所以你说的是 while(dataInputStream.read() != -1) { ... }?据我所知,这会使截断问题重新出现。
  • 我的意思是:字节 b; while( (b = dataInputStream.read()) != -1) { ... }
【解决方案2】:

使用一个BufferedReaderInputStreamReader,这里是一个例子:

InputStream in=...;
BufferedReader br = new BufferedReader(new InputStreamReader(in));
while (br.ready()) {
    String line = br.readLine();
}

【讨论】:

    【解决方案3】:

    dataInputStream.read() 读取 InputStream 的第一个字符,就像dataInputReader.readLine() 读取完整的下一行一样。然后每个读取的字符或行都消失了。您可以使用dataInputStream.available() 检查 InputStream 是否有可用数据。 那应该打印正确的输出:

    while (dataInputStream.available()) {
      System.out.printf("%s", dataInputReader.read());
    }
    

    【讨论】:

      【解决方案4】:
      String line;
      while ((line = dataInputReader.readLine()) != null) {
          System.out.println(line);
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-10
        • 2019-09-10
        • 1970-01-01
        • 1970-01-01
        • 2012-09-27
        • 1970-01-01
        相关资源
        最近更新 更多