两个字节太多使用 File#length()

two bytes too much using File#length()

我试图通过一个简单的 java 程序读取我用 Mac 的 textEdit(纯文本)编写的文本文件。我的代码可以概括为:

public static void main(String[] args) {
    File file = new File("test.txt");
    long length = file.length();         // in my case 615

    int i = 0;
    while(i < length) {
        try(FileInputStream fis = new FileInputStream(file);
            InputStreamReader reader = new InputStreamReader(fis)) {
                // NOTE: fis.available() == length
                reader.skip(i);
                System.out.printf("Character at position %d is %d\n", i, reader.read());
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

现在的问题是我的文件中只有 613 个字符,而 file.length() return 615。读取的最后两个字符是 -1,如输出中所示从这个方法。

我现在的问题是:这 2 个额外的字节可能来自哪里?我可以从 length 中减去 2 以获得 ASCII 字符的数量吗?

如有任何帮助,我们将不胜感激

经常有结束符(或开头)。

第一个:它似乎是文本(来自文本编辑器?)。

其次:您获得二进制内容。

filesize 是 OS 上文件的大小。它可以取决于文件类型和 d OS。例如,unicode 文件在开头有 BOM。

当您使用 FileInputStream(在字节数组中)获得它时,您的实际大小是。

然后我认为 613 个字符就足够了,这正是您所得到的。

看到这个:Charaters/Bytes count and File size on Windows properties difference

有帮助吗?

您的文件开头可能有 2 个字符 byte order mark。一些编辑器会自动执行此操作。尝试使用十六进制编辑器打开文件以查看 2 个字符。

这似乎太明显了:textEdit 将“...”转换为一些 unicode 字符,使 ASCII 假设无效。