java - 为什么windows下文件第一行的第一个字符是0?

标签 java windows utf-8 nio

所以我正在读取 Java 中的纯文本文件,并且我想确定哪些行以“abc”开头。我做了以下事情:

Charset charset = StandardCharsets.UTF_8;
BufferedReader br = Files.newBufferedReader(file.toAbsolutePath(), charset);
String line;
while ((line = br.readLine()) != null) {
   if (line.startsWith("abc")) {
       // Do something
   }
}

但是如果文件的第一行是“abcd”,则不会匹配。通过调试我发现第一个字符是 0 (不可打印字符),因此它不匹配。为什么会这样?如何可靠地识别哪些行以“abc”开头?

编辑:也许我应该指出我正在使用记事本创建文件

最佳答案

Windows 在 UTF-8 方面存在一些问题,因此它是 UTF-8 BOM (Byte Order Mark) 的重度用户。 .

如果我的猜测是正确的,那么前三个字节将是(十六进制):0xef、0xbb、0xbf。

例如,考虑到 Excel 创建带有 BOM 前缀的 UTF-8 CSV 文件,如果记事本也这样做,我一点也不会感到惊讶...

编辑:毫不奇怪,情况似乎是这样:参见 here .

关于java - 为什么windows下文件第一行的第一个字符是0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16995935/

相关文章:

java - android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java :252) nullpointerexception

.net - 运行 Windows 应用程序的 Docker

java - 如何检测非法的 UTF-8 字节序列以在 java 输入流中替换它们?

javascript - Jquery从sqlite数据库获取西类牙口音时显示�符号

java - OpenCSV CsvToBean : First column not read for UTF-8 Without BOM

java - 使用 Rhino 传递 Class<?> 参数

java - 我们会通过隐式转换来降低精度吗

java - JAXBElement 优于 ArrayList?

c# - 如何检查使用 SetThreadExecutionState 禁用 sleep 是否失败?

c++ - 访问 Windows 声音?