2012-03-20 11 views
0

私は固定形式のファイルを持っています。RandomAccessFile - ヌル文字列を返す

このファイルの特定の行には、行番号に基づいてアクセスします。

readline 100

各行の長さは200バイトです。

だから、直接のRandomAccessFileを使用して第百行にカーソルを移動するようになる。しかし、私がnullとして出力を取得しています

File f = new File(myFile); 
RandomAccessFile r = new RandomAccessFile(f,"rw"); 
r.skipBytes(200 * 99); // linesize * (lineNum - 1) 
System.out.println(r.readLine()); 

私はここで何が欠けていますか?

質問は、私の前の質問に答えるために継続しているReaching a specific line in a file using RandomAccessFile

更新:

ラインサイズが200の文字:プログラムの下

は私が期待していとおりに動作します。

File f = new File(myFile); 
RandomAccessFile r = new RandomAccessFile(f,"rw"); 
r.seek(201 * (lineNumber-1)); // linesize * (lineNum - 1) 
System.out.println(r.readLine()); 

行番号(ファイル全体からの任意の行番号)がその行を印刷しています。

@EJP:説明してください!

+0

各行のサイズが100バイトであることをどのように知っているか。 –

+0

1文字は1バイトを意味します。行の長さは200文字で200バイトを意味します... – Nik

+0

しかし、単一の場合は、複数のスペースを追加すると仮定し、バイトそれは余分なバイトを追加し、これは悪いプログラミングです。 100から行を読みたい場合は、readlineを使ってファイルを読み込みます。 –

答えて

1

最初に、ファイルからのみ読み込み、書き込みしない場合は、 "rw"ではなく "r"としてRandomAccessFileを開くことをお勧めします。理由は、ファイルが書き込みアクセスを可能にするために開いている場合、実際にファイルの長さよりも大きな場所にポインタを移動することができるからです。

たとえば、ファイルの長さが100バイトの場合、読み取り専用モードで開くと、100バイトのどこかにポインタが保持されます。しかし、同じファイルを読み書きモードで開くと、RandomAccessFileにseek(250)を伝えることができます。このファイルのこの時点でデータを書き出す可能性があると考えられるため、問題なく処理されます。

したがって、「rw」モードで有効なファイルの最後を移動した可能性があります。

第2に、ファイルの先頭から読み込む場合は、skipBytes()ではなくseek()を使用することをお勧めします。 seek()を使用することにより、常にファイルの先頭からの相対位置であるため、正確な位置に移動することが保証されます。しかし、skipBytes()はファイル内の現在のポインタ位置からの相対位置ですので、コード内のどこかでRandomAccessFileコンストラクタとskipBytes()メソッド呼び出しの間でポインタを間違って移動させた場合は、正しい場所に到着しません。

ファイルの先頭から作業する場合、seek()は、他に何があっても、ファイル内の正しい場所に移動するより高いレベルのセキュリティを提供しますRandomAccessFileに渡します。

-1
byte[] line = new byte[200]; 
r.seek(200 * 99); 
r.read(line); 
String s = new String(line, "UTF-8"); // Or probably "Cp1252" 
+0

あなたは何をしようとしているのですか? – Nik

+0

彼はバイト配列を読み込んで文字列に変換しようとしています。 – Vic

+0

-1:答えはありません。 – EJP

1

RandomAccessFile.readLine()ファイルの最後にヌルを返します。それはJavadocで言います。

あなたはファイルの最後にいます。

そうでない場合の計算は正しくありません。言っEJP

0

は正しいです:あなたは、ファイルを修正する必要がhttp://docs.oracle.com/javase/6/docs/api/java/io/RandomAccessFile.html

  • 確認。存在しないファイルを含むRandomAccessFileを作成すると例外がスローされます。例外がないので、AファイルでRandomAccessFileを作成しています。それが正しいことを確認してください。
  • RandomAccessFileは、内部ファイル位置ポインタを使用します。既にファイルの終わりにいて、いくつかのバイトをもう一度スキップした場合は、あなたが言及した動作を説明します。ファイル内の正しい位置にいることを確認してください。
+0

@Gjis Overvliet:私はUPDATEセクションの質問の末尾に追加したコードは正しいですか?私はちょうどそれが別のOS(UNIX、Linux、Windowsなど)で異なって動作するかどうかを確認したいですか? – Nik

+1

そのコードは正しいと思われます。異なるオペレーティングシステム間で違いはありません。 –

関連する問題