【问题标题】:Java text file size (before file is closed)Java 文本文件大小(文件关闭前)
【发布时间】:2011-11-21 15:59:02
【问题描述】:

我正在从一项服务收集完整的 HTML,该服务提供对大量博客和新闻网站的访问。我正在(实时)检查 HTML 以查看它是否包含一些关键字。如果它包含其中一个关键字,我会将 HTML 写入文本文件以存储它。

我想这样做一个星期。因此,我正在收集大量数据。对该程序进行 3 分钟的测试,生成了一个 100MB 的文本文件。我有 4 TB 的空间,我不能使用更多的空间。

另外,我不希望文本文件变得太大,因为我认为它们会变得无法打开。

我的建议是打开一个文本文件,然后将 HTML 写入其中,并经常检查其大小。如果它变得大于,比如说 200MB,我关闭文本文件并打开另一个。我还需要记录我总共使用了多少空间,这样我就可以确保我不会接近 4 TB。

此时我的问题是如何在文件关闭之前检查文本文件的大小(使用 FileWriter.close())。是否有此功能,或者我应该计算写入文件的字符数并使用它来估计文件大小?

另一个问题:有没有办法最小化我的文本文件占用的空间?我正在使用 Java。

【问题讨论】:

  • 一个单独的问题应该是一个单独的问题。

标签: java file filewriter file-writing


【解决方案1】:

创建一个计算写入字符数的写入器,并使用它来包装您的OutputStreamWriter

[EDIT] 注意:将文本保存到文件的正确方法是:

new BufferedWriter( new OutputStreamWriter( new FileOutputStream( file ), encoding ) ) );

编码很重要;它通常是“UTF-8”。

此链为您提供了两个可以注入包装器的位置:您可以包装 writer 以获取字符数或内部 OutputStream 以获取写入的字节数。

【讨论】:

  • 好的,谢谢。我会试试这个。我怎么知道一个字符需要多少字节?
  • 如果处理英文网页,每个字符占用一个字节。 UTF-8 编码非常紧凑。但是你也可以包装你的FileOutputStream,它会为你提供字节。
  • 好的。我将尝试对此进行试验。我要计算字符的方式(也许这不是正确的方式)是通过对我写入文件的每个字符串使用 Java 字符串长度方法来保持运行总数
【解决方案2】:

我继续 Aaron 的回答。您可以使用CountingOutputStream:只需使用 CountingOutputStream 包装您的 FileOutputStream,您就可以知道您已经写入了多少字节。

【讨论】:

    【解决方案3】:

    为了最小化空间,您可以使用 Java zip 您的文本文件。为什么不在关闭后将每个文件添加到 zip 中。压缩后,您可以检查 zip 的大小以查看您的累积存储消耗。

    【讨论】:

      【解决方案4】:

      HTML 很容易以高压缩比进行压缩。考虑使用GZIPOutputStream 来“减少文本文件占用的空间”。

      【讨论】:

        【解决方案5】:

        你有没有想过要计算你写入文件的字节数?

        【讨论】:

        • 我想这基本上是我想要做的,我想我通过计算写入文件的字符数来做到这一点,正如 Aaron 所建议的那样。
        • 是的,我也投票支持 Aaron 的答案。我认为这就是这样做的方法。
        【解决方案6】:
        import java.io.File;
        import java.io.FileWriter;
        import java.io.IOException;
        
        
        public class TestFileWriter {
        
            /**
             * @param args
             * @throws IOException 
             */
            public static void main(String[] args) throws IOException {
                FileWriter fileWriter= new FileWriter("test.txt");
                for (int i=0; i<1000; i++) {
                    fileWriter.write("a very long string, a very long string, a very long string, a very long string, a very long string\n");
                    if ((i%100)==0) {
                        File file=new File("test.txt");
                        System.out.println("file size=" +  file.length());
                    }
                }
                fileWriter.close();
                File file=new File("test.txt");
                System.out.println("file size=" +  file.length());
        
            }
        
        }
        

        此示例演示如果您使用文件写入器,您可以在写入时实时获取文件大小,并且写入器打开。如果你想节省空间,你可以压缩流。

        【讨论】:

          【解决方案7】:

          抱歉有点跑题了:

          它必须是Java吗?根据您获取提要数据的方式,这对我来说听起来像是一个相当简单的 shell 脚本的工作(grepfgrep 用于检查关键字,gzip 用于压缩......)

          【讨论】:

          • 我认为最好还是坚持 Java,因为我对 Java 相当了解,其他的都是用 Java 编写的
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-26
          • 1970-01-01
          • 2021-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多