两个字节太多使用 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 假设无效。
我试图通过一个简单的 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 假设无效。