java.io.StringReader.read() (Java 8) returns 字符串末尾出现意外字符
java.io.StringReader.read() (Java 8) returns unexpected character at the end of the String
此问题导致以下代码摘录中出现无限循环:
public static final List<String> extractTags(String source, Integer nTags) {
List<String> tags = new ArrayList<>();
try (StringReader stringReader = new StringReader(source)) {
String tag = "";
char c;
while ((c = (char) stringReader.read()) >= 0 && tags.size() < nTags) {
switch (c) {
case '<':
tag = "";
break;
case '>':
tags.add(tag);
break;
default:
tag = tag + c;
break;
}
}
} catch (IOException e) {
} finally {
return tags;
}
}
如果使用以下参数调用:
来源 = "trash"
nTags = 2
使用调试器我意识到在字符串完全迭代后,read() 方法 returns char '\uFFFF' 65535 永远。所以我的问题是为什么?
谢谢!
因为 stringReader.read()
正在为流的结尾返回 -1
,但是您将其转换为 char
,这是 Java 中唯一的无符号数据类型。因此,您得到的不是 -1
而是 65535
作为流的结尾,因此永远不会中断 while 循环。
您可能希望将读取的内容转换为char
循环内,而不是在 while 条件下。
细化
countTags(字符串来源); => 使用此方法仅对标签进行计数。
extractTags(String source) => 识别你的标签是什么或你的标签不是什么,然后提取标签或提取标签不是。
重建不带标签的字符串/提取时重建.. StringBuilder/StringReader 不是必需的。
一些有趣的事情:您可以在开始时和结束时执行 string.length 并减去提取方法中的标签数,这将为您提供计数。
你也不需要 while 循环
对于您的实际问题:您可能需要查看需要转义的字符。
此问题导致以下代码摘录中出现无限循环:
public static final List<String> extractTags(String source, Integer nTags) {
List<String> tags = new ArrayList<>();
try (StringReader stringReader = new StringReader(source)) {
String tag = "";
char c;
while ((c = (char) stringReader.read()) >= 0 && tags.size() < nTags) {
switch (c) {
case '<':
tag = "";
break;
case '>':
tags.add(tag);
break;
default:
tag = tag + c;
break;
}
}
} catch (IOException e) {
} finally {
return tags;
}
}
如果使用以下参数调用: 来源 = "trash" nTags = 2
使用调试器我意识到在字符串完全迭代后,read() 方法 returns char '\uFFFF' 65535 永远。所以我的问题是为什么?
谢谢!
因为 stringReader.read()
正在为流的结尾返回 -1
,但是您将其转换为 char
,这是 Java 中唯一的无符号数据类型。因此,您得到的不是 -1
而是 65535
作为流的结尾,因此永远不会中断 while 循环。
您可能希望将读取的内容转换为char
循环内,而不是在 while 条件下。
细化 countTags(字符串来源); => 使用此方法仅对标签进行计数。 extractTags(String source) => 识别你的标签是什么或你的标签不是什么,然后提取标签或提取标签不是。
重建不带标签的字符串/提取时重建.. StringBuilder/StringReader 不是必需的。
一些有趣的事情:您可以在开始时和结束时执行 string.length 并减去提取方法中的标签数,这将为您提供计数。
你也不需要 while 循环
对于您的实际问题:您可能需要查看需要转义的字符。