我有一段代码:
(此代码位于另一个循环中,即循环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,当流结束时,循环应该停止。但事实并非如此。程序被困在这个循环中。
发布于 2015-04-10 21:09:31
你的问题还不清楚,但如下所述:
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对实际上存在于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());
}您需要停止并学习如何使用IDE中的步骤调试器。这将不是一个问题,如果您只是通过您的代码,并放置了一些断点的事情不是您想要或预期的。
https://stackoverflow.com/questions/29570310
复制相似问题