有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我试图将一个大文本文件写入一个二进制文件,但二进制文件的大小与我的文本文件相同。我以为写入二进制文件会压缩它?写入二进制文件是否更高效?如何最大限度地减少文本文件的存储空间

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

共 (2) 个答案

  1. # 1 楼答案

    你很困惑

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

    现在,如果字节恰好形成了一个序列,比如说,如果你从“文件打开”菜单中选择该文件,Microsoft Word将正确读入,我们可以说“这是一个Word文件”。文件系统完全不关心这些琐碎的人类事物。它被要求在名为“foo”的文件中提供字节。博士,它做到了。它这样做的方式与word要求文件系统提供来自“foo”的字节时完全相同。txt或foo。jpg'。如果字节对它没有意义,则由word崩溃

    那么,“文本文件”是什么呢。同样的道理也适用:如果一个文本编辑工具要求文件系统打开一个文件,并且它“工作”,我想我们可以称之为文本文件。对于文件系统,它是。。只是一个文件

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

    如果你想让它更小,你必须使用压缩算法,比如gzip。请注意,显然,随机数据无法压缩。你得到的唯一“压缩”量是数据中固有的非熵量,你的压缩算法可以设法找到这些数据并将其编码成更有效的形式。另一个答案显示了一种简单的方法

  2. # 2 楼答案

    要压缩一个文件,你可以压缩它

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