2017-06-29 37 views
-1

我有一個任務,從RandomAccessFile(包含以二進制格式表示的短褲)打印第一個位置的數字和第五個位置的數字。我的文件是這樣的:在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-8ASCII。很可能您的文本使用ASCII編碼。

0011 0000 

因此,與ASCII編碼像0011\r\n一行文本,觀看raw bytes時實際上是:在ASCII文本0由字節表示

00110000 00110000 00110001 00110001 00001101 00001100 

\r\n是意味着看不見的符號newline(回車,換行符)。有許多ASCII表可用,例如here

所以,當你現在閱讀的文件,並使用readShort,那麼你實際上將讀取該文件的字節,其解釋爲short,這是一個16位數字。 前16位分別是:

00110000 00110000 

如果我們將此解釋爲short這將是數字:12336。你可以嘗試一下:

System.out.println(0b0011000000110000); 

0b意味着interpret the following byte code as number

好的,那就是問題的來源。解決辦法是,不要將文本解釋爲字節,而應將文本解釋爲實際文本。 文本由幾個char組成。因此,您可以使用readChar方法而不是readShort。您也可以使用readLine方法讀取整行。

如果您使用readChar方法,您會得到一個char,其內容0。您現在可以通過使用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++; 
} 

但是你i是不正確的,那麼您需要跳過\r\n但它不是在跳過計算size。但是爲了解決您的問題,不需要i。你可以使用LinkedList或其他東西。

1

你被誤導了你的任務。尋求澄清。如果這個文件真的是二進制文件,那麼這些文件不是短文,而是4位半字節,其值爲3,12,1,8,14,10,5,15,並且不會有換行符。但我同意@ElliotFrisch這是ASCII格式的二進制文件,而不是二進制文件,在這種情況下,它們仍然不是短文,而是4位半字節。或者可能它們是十六進制短褲,只有0和1位數字。無論哪種方式,你需要澄清。

NB:

  1. 你沒有RandomAccessFile。你有一個文件。 RandomAccessFile類,並且只有幾種可能的讀取文件的方法之一。

  2. 您的seek()電話會在每種情況下確切地尋找您已經在的位置。順序讀取文件時不需要查找。

+0

糟糕!我犯了一個錯誤。偶爾我的老師告訴我這個文件不是用「.txt」擴展名的。正確的擴展名是「.dat」 –

+0

如果沒有你正確地告訴我們什麼是*文件中的*,那告訴我們什麼都沒有。你可以稱它爲任何你喜歡的,但如果它是一個二進制文件,爲什麼線斷?爲什麼每個值只有四位數?澄清仍然需要。 – EJP