gpt4 book ai didi

java - 从 InputStream 读取 - 陷入循环

转载 作者:行者123 更新时间:2023-12-01 11:40:28 28 4
gpt4 key购买 nike

我有这段代码:
(此代码在另一个循环内,即循环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 循环应该在流结束时停止。但事实并非如此。程序陷入了这个循环。

最佳答案

您的问题不清楚,但这里是:

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

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

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

你也说了

the cycle should stop when the stream ends. But it doesn't. The program is stuck inside that cycle.

如果最后两个字节永远不会\r\n,或者如果流永远不会关闭,它永远不会结束并且会丢弃最后 \n 不管怎样!

那么到底是循环永远不会结束还是 \n 永远不会被追加?

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

垃圾进垃圾出:

假设您的InputStream中实际上有\r\n对。你确定它们在那里吗?,步骤调试会告诉你你肯定!

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());
}

You need to stop and learn how to use the step debugger that is in your IDE. This would not be a question if you just stepped through your code and put a few break points where things were not as you wanted or expected them.

关于java - 从 InputStream 读取 - 陷入循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29570310/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com