2010-12-02 1 views
0

ファイルから数値を読み取る方法???RandomAccessFile readInt

私はreadIntメソッドを使用すると大きな数字を取得し、それはファイルの番号と等しくありません。

どのように修正するのですか?

スキャナはファイルがもっとそして1000の、何百万の番号が含まれていbecouse ...それは...

はい、テキストファイルを非常に長い時間がかかるだろう、良いアイデアではありません。

ファイルには、スペースを除いた数字が含まれています。例えば(test.txtという)


    public static void readByMemoryMappedFile(int buffer[], String filename) throws IOException 
    { 
     int count = 0; 

     RandomAccessFile raf = new RandomAccessFile(filename, "r"); 
     try { 
      MappedByteBuffer mapFile = raf.getChannel().map(MapMode.READ_ONLY, 0, raf.length()); 

      StringBuilder b = new StringBuilder(); 
      try { 
        while (mapFile.hasRemaining()) { 
         byte read = mapFile.get(); 
         if (read == ' ' && b.length() > 0) { 
           buffer[count++] = mapFile.getInt();//Integer.parseInt(b.toString()); 
           b.delete(0, b.length()); 
         } else { 
           b.append((char) read); 
         } 
        } 
      } catch (BufferUnderflowException e) { 
        // Всё, файл закончился 
      } 
      if (b.length() > 0) { 
        buffer[count++] = Integer.parseInt(b.toString()); 
      } 
     } finally { 
      raf.close(); 
     } 
    } 

そう1 2 4 -4004 15458 8876、私がレポート添付:


// operation: time 
reading: 39719 // t0 
reading: 28297 // t1 
reading: 56719 // t2 
reading: 125735 // t3 
reading: 199000 // t4 

T0 < T1 < T2 < T3 < T4

これを取得するプログラムの動作を変更するには:t0〜t1〜t2〜t3〜t4 ???

+2

どのように保存されていますか? –

+2

重要な質問は、バイナリまたはテキスト形式のデータですか?これはあなたの質問ではっきりしていません。 –

答えて

1

ランダムにデータにアクセスする場合は、開始する場所と終了する場所を指定できる必要があります。テキスト形式ではこれは難しいかもしれませんし、あなたが望むものを見つけるために前の行/テキストをすべて読まなければならないかもしれません。

バイナリ形式では、どこを読みたいのか正確に計算できますが、番号のエンコード方法を知る必要があります。例えばビッグエンディアンかリトルエンディアンか?

スキャナは、テキストには最適ではない可能性があり、バイナリデータには役に立たない可能性があります。

大きなファイルをスキャンするのにかかる時間の多くは、ディスクを読み込む時間です(メモリに収まらないと仮定した場合)。数字でいっぱいのテキストはありません。読み込むのに20秒かかってしまうのではなく、圧縮すれば2秒しかかかりません。 (OSファイルキャッシュに収まるかもしれません)

2

多量の可能性のある理由は、バイトオーダーの可能性があります。 Javaは、チャンネルから読み込むときにデフォルトでBig Endianを使用します。読み込み元のファイルがリトルエンディアンの場合、最下位バイトが最上位バイトになるため、小さい数字が大きくなります。

ByteBufferのバイト順序を変更するには、orderメソッドを使用します。

+1

データのメモリマッピング時にByteBufferを使用することもできます。 –

1

これは、番号の格納方法によって異なります。

私は簡単な答えは次の通りだと思います。数字の始まりと終わりの場所、テキストとして保存するのかバイナリで保存するのか、そしてバイナリであればバイトオーダーすなわち、リトルエンディアンまたはビッグエンディアンである。

テキストとして保存されている場合は、数字から文字列を作成し、その文字列でInteger.parseIntを呼び出します。 (または、浮動小数点数であれば、他のデータ型の場合はDouble.parseDoubleなど)

バイナリ整数として格納されている場合は、配列にバイトを読み込んだり、1つずつ読み込んだりして、 256の累乗で加算します。

たとえば、リトルエンディアンの順序で4バイトの数値があるとします。それをサイズ4のバイト配列に読み込みます。次に:

byte[] incoming=new byte[4]; 
file.read(incoming); 
int n=0; 
for (int p=0;p<4;++p) 
    n=n*256+incoming[p]; 
return n; 
+0

それは動作しません... –

+0

Vachovsky:あなたはどのようにファイルが書き込まれたかによって読み方が理解できますか?ファイルがテキストとして書かれていればバイナリとして読み込むことができます。 – Jay

0

数字がテキストとして保存されている場合、readInt()は機能しません。あなたはファイルを解析する必要があります、それは唯一の方法です。

関連する問題