我有这段代码:
(此代码在另一个循环中,循环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
,循环应该在流结束时停止。但事实并非如此。该程序陷入了这个循环。
答案 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
时,您需要重新排序逻辑。
假设\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());
}
您需要停下来学习如何使用中的步调试器 你骑。如果您刚刚介入,这不是一个问题 你的代码并在事情不像你的地方放几个断点 想要或期望他们。