Java 使用文件#length()时超过两个字节
我试图通过一个简单的java程序读取我用Mac的textEdit(纯文本)编写的文本文件。我的代码可以概括为:Java 使用文件#length()时超过两个字节,java,file,io,size,Java,File,Io,Size,我试图通过一个简单的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(F
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();
}
}
}
publicstaticvoidmain(字符串[]args){
File File=新文件(“test.txt”);
long length=file.length();//在我的例子中是615
int i=0;
while(i
现在的问题是,我的文件中只有613个字符,而file.length()
返回615。从该方法的输出中可以看出,读取的最后两个字符是-1
我现在的问题是:这两个额外的字节可能来自哪里?我可以从长度中减去2来获得ASCII字符数吗
任何帮助都将不胜感激。通常有结束标记字符(或开始标记字符)
第一个:它似乎是文本(来自文本编辑器?)
第二:你得到的是二进制内容
filesize是操作系统上文件的大小。它可能取决于文件类型和操作系统。例如,unicode文件在开始时有BOM表
您的实际大小是使用FileInputStream(以字节数组形式)获得的
然后我认为613个字符就足够了,这正是你得到的
见此:
有帮助吗?通常有结束标记字符(或开始标记字符)
第一个:它似乎是文本(来自文本编辑器?)
第二:你得到的是二进制内容
filesize是操作系统上文件的大小。它可能取决于文件类型和操作系统。例如,unicode文件在开始时有BOM表
您的实际大小是使用FileInputStream(以字节数组形式)获得的
然后我认为613个字符就足够了,这正是你得到的
见此:
有帮助吗?文件开头可能有2个字符。有些编辑器会自动执行此操作。尝试用十六进制编辑器打开文件以查看2个字符。文件开头可能有2个字符。有些编辑器会自动执行此操作。尝试用十六进制编辑器打开文件以查看2个字符。似乎太明显了:textEdit将“…”转换为某个unicode字符,使ASCII假设无效。似乎太明显了:textEdit将“…”转换为某个unicode字符,使ASCII假设无效。恐怕我真的不明白。你是说我的文本中有一些unicode字符吗?你说“你得到的是二进制内容”是什么意思?恐怕我不太明白。你是说我的文本中有一些unicode字符吗?你说“你得到二进制内容”是什么意思?我做到了,前面没有添加任何内容,但我已经发现了我的错误。TextEdit将“…”转换为某种unicode字符,使得ASCII假设无效。我这样做了,前面没有添加任何内容,但我已经发现了我的错误。TextEdit将“…”转换为某些unicode字符,使ASCII假设无效。您的代码根本不涉及ASCII<代码>InputStreamReader
:。如果您认为文件包含ASCII编码的文本(不太可能),则应将其传递给InputStreamReader构造函数。您的代码根本不涉及ASCII<代码>InputStreamReader:。如果您认为文件包含ASCII编码的文本(不太可能),则应将其传递给InputStreamReader构造函数。