大引号导致 Java Scanner hasNextLine() 为 false —— 为什么?

2023-11-25

我在让 java.util.Scanner 读取我在记事本中保存的文本文件时遇到问题,即使它与其他文件一起工作得很好。基本上,当它尝试读取问题文件时,它完全空手而归—— hasNextLine() 为假,缓冲区为空等。我将其范围缩小到这样一个事实:如果存在,它甚至不会读取第一行是一个弯引号anywhere在文件中。不会引发任何异常。请注意,同一文件上的 BufferedReader 没有问题。

try {        
    int count = 0;
    Scanner scanner = new Scanner(new File("C:/myfile.txt"));

    while (scanner.hasNextLine()) {
        count++;
        scanner.nextLine();
    }

    scanner.close();
    System.out.print(count);

    count = 0;
    BufferedReader reader = new BufferedReader(new FileReader("C:/myfile.txt"));

    while (reader.readLine() != null) {
        count++;
    }

    reader.close();
    System.out.print(count);
}
catch(IOException e) {
    e.printStackTrace();
}

上面的代码读取一个只包含一个大引号的文件,并打印出“01”。在谷歌上的搜索让我尝试了这个:

Scanner scanner = new Scanner(new File("C:/myfile.txt"), "ISO-8859-1");

这使它工作(即打印出“11”)。我还注意到,如果我进入记事本并执行“另存为”...底部的默认编码是“ANSI”。如果我将其更改为“UTF-8”并保存文件,那么扫描仪(没有编码)也可以工作。如果我告诉扫描仪“UTF-8”,那么可以理解的是,它仅在我保存为 UTF-8 时才有效,但即使我将其保存为“ANSI”,“ISO-8859-1”似乎也能使其工作。

所以,我知道这与文件编码有关,但问题是我对文件编码一无所知。我对“ISO-8859-1”含义的了解非常模糊;为什么无论我如何保存文件它都可以工作?为什么 BufferedReader 仍然可以工作?

EDIT:

下面的链接/评论确实帮助我指明了正确的方向!我想我已经弄清楚了。

首先,在记事本中:

  • “ANSI”是 CP1252
  • “Unicode”是UTF-16LE
  • “UTF-8”是......好吧,UTF-8

在十六进制中,大撇号表示为:

  • CP1252:92
  • UTF-16LE:1920
  • UTF-8:E2 80 99

根据 Charset.defaultCharset(),Java 在我的系统上使用的默认编码是 UTF-8。因此,当我以 UTF-8 格式保存文件时,扫描仪知道会发生什么。然而,当我将文件保存在 CP1252 中时,一旦遇到“92”,它就会卡住,因为它不是表示该编码中的字符的有效方式。只要文件中没有任何此类字符,它就可以正常工作——“hello world”的十六进制在 CP1252 和 UTF-8 中恰好相同,并且不会引起问题。

UTF-8 不适用于 UTF-16 文件,因为它不知道如何处理字节顺序标记(“FFFE”),无论文件中包含哪些字符。

另一方面,当我将扫描仪设置为 CP1252 或 ISO-8859-1 时,它的宽容度要高得多。它不一定解释字符正确地请注意,但是没有什么可以阻止它识别文件中的行并循环。

至于为什么 Scanner 有问题但 FileReader/BufferedReader 没有,我猜测这是因为扫描仪需要标记文件,即。解释字符,以便它可以识别空格和其他模式,因此当出现无法识别的内容时,它会感到窒息。读者不需要这样做。它需要识别的只是换行符。


如果您在创建扫描程序时未指定编码,它将尝试根据字节顺序标记 (BOM)(文件的前几个字节)来预测编码。如果没有,它将默认为操作系统使用的任何默认值。由于您使用的是 Windows,因此默认值为 cp-1252。看来记事本正在使用 ISO-8859-1 保存您的文本文件,它与 cp-1252 类似,但不一样。请参阅此链接了解更多详细信息:

http://www.i18nqa.com/debug/table-iso8859-1-vs-windows-1252.html

当您将其另存为 UTF-8 时,它可能会将 UTF-8 BOM 放在文件的开头,并且扫描仪可以识别它。

如果您想更多地了解 BOM,请在维基百科中查找 - 这篇文章非常好。您还可以下载 PSPad 并以十六进制模式打开文本文件以查看各个字节。希望有帮助:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大引号导致 Java Scanner hasNextLine() 为 false —— 为什么? 的相关文章

  • 经典的asp字符编码

    我在经典 asp 网站中遇到西班牙字符问题 用户可以在 aspx 页面上的表单中提交他们的姓名 地址 然后 aspx 页面将 ajax post 发送到经典的 asp 页面 它所做的所有操作都存储在我们的 Sql 2008 DB 中 我可以
  • JavaFX 图像未在舞台中显示

    我尝试了很多次 尝试了很多方法 但都无法让自己的形象在舞台上如我所愿 我认为这可能与java寻找资源的路径有关 但我不确定 因为我刚刚开始使用视觉库 在本例中为JavaFX 这是我的目录结构 MyProject assets img myI
  • 在Java中使用命令行编译多个包

    您好 我一直在使用 IDE 但现在我需要从命令行运行和编译 问题是我有多个软件包 我试图找到答案 但没有任何效果 所以我有 src Support java files Me java files Wrapers java files 你知
  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • 在哪里可以获得有关 Java FitNesse 和 Slim 的一些教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java、Oracle 中索引处缺少 IN 或 OUT 参数:: 1 错误

    您好 我使用 Netbeans 8 0 2 和 Oracle 11g Express Edition 在 JSF 2 2 中编写了一个图书馆管理系统 我有几个名为 书籍 借阅者 等的页面 以及数据库中一些名为相同名称的表 我的问题是这样的
  • Spring3/Hibernate3/TestNG:有些测试给出 LazyInitializationException,有些则没有

    前言 我在单元测试中遇到了 LazyInitializationException 的问题 而且我很难理解它 正如你从我的问题中看到的那样Spring 中的数据库会话 https stackoverflow com questions 13
  • 将过滤器添加到 Eclipse 中的 Project Explorer

    我想向 Project Explorer 添加一个新的过滤器 以向用户隐藏一些在 Eclipse RCP 应用程序中自动创建的项目 到目前为止我已经找到了两个扩展点 org eclipse ui ide resourceFilters 允许
  • RMI 中的引用传递问题? [复制]

    这个问题在这里已经有答案了 有人可以告诉我我错在哪里 为什么这个 RMI 聊天应用程序不起作用 目标是通过远程对象或序列化对象实现客户端 服务器和逻辑之间的解耦 import javax swing import java awt even
  • 是否有任何API可以将Microsoft Exchange服务器与Java应用程序集成以进行任务同步?

    我正在尝试将 Java Web 应用程序与 Microsoft Exchange 服务器集成以实现双向日历 即任务 同步 是否有用于此集成的 Java 开源 商业 API 谢谢 文卡特 看一眼j 交易所 http sourceforge n
  • 定期更新 SWT 会导致 GUI 冻结

    Problem 当 GUI 字段定期更新时 SWT 会冻结 我想要一个基于 SWT 的 GUI 其中文本字段的值会定期递增 最初我从单独的线程访问 textField 导致抛出异常 线程 Thread 0 org eclipse swt S
  • 如何导入 org.apache.commons.lang3.ArrayUtils;进入 Eclipse [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我如何导入 org apache commons lang3 ArrayUtils 将库添加到 Ecl
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某
  • 线程“main”中的异常 java.lang.StackOverflowError

    我有一段代码 但我无法弄清楚为什么它在线程 main java lang StackOverflowError 中给出异常 这是问题 Given a positive integer n prints out the sum of the
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • 带有 OpenId 提供程序的 Java Spring 安全性

    我有一个 spring MVC 应用程序 另一个客户端应用程序想要使用 open id connect 访问我的 spring 应用程序 如何在服务器端实现开放ID提供商 请帮忙 MITREid 连接 OpenID Connect Java
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne
  • 为什么范围为“provided”的依赖项会隐藏 Maven 中的传递依赖项?

    我的 Maven 项目中有三个模块 这稍微简化了 model包含JPA注释的实体类 坚持实例化一个实体管理器并调用它的方法 应用创建类的实例model 设置一些值并将它们传递给坚持 model and 坚持显然取决于javax persis

随机推荐

  • 如何为另一个数据库执行存储过程?

    我有一个存储过程 应该能够在我的 MS Sql Server 上的任何数据库的任何表上执行 大多数 EXEC 和 USE 语句的组合不会产生任何结果 这是存储过程 CREATE PROCEDURE dbo usp TrimAndLowerC
  • R 成对乘积

    我正在尝试获取向量的成对乘积 例如 a c 1 2 3 4 我想要得到的是 2 3 4 6 8 12 按顺序 我尝试过使用外部 outer 1 4 2 4 这给了我一个矩阵 其中包含我想要的产品 但我不确定如何以缩放到更高维度向量的方式从矩
  • 在具有大型 C 文件的 vim 中启用语法和语法折叠会导致完成速度变慢

    当我在一个大的 C 文件 大约 8000 行中有语法时 完成ctrl p和ctrl n非常慢 超过20 当我关闭语法时 完成时间不到一秒钟 我找到了重现这种行为的最小方法 使用空的 vim 文件夹并创建仅包含以下行的 vimrc set s
  • 如何让CSV阅读器读取内存文件?

    我正在尝试将整个文件提取到内存中 完成 使用 StringIO 但据我所知 这些对象的行为并不完全像 真实 文件 我得到了整个内容 或者我可以读取一次一行 但我不知道如何应用此模式 import csv with open MYMEMORY
  • 如何使用 simple_form 生成 input[type=date]?

    当我做f input start date as date我得到 3 个选择元素 日 月和年 我可以f input start date as string to get input type text 元素 但我怎样才能生成input t
  • 订阅或绑定现有的Intent服务

    我有一个应用程序 它的初始活动会在列表视图中列出一些文件 单击列表中的某个项目时 您将看到该特定文件的详细活动 在详细视图中 我有一个名为下载的按钮 当您单击下载时 它会启动一个 IntentService 该 IntentService
  • 第一次使用 MongoDB + Docker - 从 docker compose 设置

    我想尝试一下project我在 GitHub 上找到了 所以我在 MacOS 上安装了 MongoDB 现在我试图了解如何通过目录中的 docker compose 文件正确设置它 这是泊坞窗文件 version 3 services re
  • 代码完成不适用于远程文件(使用 RSE)

    What is 在主机上 Windows 7的 面向 PHP 开发人员的 Eclipse版本 Helios 服务版本 2 在访客机器上 Linux Debian 挤压 我想使用 RSE 在 Eclipse 中通过 SSH 编辑我的远程项目
  • 我什么时候应该使用 Perl 的 AUTOLOAD?

    In Perl 最佳实践 AUTOLOAD 部分的第一行是 不要使用自动加载 然而 他描述的所有案例都涉及面向对象或模块 我有一个独立的脚本 其中一些命令行开关控制定义特定函数的哪些版本 现在我知道我可以将条件和评估放在文件顶部 然后再进行
  • 您可以覆盖 scala @serialized 对象中的流编写器吗?

    我现在明白了 scala serialized 对象可以像 Java Serialized 对象一样使用 在 Java Serialized 对象中 您可以重写一些方法来更改对象的流式传输方式 writeObject ObjectOutpu
  • 如何在 JavaScript 中使用 ISO 8601 格式化带有时区偏移的日期?

    Goal 找出local time and UTC time offset然后按以下格式构造 URL 示例网址 Actions Sleep duration 2002 10 10T12 00 00 05 00 该格式基于W3C 推荐 文档说
  • 将 Cassandra BoundStatement 的 ResultSet 映射/转换/转换为使用对象映射 API 构建的 Java 类的最有效方法是什么?

    DataStax Java for Apache Cassandra 中是否有内置方法可以将来自 BoundStatement 的 ResultSet 映射到使用对象映射 API 构建的域对象 Java 类 我是从 Mapper Acces
  • div 清除后 IE 中的额外垂直空间

    我通过左浮动创建了一个简单的 div 网格 并在每行末尾创建了一个空的 div 这在 Firefox 中工作正常 但在 IE 中我在行之间获得了额外的垂直空间 我尝试应用 clearfix 方法 但我一定做错了什么 为什么 IE 会插入多余
  • 跟踪 Python 导入

    我的 Python 库刚刚更改了它的主模块名称foo bar to foobar 为了向后兼容 foo bar仍然存在 但导入它会引发一些警告 现在 似乎一些示例程序仍然从旧模块导入 但不是直接导入 我想找出错误的地方import陈述 有没
  • U后缀的含义

    后缀 或后缀 有什么作用U以下值的平均值 0U 100U 它代表unsigned 声明常量时 还可以指定其类型 另一个常见的例子是L 这代表long 并且您必须将其放置两次才能指定 64 位常量 例子 1ULL 它有助于避免显式强制转换
  • 如何打乱 ArrayList [重复]

    这个问题在这里已经有答案了 我需要一些帮助来编写一个对 ArrayList 进行洗牌的方法 我不知道该在我的方法中放置什么 这是我到目前为止所拥有的 我尝试使用随机方法来随机化列表中的整数 但这不起作用 有人可以告诉我该怎么做吗 这是我尝试
  • 随机数生成最安全的种子是什么?

    为随机数生成器提供种子的最安全的熵源是什么 这个问题与语言和平台无关 适用于网络上的任何机器 理想情况下 我正在寻找云环境中的机器或托管公司提供的服务器可用的资源 有两个重要的弱点需要记住 使用时间发送随机数生成器违反了CWE 337 使用
  • 如何使用 JavaScript 将所有计算的 CSS 样式从一个元素移动到另一个元素?

    我有一个外部样式表 它将某些样式应用于给定元素 我希望能够将这些样式 使用 JavaScript 完全移动到不同的元素 而无需事先了解正在应用的样式 The CSS td padding 5px div HTML td div Apply
  • Grails 域类必须与数据库绑定吗?

    对于 grails 来说 我是一个十足的菜鸟 对于 groovy 来说 我还是一个菜鸟 所以如果这是一个愚蠢的问题 我深表歉意 我正在构建一个简单的 Web 应用程序 我想根据文件系统对象 即目录结构和文件类型 而不是数据库数据来控制应用程
  • 大引号导致 Java Scanner hasNextLine() 为 false —— 为什么?

    我在让 java util Scanner 读取我在记事本中保存的文本文件时遇到问题 即使它与其他文件一起工作得很好 基本上 当它尝试读取问题文件时 它完全空手而归 hasNextLine 为假 缓冲区为空等 我将其范围缩小到这样一个事实