2011-12-26 11 views
0

テキストファイルを読み込み、その後にファイルが読み込まれるオフセットを取得します。次のプログラムを試しましたが、RandomAccessFileを使用したくありません。どうすればいいですか? 。ファイルを読み込んだ後、最後にジャンプ

RandomAccessFile access = null; 
       try { 
        access = new RandomAccessFile(file, "r"); 

        if (file.length() < addFileLen) { 
         access.seek(file.length()); 
        } else { 
         access.seek(addFileLen); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       String line = null; 
       try { 

        while ((line = access.readLine()) != null) { 

         System.out.println(line); 
         addFileLen = file.length(); 

        } 
+0

RandomAccessFileを使用したくない場合は、どうしますか? – JRideout

+0

これはうまくいくものです。 – Rookie

+1

http://docs.oracle.com/javase/tutorial/essential/io/file.html ByteChannelsの情報を検索 – Kris

答えて

1

ファイルを連続して読みたい場合は、次の操作を行います。これは実際にファイルの終わりを読み取っていないことによって機能します。あなたが持っている問題は、最後に完全な行や完全なマルチバイト文字がないかもしれないということです。

class FileUpdater { 
    private static final long MAX_SIZE = 64 * 1024; 
    private static final byte[] NO_BYTES = {}; 

    private final FileInputStream in; 
    private long readSoFar = 0; 

    public FileUpdater(File file) throws FileNotFoundException { 
     this.in = new FileInputStream(file); 
    } 

    public byte[] read() throws IOException { 
     long size = in.getChannel().size(); 
     long toRead = size - readSoFar; 
     if (toRead > MAX_SIZE) 
      toRead = MAX_SIZE; 
     if (toRead == 0) 
      return NO_BYTES; 
     byte[] bytes = new byte[(int) toRead]; 
     in.read(bytes); 
     readSoFar += toRead; 
     return bytes; 
    }  
} 
+0

私はログライン全体を解析したいので、データを取得したいと思います。重大度に応じてメールに送信します。この方法では、余分なオーバーヘッドがあります。 – Rookie

+0

ファイルには行全体があることが保証されていないため、行全体があると想定できません。代わりに、自分でデータをスキャンし、次の読み込みのための新しい行なしでバイトを保存する必要があります。オーバーヘッドはわずかですが、BufferedReaderを使用する場合とほとんど同じで、IOを読み込むコストに比べて非常に小さいです。 –

関連する問題