Java文本文件大小(在文件关闭之前)

4
我正在收集一个提供访问大量博客和新闻网站的服务的完整HTML。我正在实时检查HTML以查看它是否包含一些关键词。如果它包含其中一个关键词,我将HTML写入文本文件中进行存储。
我希望这样做一周。因此,我正在收集大量数据。测试程序3分钟后生成了100MB的文本文件。我有4TB的空间,不能使用更多。
此外,我不希望文本文件变得太大,因为我认为它们将无法打开。
我的建议是打开一个文本文件,并将HTML写入其中,频繁地检查其大小。如果它变得比200MB大,我就关闭文本文件并打开另一个。我还需要保持运行日志,记录我已经使用了多少空间,以便确保我不会接近4TB。
我此时的问题是如何在文件关闭之前(使用FileWriter.close())检查文本文件的大小。是否有此功能或者我应该计算写入文件的字符数并用它来估算文件大小?
另一个问题:是否有减少文本文件占用空间的方法?我正在使用Java。

2
一个独立的问题应该是一个独立的问题。 - beny23
7个回答

5
创建一个可以计算写入字符数的Writer并使用它来包装你的OutputStreamWriter[编辑] 注意:将文本保存到文件的正确方式是:
new BufferedWriter( new OutputStreamWriter( new FileOutputStream( file ), encoding ) ) );

编码很重要,通常是"UTF-8"。

这个链路提供了两个可以注入包装器的位置:你可以包装写入器以获取字符数,或者包装内部的OutputStream以获取字节数。


好的,谢谢。我会尝试这个。我怎么知道一个字符需要多少字节? - Andrew
如果您处理英语网页,则每个字符占用一个字节。UTF-8编码非常紧凑。但是,您也可以包装您的FileOutputStream以获得字节。 - Aaron Digulla
好的,我会尝试进行实验。我将用Java字符串长度方法在每个写入文件的字符串上保持一个运行总数来计算字符数(也许这不是正确的方法)。 - Andrew

4

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


3
为了最小化占用空间,您可以使用Java将文本文件压缩成zip格式。在关闭每个文件后,将其添加到一个zip文件中。压缩完成后,您可以检查zip文件的大小,以了解累计存储消耗情况。

3

HTML可以轻松地使用高压缩比进行压缩。考虑使用GZIPOutputStream来“最小化”您的文本文件所占用的空间。


2

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


我想这基本上就是我想做的,我猜我可以通过计算写入文件的字符数来实现,正如Aaron所建议的那样。 - Andrew
是的,我也投了Aaron的答案。我认为那是做法。 - Thom

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

    }

}

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


0

抱歉有点跑题:

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


我认为最好坚持使用Java,因为我对Java相当熟悉,而且其他所有东西都是用Java编写的。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接