4

非常に多くのブログやニュース Web サイトへのアクセスを提供するサービスから完全な HTML を収集しています。いくつかのキーワードが含まれているかどうかを確認するために、HTML を (リアルタイムで) チェックしています。キーワードのいずれかが含まれている場合は、HTML をテキスト ファイルに書き込んで保存します。

これを一週間やりたい。そのため、大量のデータを収集しています。プログラムを 3 分間テストすると、100MB のテキスト ファイルが生成されました。4 TB のスペースがあり、これ以上は使用できません。

また、テキスト ファイルが大きくなりすぎないようにします。

私が提案しているのは、テキスト ファイルを開いて HTML を書き込み、そのサイズを頻繁にチェックすることです。200MB よりも大きくなった場合は、テキスト ファイルを閉じて、別のファイルを開きます。また、4 TB に近づかないように、合計で使用した容量の実行ログを保持する必要もあります。

ここでの疑問は、ファイルを閉じる前に (FileWriter.close() を使用して) テキスト ファイルのサイズを確認する方法です。これには関数がありますか、それともファイルに書き込まれた文字数を数えて、それを使用してファイル サイズを推定する必要がありますか?

別の質問: テキスト ファイルが占める容量を最小限に抑える方法はありますか? 私はJavaで働いています。

4

7 に答える 7

5

書き込まれた文字数をカウントするライターを作成し、それを使用して をラップしますOutputStreamWriter

[編集]注: テキストをファイルに保存する正しい方法は次のとおりです。

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

エンコーディングは重要です。通常は「UTF-8」です。

このチェーンにより、ラッパーを挿入できる 2 つの場所が提供されます。ライターをラップして文字数を取得するか、インナーOutputStreamをラップしてバイト数を取得できます。

于 2011-11-21T16:02:46.220 に答える
4

アーロンの答えを続けます。CountingOutputStreamを使用できます: CountingOutputStreamを使用して FileOutputStream をラップするだけで、既に書き込んだバイト数を知ることができます。

于 2011-11-21T16:13:04.780 に答える
3

スペースを最小限に抑えるために、テキスト ファイルを Java で圧縮できます。ファイルを閉じた後、各ファイルを zip に追加してみませんか。圧縮後、zip のサイズを確認して、累積的なストレージ消費量を確認できます。

于 2011-11-21T16:03:17.453 に答える
3

HTML は高い圧縮率で簡単に圧縮されます。GZIPOutputStreamを使用して、テキスト ファイルが占める「スペースの量を最小限に抑える」ことを検討してください。

于 2011-11-21T16:03:48.973 に答える
2

ファイルに書き込むバイト数を数えることを思いつきましたか?

于 2011-11-21T16:01:22.373 に答える
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());

    }

}

この例は、ファイル ライターを使用している場合、書き込み中およびライターを開いた状態で、そのサイズをリアルタイムで取得できることを示しています。スペースを節約したい場合は、ストリームを圧縮できます。

于 2011-11-21T16:11:08.240 に答える
0

トピックから少し外れたことをお詫びします。

それはJavaでなければなりませんか?フィード データの取得方法にもよりますが、これはかなり単純なシェル スクリプトの仕事のように思えます (grepまたはfgrep、キーワードのチェック、gzip圧縮など)。

于 2011-11-21T16:10:25.513 に答える