2016-07-17 4 views
0

私は、円形のログファイル書き込みたい:私は上記の結果をしたいが、私は私が最後の位置を取得することはできません見つかっ最後にJAVAでファイルに書き込んだ位置を取得するには?

This is Line 1400 
s is Line 2 
This is Line 3 
This is Line 4 
This is Line 5 
This is Line 6 
This is Line 7 
This is Line 8 
This is Line 9 

ない

This is Line 10 
This is Line 11 
This is Line 12 
This is Line 4 
This is Line 5 
This is Line 6 
This is Line 7 
This is Line 8 
This is Line 9 

public class CircularLogFile { 
    public static final String LOG_FILE_NAME = "circular.log"; 
    public static final int LOG_FILE_SIZE_MAX = 256; 

    public static void write(String line) throws IOException { 
     //BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(logFileName, true)); 
     RandomAccessFile raf = new RandomAccessFile(LOG_FILE_NAME, "rw"); 
     System.out.println("file size: "+raf.length()); 
     System.out.println("file pointer: "+raf.getFilePointer()); 
     if (raf.length() >= LOG_FILE_SIZE_MAX && raf.getFilePointer() >= LOG_FILE_SIZE_MAX) { 
      raf.seek(0); 
     } else if (raf.length() >= LOG_FILE_SIZE_MAX && raf.getFilePointer() < LOG_FILE_SIZE_MAX) { 
     } else if (raf.length() < LOG_FILE_SIZE_MAX) { 
      raf.seek(raf.length()); 
     } 

     raf.writeChars(line+"\n"); 

     raf.close(); 
    } 

    public static void main(String[] args) throws IOException { 
     int lineNumber = 0; 

     while (true) { 
      lineNumber++; 
      write("This is Line "+lineNumber); 
     } 
    } 
} 

出力をファイルに手紙を書いて、どうやって得るの?

+0

との作業を最小限に抑えながら、最小限の計算でI/Oの読み書きを最小限に抑えることができます。 あなたのコードを見れば、出力は 'This is Line 1'で始まるはずです – davidxxx

+0

1400,2,3,4が間違っていますが、12,4,5,6は問題ないのはなぜですか? – csmckelvey

+0

最後の書き込み位置(どこから?magic?)を取得しても、古い行の長さを変更したいときに役立たない場合でも、後続のファイル内容を読み込みます。 – Holger

答えて

1

あなたがしたいことはかなりトリッキーですが、私の意見ではそれを扱う最善の方法ではないかもしれません。あなたはファイルI/Oを使用し、悪用しています(高価で、あなたの目的では、やや難しい)。

データ構造を使用してファイルを解析し、出力をフラッシュする前に保持できない大きなファイルを扱っていますか?

関連する問題