扫描仪在大约 2400 个字符后切断我的字符串

Posted

技术标签:

【中文标题】扫描仪在大约 2400 个字符后切断我的字符串【英文标题】:Scanner cuts off my String after about 2400 characters 【发布时间】: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 来处理更大的字符串。知道可能出了什么问题吗?

【问题讨论】:

【参考方案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 的吗?

以上是关于扫描仪在大约 2400 个字符后切断我的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何扫描 N 个字符串(使用结构),然后反向输出该字符串列表?

什么时候应该关闭扫描仪?

iOS开发 - NSScanner的使用方法

如何在 20 个字符后切断文本视图?

由于一个简单的 IN 语句,大量的全表扫描(大约 600 次)

leetcode 1081