2017-06-29 11 views
-1

RandomAccessFile(バイナリ形式で表現された短文で構成されています)から1番目の番号と5番目の番号から印刷するタスクがあります。私のファイルには、次のようになります。JavaのRandomAccessFileから短い番号を出力してください

0011 
1100 
0001 
1000 
1110 
1010 
0101 
1111 

とコード:

RandomAccessFile file = new RandomAccessFile("data.txt", "r"); 
    try { 
     int size = (int)file.length()/2; 
     short[] arr = new short[size]; 
     int pos = 0; 
     file.seek(pos); 
     for (int i = 0; i < size; i++) { 
      arr[i] = file.readShort(); 
      pos += 2; 
      file.seek(pos); 
     } 
     System.out.println(arr[0] + " " + arr[4]); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

を解答するために、私は "12336 12336" です。問題はどこだ。私は川に精通しておらず、最近彼らを勉強し始めました。

+1

ファイルはASCII形式ですが、バイナリのように読み込もうとしています。 –

+0

どういう意味ですか?私は短くするためにすべての価値を解析する必要がありますか? –

+0

このようにsmthを使用できますか? 'arr [i] = Short.parseShort(file.readLine()、2);'ファイルが私のrandomaccessfileでarrが短い配列であると仮定して –

答えて

2

あなたは、あなたのファイルがどのように見えると言う:

0011 
1100 
0001 
1000 
1110 
1010 
0101 
1111 

がこのファイルを表示するときに、あなたがNotepadと、例えば、取得テキスト表現ですか?それとも、Binary-Editorで見ていますか?したがって、要するに、textまたはbytesについて話していますか?

ファイルはテキストエディタでこのように見えます。その場合、これは実際のものではありませんbytes。テキストファイルは常にエンコーディングでエンコードされ、一般的なエンコーディングはUTF-8またはASCIIです。テキストはASCIIでエンコードされている可能性があります。 ASCIIでテキスト0は、バイトで表されます。

0011 0000 

だからASCIIでエンコード0011\r\nのようなテキストの行は、raw bytesを表示するときは、実際にある:

00110000 00110000 00110001 00110001 00001101 00001100 

\r\nは意味不可視のシンボルですnewline(改行、改行)。多くのASCIIテーブルがあります(例:here)。

だから、あなたが今ファイルを読み込み、readShortを使用するとき、あなたは実際にファイルのバイトを読み、16ビット数あるshort、としてそれらを解釈します。 最初の16ビットは、次のとおりです。

00110000 00110000 

我々はshortとしてこれを解釈した場合、それは数になります:12336。あなたはでそれを試すことができます。

System.out.println(0b0011000000110000); 

0b手段interpret the following byte code as number

さて、それは問題のソースです。解決策は、テキストをバイトとして解釈するのではなく、実際にテキストとして解釈することです。 テキストは複数のcharで構成されます。したがって、readShortの代わりにreadCharメソッドを使用することができます。 readLineメソッドを使用して行全体を読み取ることもできます。

readCharメソッドを使用すると、内容が0charになります。あなたは今Short.valueOf(...)を使用してshortとしてこれを解析することができます

arr[i] = Short.valueOf(file.readChar()); 

左の小さな問題があるが。行末に来ると、ファイル内の\r\nが読み取られ、short-representationも配列に挿入されます。あなたはこの正確な値をスキップしたりreadLineを使用してこれを修正してから、その文字で行を分割することができます:

String line = file.readLine(); 
for (char character : line.toCharArray()) { 
    arr[i] = Short.valueOf(character); 
    i++; 
} 

をしかし、このアプローチであなたが\r\nをスキップするだろうが、それはスキップされていないとしてあなたiが間違っていますsizeの計算。しかし、あなたの問題を解決するためには、iの必要はありません。 LinkedListなどを使用することもできます。

1

あなたの仕事は間違っています。説明を求める。このファイルが本当にバイナリだった場合、これらは短絡ではなく、4ビットのニブルで値は3、12、1、8、14、10、5、15となり、改行はありません。しかし、私は@ElliotFrischに同意します。これはバイナリではなくASCII形式のバイナリであることに同意します。この場合、それらはまだ短絡ではなく4ビットのニブルです。あるいは、おそらくそれらは0桁と1桁の六進ショートです。どちらの方法であれ、明確化が必要です。

NB:

  1. あなたはRandomAccessFileを持っていません。あなたはファイルを持っています。 RandomAccessFileは、クラス、であり、いくつかの可能な方法でファイルを読むことができます。

  2. あなたのコールは、あなたがすでに存在している場所を常に検索します。ファイルを順番に読むときには検索する必要はありません。

+0

おっと!私が間違えました。時には私の先生からファイルの拡張子が「.txt」ではないと私は教えてくれました。正しい拡張子は「.dat」 –

+0

ファイル内にあるものを正しく教えなければ何も教えてくれません。好きなものを呼び出すことはできますが、バイナリファイルの場合は改行がなぜ発生しますか?なぜ値あたり4桁しかないのですか?明確化は依然として必要でした。 – EJP

関連する問題