为什么我的文本文件比二进制文件大?

Why is my text file larger than my binary file?

我正在尝试将大型文本文件写入二进制文件,但二进制文件与我的文本文件大小相同。我以为写入二进制文件会压缩它?写入二进制文件是否更有效率?如何最小化我的文本文件的存储空间以供使用?

ArrayList<String> strArr = new ArrayList<String>();
File f = new File("words.txt");
BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
  
DataOutputStream out = new DataOutputStream (
                       new BufferedOutputStream(
                       new FileOutputStream("word.ser")
                    
                       )); 
                       
byte[] buffer = new byte[8192]; // or more, or even less, anything > 0
int count;
while ((count = in.read(buffer)) > 0) {
  out.write(buffer, 0, count);
}
in.close();
out.close();
/*ObjectOutputStream oos = new ObjectOutputStream(
                         new BufferedOutputStream(
                         new FileOutputStream("words.ser")

                         )); */
System.out.println(f.length());
File file = new File("words.ser");
System.out.println(file.length());

要压缩文件,您可以例如gzip它。

在 Java 中,您可以这样做:

Path inFile = Paths.get("words.txt");
Path outFile = Paths.get("words.txt.gz");
try (OutputStream out = new GZIPOutputStream(Files.newOutputStream(outFile))) {
    Files.copy(inFile, out);
}

你糊涂了。

至少对于硬盘/文件系统来说,没有 'text' 文件或 'binary' 文件这样的东西。这是一袋字节。他们都是。只是..字节。

现在,如果字节恰好形成一个序列,比方说,如果您从 'file open' 菜单中选择该文件,Microsoft Word 将正确读入,我们可能会说 'this is a Word file'。文件系统绝对不关心这些琐碎的人类事物。它被要求在名为 'foo.doc' 的文件中提供字节,它照做了。它以完全相同的方式执行此操作,如果 word 要求文件系统为其提供 'foo.txt' 或 'foo.jpg' 中的字节。如果字节对它没有意义,它就会崩溃。

那么,什么是 'text file'。同样适用:如果一个文本编辑工具要求文件系统打开一个文件,并且它 'works',我想我们可以称它为文本文件。对于文件系统,它..只是一个文件。

现在您知道为什么将文件作为 OutputStream 或 BufferedWriter 或其他方式发送没有区别了。这只是修改了字符以字节形式结束的精确机制。假设它是简单的 ASCII 字符,每个字符 1 个字节,就这么简单。

如果你想让它更小,你必须使用压缩算法,比如 gzip。请注意,很明显,随机数据不能被压缩。您获得的唯一 'compression' 量是数据中固有的 non-entropy 量,您的压缩算法可以设法找到这些数据并将其编码为更有效的形式。另一个答案显示了一种简单的方法。