从InputStream读取 - 卡在循环中

时间:2015-04-10 20:40:38

标签: java inputstream

我有这段代码:
(此代码在另一个循环中,循环3次)

            ...
            text = "";
            while((c = is.read())!=-1){ 
                if(prev == '\r' && c == '\n'){
                    break;
                }
                text = text + (char) c;  
                prev = (char) c;
            }
            System.out.println(text);
            ...

is是InputStream,c是int,prev是char

使用此代码,我从InputStream构建一个字符串。每当我得到\ r \ n时,读数应该停止。然后它重新开始。除了一件事,一切都很好。我得到的流看起来像这样:

1233\r\n544\r\nX
此输入流后没有分隔符

有了这个,我从第一个循环得到字符串1233,从第二个循环得到字符串544。但是我不会得到最后的X,因为周期不会停在那里 - 我不知道为什么。我认为,对于is.read()=!-1,循环应该在流结束时停止。但事实并非如此。该程序陷入了这个循环。

1 个答案:

答案 0 :(得分:1)

您的问题尚不清楚,但请注意:

while( ( c = is.read() ) != -1 )
{ 
    if(prev == '\r' && c == '\n')
    {
        break;
    }
    text = text + (char) c;  
    prev = (char) c;
}

注意执行顺序。检查\r\n并退出循环,然后将当前字符追加到text

你觉得这个逻辑有什么问题吗?

你也说过

  

当流结束时,循环应该停止。但它并没有。该   程序被困在那个循环中。

如果最后两个字节从不\r\n流永远不会关闭,它将永远不会结束,它将丢弃最后一个\n无论哪种方式!

那么循环永远不会结束或\n永远不会被追加?

如果您希望循环在流的末尾结束,在检测到\r\n时,您需要重新排序逻辑。

Garbage Out Garbage Out:

假设\r\n中确实存在InputStream对。您确定它们在那里吗?步骤调试会告诉您一定的!

public static void main(final String[] args)
{
    final InputStream is = System.in;
    final StringBuilder sb = new StringBuilder(1024);
    try
    {
        int i;
        while ((i = is.read()) >= 0)
        {
            sb.append((char)i);
            if (sb.substring(sb.length()-2).equals("\r\n"))
            {
                break;
            }
        }
    }
    catch (final IOException e)
    {
        throw new RuntimeException(e);
    }
    System.out.print(sb.toString());
}
  

您需要停下来学习如何使用中的步调试器   你骑。如果您刚刚介入,这不是一个问题   你的代码并在事情不像你的地方放几个断点   想要或期望他们。