【问题标题】:Why is my text file larger than my binary file? [closed]为什么我的文本文件比我的二进制文件大? [关闭]
【发布时间】:2020-09-20 00:46:16
【问题描述】:

我正在尝试将大文本文件写入二进制文件,但二进制文件与我的文本文件大小相同。我认为写入二进制文件会压缩它?写入二进制文件是否更有效?我怎样才能最大限度地减少我的文本文件的存储以供使用?

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());

【问题讨论】:

  • 为什么将字节写入文件会压缩它?仅当有代码进行压缩时才会发生压缩。你没有任何这样的代码。 --- 此外,您正在将文本文件作为二进制文件读取,因此您只是在制作文件的二进制副本。
  • 所有信息都是二进制的。所指的“文本”只是对如何组织内部位以反映可读字符的描述。如果您尝试打印一个可执行文件,其中一些将被解释为文本,即使它们可能不是。
  • 文件变小与压缩无关,压缩是指算法使用优化技术来保存数据,有关压缩的更多信息,请阅读本文:techopedia.com/definition/892/…
  • @RIVERMAN2010 如果您将字母表写入文本文件并查看其大小,它将为 26。我从未听说过 eof 字符用于此目的。通常,文件的结尾由驱动程序在文件属性表条目或不同文件系统中的其他等效项所描述的结尾时确定。
  • 您的标题说“文本”文件大于“二进制”文件;问题的主体说它们的大小相同。混乱?

标签: java text-files binaryfiles fileoutputstream


【解决方案1】:

你很困惑。

至少对于硬盘/文件系统而言,没有“文本”文件或“二进制”文件之类的东西。这是一个字节包。他们都是。只是..字节。

现在,如果字节碰巧形成一个序列,例如,如果您从“文件打开”菜单中选择该文件,Microsoft Word 将正确读取该文件,我们可能会说“这是一个 Word 文件”。文件系统完全不关心这些琐碎的人类事物。它被要求在一个名为“foo.doc”的文件中提供字节,它就这样做了。它以与 word 要求文件系统将“foo.txt”或“foo.jpg”中的字节提供给它的方式完全相同的方式执行此操作。如果字节对它没有意义,则由单词来崩溃。

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

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

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

【讨论】:

    【解决方案2】:

    要压缩文件,您可以例如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);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 2021-06-26
      • 2012-01-25
      • 2011-01-22
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多