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

问题描述

我正在尝试将大型文本文件写入二进制文件,但是二进制文件的大小与我的文本文件相同。我以为写入二进制文件会压缩它?写入二进制文件更有效吗?如何最大程度地减少文本文件的使用空间?

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,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);
}
,

你很困惑。

至少在硬盘/文件系统中没有“文本”文件或“二进制”文件。这是一袋字节。他们都是。只是..字节。

现在,如果字节恰好形成一个序列,例如,如果您从“文件打开”菜单中选择该文件,则Microsoft Word将正确读取,我们可以说“这是Word文件”。对于如此琐碎的人类事物,文件系统根本不关心任何东西。它被要求在名为“ foo.doc”的文件中提供字节,并且这样做。这样做的方式与单词要求文件系统提供来自“ foo.txt”或“ foo.jpg”的字节的方式完全一样。如果字节没有意义,则要死机。

那么,什么是“文本文件”。同样适用:如果文本编辑工具要求文件系统打开文件,并且文件“正常”运行,我想我们可以称其为文本文件。对于文件系统,它只是一个文件。

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

如果希望它更小,则必须使用压缩算法,例如gzip。注意,显然,随机数据无法压缩。您获得的唯一“压缩”量是压缩算法可以设法找到并编码为更有效形式的数据中固有的非熵数量。另一个答案显示了一种简单的方法。