【问题标题】:Scanner cuts off my String after about 2400 characters扫描仪在大约 2400 个字符后切断我的字符串
【发布时间】:2011-02-22 21:00:52
【问题描述】:

我有一些非常基本的代码,比如

while (scan.hasNextLine())
{
    String temp = scan.nextLine();
    System.out.println(temp);
}

其中 scan 是对文件的扫描器。

但是,在一个大约 6k 字符长的特定行上,temp 在大约 2470 个字符之后被切断。什么时候切断没有什么特别的。它在“澳大利亚”这个词的中间。如果我从行中删除字符,则删除的位置会发生变化;例如如果我删除文件中的字符 0-100,那么 Scanner 将得到以前的 100-2570。

我以前使用过 Scanner 来处理更大的字符串。知道可能出了什么问题吗?

【问题讨论】:

    标签: java string java.util.scanner


    【解决方案1】:

    猜测一下,您可能在截止点有一个流氓角色:在十六进制编辑器中查看文件,而不仅仅是文本编辑器。也许有一个嵌入的空字符,或者字符串中间可能有\r?在我看来,Scanner.nextLine() 似乎不太可能随意砍它。

    另一个想法是,您是否 100% 确定它全部存在?也许 System.out.println 正在切断字符串 - 再次由于其中嵌入了一些“奇怪”字符?如果打印 temp.length() 会发生什么?

    编辑:我误解了如果你删掉一些字符会发生什么。对于那个很抱歉。需要检查的其他一些事项:

    • 如果您阅读带有BufferedReader.readLine() 而不是Scanner 的行,它会得到一切吗?
    • 您是否指定了正确的编码?我不明白为什么会以这种特殊方式出现,但值得考虑...
    • 如果将行中的所有字符替换为“A”(在文件中),这会改变什么吗?
    • 如果您在此行之前添加一个额外的行(或删除它之前的一行),这会改变什么吗?

    如果这一切都失败了,我只会调试到 Scanner.nextLine() - Java 的一大优点是您可以调试到标准库中。

    【讨论】:

    • 打印出来的长度肯定不是全部。对于上下文,这是一个从 Excel 导出的 .csv 文件,我正在 vim 中进行编辑。我认为那里没有任何特殊字符;正如我所说,如果我删除字符,截止点就会改变。因此,虽然它在“澳大利亚”中间切断,但如果我在“澳大利亚”、“澳大利亚”之前的某处删除 100 个字符,然后在它之后的大约 90 个字符打印就好了。下一行也发生了同样的事情,只是它在 112 而不是 2470 处中断。这是唯一不起作用的两行。有些行更长。
    • 刚刚在十六进制编辑器中查看了一下,没问题,只是 ascii 值。第二行在 't' 和撇号之间断开。
    • @Ventrue:大声笑 - 我只是添加了一个编辑以建议使用十六进制编辑器。唔。我添加了一些其他建议 - 但“调试它”可能会成为您所需要的......
    • 天哪,这是字符集。它正在读取 ASCII,文件是 ISO-LATIN。非常感谢。
    • @Ventrue:哇!诚然,这是一种非常奇怪的故障模式——撇号是非 ASCII 的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多