2

ファイルの最初の行を削除するメソッドを Java で作成しようとしています。

最初のアイデア (.exec の呼び出しは適切ではないため却下)

public void removeHeader(String fileName) throws IOException, InterruptedException {
    if (StringUtils.isBlank(fileName)) {
        throw new IllegalArgumentException("fileName was empty");
    }

    Process p = Runtime.getRuntime().exec("sed -i 1d " + fileName);

    if (p.waitFor() != 0) {
        throw new IOException("Failed to remove the header from " + fileName);
    }
}

2番目のアイデア(すべての行を繰り返して新しいファイルに書き込むのは遅く、スタイリッシュではないため、CRで拒否されました)。

public void removeHeader(String fileName) throws IOException, InterruptedException {
    if (StringUtils.isBlank(fileName)) {
        throw new IllegalArgumentException("fileName was empty");
    }

    File inFile = new File(fileName);
    File tempFile = new File(inFile.getAbsolutePath() + ".tmp");

    BufferedReader br = null;
    PrintWriter pw = null;

    try {
        br = new BufferedReader(new FileReader(fileName));
        pw = new PrintWriter(new FileWriter(tempFile));

        String line = null;
        boolean first = true;
        while ((line = br.readLine()) != null) {
            if (!first) {
                pw.println(line);
                pw.flush();
            }

            first = false;
        } 
    }
    finally {
        pw.close();
        br.close();
    }

    if (inFile.exists() && tempFile.exists()) {
        inFile.delete();
        tempFile.renameTo(inFile);
    }
}

改行形式に関係なくソリューションを機能させ、読みやすくしたいと考えています。これらすべてのニーズを満たすソリューションはありますか?

4

3 に答える 3

9

私はJavaの人ではありませんが、残りのコンテンツを書き換えずにファイルの先頭からコンテンツを削除する方法(Javaまたはその他)はありません(基礎となるファイルシステムにアクセスしてファイルの開始ブロックを移動できる場合を除きます。あなたの「読みやすい」要件を無効にするでしょう)。

ファイルが非常に大きい場合を除き、ここでは時期尚早の最適化を感じます。

于 2012-04-26T02:05:22.610 に答える
2

保持したいものはすべて読んでコピーする必要があります(それsedを行っている場合でも)。

2 番目のバージョンは、ループの前に別の読み取りで最初の行をスキップするだけでわずかに改善できます。これにより、ループのたびに最初の行にいるかどうかを確認する必要がなくなります。

2 番目のコードは、最初の行をスキップするFilterReaderを作成することで、少し洗練されたものになります。この目的のために苦労する価値はありませんが、そのようなフィルターの実装を学ぶことは価値があります。

于 2012-04-26T02:14:56.893 に答える
0

コードは次のように短縮できます (Java7 が必要)。

しかし、そうでなければ、他の人が言ったように、ファイルの最初の部分を切り取る簡単な方法はありません.

于 2012-09-11T04:56:06.750 に答える