2012-04-26 6 views
2

私は、ファイルの最初の行を削除し、Javaのメソッドを記述しようとしていることによってそれ行を反復なしにかかわらず、改行タイプのJavaでファイルの1行目を削除します。は、execを呼び出すか、ライン

最初のアイデア(.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); 
    } 
} 

(すべての行を反復処理し、新しいファイルにそれを書くことが遅いとスタイリッシュではありませんので、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); 
    } 
} 

私のソリューションは、改行形式に関係なく動作し、読みやすいものにします。これらのニーズをすべて満たすソリューションはありますか?残りのコンテンツを(書き換えることなく、ファイルの先頭からコンテンツを削除する

+2

私の応答はKISS:Keep It Simple、Sillyです。これが本当にアプリケーションのミッションクリティカルな部分でない限り、どちらかの方法で行い、次のことに進みます。すべてが最適化されている必要があると考えると、より大きいプロジェクトを完了するのが遅れて問題を引き起こす可能性があります。 – ControlAltDel

+4

@KenWhiteこれは答えになるはずです。 –

+0

明らかにそうです。 :)完了。 –

答えて

9

私は、Javaの人ではないんだけど、(そうでない場合は、Javaまたは)方法はありませんあなたはの開始ブロックを移動するために基本的なファイルシステムにアクセスすることができない限り、あなたの "読みやすい"要件を敗北させるファイル)。

ファイルが本当に大きい場合を除き、私は、ここでは時期尚早の最適化を感知します。

+3

+1:早すぎる最適化を避けることは、常に良いアドバイスです。 –

2

あなたが(でもsedはそれをやっている)保存しておきたいものを読んで、コピーする必要があります。

番目のバージョンは、単にループの前に別の読み取りで最初の行をスキップすることによって、わずかに改善することができ、その後、あなたが最初の行にループを通るたびにしているかどうかをチェックする必要はありません。

第も、最初の行をスキップFilterReaderを書き込むことによってエレガンスのビットを得ることができました。この目的のために問題になる可能性は低いですが、そのようなフィルタを実装することを学ぶことは価値があります。

0
あなたのコードは(Java7が必要です)このように短縮することが可能

  • オープンFileInputStream
  • を最初の改行
  • コピーFiles.copy
とそれの残りの部分にそれを読みます

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

関連する問題