我正在编写一个程序(用Java),该程序必须删除文件的一半字节,但是要顺序删除。删除每个偶数(或不均匀)字节。
我正在使用以下方法来检索所有字节:
byte[] fileContent = Files.readAllBytes(file.toPath());
从文本文件中,使用System.out.println(fileContent[i]);
将输出目标字节的相应ASCII码。
我总是得到ASCII码吗?我不知道文件的结构如何工作。
最后,我无法通过循环byte[] fileContent
并跳过1/2个元素来成功完成循环以写入新文件。
相反,我从char[] fileContentChar
中创建了byte[] fileContent
,并从其中写了一个。
答案 0 :(得分:4)
“我总是得到ASCII码吗?”的简短答案。是:否。您不能对文本文件的字符编码做任何假设。有太多格式(ASCII,UTF8,UTF16,ISO-8859-1,Unicode等。请参见https://en.wikipedia.org/wiki/Character_encoding),如果文本为7位(ASCII)或UTF8等。
字符和字节不相同(就位长而言,取决于平台)。在Java中,char是2个字节(16位),字节是1个字节(8位)。
有一些技巧来猜测文本文件使用的编码。例如,如果您采样100个字节,并且从未设置高位,则可能为7位ASCII(b&0x80)。如果文件以3字节的前导码/签名(0xEF,0xBB,0xBF)开头,则可能是UTF8。 (UTF8每个字符1到4个字节;查看第一个字节的高位。)Java默认情况下使用UTF16(2个字节)。请查看此资源以获取更多详细信息(http://unicode.org/faq/utf_bom.html)。
祝你好运!