今天有人告诉我,在写入文件时,您写入的编码无关紧要。我对编码知之甚少,但考虑到编码仅用于阅读/查看,这听起来很合理?
从文件中读取字节的编码是否重要?那里的编码仅用于解析/显示吗?
前任。
var bytes = getFileBytes();
bytes.remove(new byte[] { 232, 211 });
anotherStream.writeBytes(bytes);
// I'm assuming that Encoding is irrelevant
今天有人告诉我,在写入文件时,您写入的编码无关紧要。我对编码知之甚少,但考虑到编码仅用于阅读/查看,这听起来很合理?
从文件中读取字节的编码是否重要?那里的编码仅用于解析/显示吗?
前任。
var bytes = getFileBytes();
bytes.remove(new byte[] { 232, 211 });
anotherStream.writeBytes(bytes);
// I'm assuming that Encoding is irrelevant
我认为有人可能会告诉您,如果您必须在编码之间进行选择,那么只要坚持下去,您选择哪一种都没有关系。
这显然忽略了编码效率等问题(如果其中一个以更少的字节存储您的典型数据,那么显然使用它)。
考虑相反的情况 - 您可以使用一种编码写入,然后 (a) 忘记读回数据或 (b) 错误地读取数据。
举一个人为的例子,假设i
由于某种原因您不能在数据文件中使用小写字母。因此,要存储它,您需要以某种方式对其进行编码。您决定将其存储为\48
. 但是现在,你如何\48
明确地表示文字序列,你应该需要吗?啊哈,您的编码也可以适应这一点:将任何文字反斜杠存储为\5C
. 但是当然,当你重新读入文件时,你必须解码这个编码,否则你会得到错误的字节。(ThÁ&sÁ&s 比你想象的更常见!)
当您只是从文件中读取字节并且不尝试将这些字节解释为文本时,编码并不重要。例如,如果您想将文件复制到另一个文件或将文件复制到套接字,则可以放心地忽略编码。显然,如果流包含二进制int
数据,例如二进制形式的 s 序列,您也不需要编码。你的例子也是完全有效的,除非你不理解232
和211
字节作为字符。
但是,当您开始将某个文件(或任何字节序列,例如字节数组)解释为text时,您就不能忽略编码,因为字节只能通过某种编码方式转换为字符。当然,在使用类似的东西时通常可以不指定编码FileReader
,但是,在这种情况下,编码是隐式指定的,通常使用您的语言环境编码作为默认值。因此,从字节流(例如 via )加载字符数据时,最好始终指定您打算使用的编码InputStreamReader
,这样实际的编码将不依赖于您运行程序的系统。