0

OK,所以我一直試圖用FileInputReader.read()讀取一個(「任意」)二進制文件到一個byte []數組......但是無論文件長度如何,它一次只能讀取5個字節。 .. (順便說一句即時使用UDP來發送陣列/文件)爲什麼FileInputReader.read()每次只讀取5個字節(Java)?

byte[] array_bytes = new byte[1024]; 

while((nread=file.read(array_bytes))!=-1){ 

      number_bytesread += array_bytes.length; 
      socket_udp.send(send_package); 

      count += 1; 
     } 

-send_package是使用array_bytes發送消息

我試圖使用讀功能的DatagramPacket的(字節[] ,offset,lenght),但是如果我把長度超過5,就會發生這個錯誤,在第一次讀取時,即使認爲文件肯定大於5個字節:

nread=file.read(array_bytes, 0, 1024); 

無需補償,因爲我在閱讀後立即發送。

Exception in thread "main" java.lang.IndexOutOfBoundsException 
at java.io.FileInputStream.readBytes(Native Method) 
at java.io.FileInputStream.read(FileInputStream.java:272) 
at udp_server2.UDP_Server2.Send_Udp(UDP_Server2.java:122) 
at udp_server2.UDP_Server2.main(UDP_Server2.java:77) 
Java Result: 1 

在此先感謝您的幫助, 安德烈

回答

3

這聽起來像你的數組長度不實際上 1024我知道你已經證明代碼1024個字節創建它,但我懷疑你的實際代碼要麼改變其他地方的值,要麼改變它的創建方式。

這將是有益的,如果你能告訴一個簡短但完整程序演示問題,但做不到這一點,我會採取將是第一個診斷步驟來看待array_bytes.length,無論是在調試器或通過日誌記錄。我強烈懷疑你會發現它是5.一旦你確定了,你需要制定出爲什麼它是5,這與從輸入流讀取的調用無關。

另外請注意,這條線是根本錯誤的:

number_bytesread += array_bytes.length; 

它應該是:

number_bytesread += nread; 

...因爲你剛剛讀nread字節。您還發送了send_package,這似乎與您剛剛閱讀的數據無關。

此外,我建議你開始遵循Java命名約定,諸如arrayBytes而不是array_bytes。 (我只是使用bufferdata,請注意 - 但我指出Java中的變量和名稱通常是camelCased而不是using_underscores_for_word_breaks。)

+0

該行確實證明數組的長度確實是5 .. number_bytesread + = array_bytes.length;關於命名約定,它是我第一次編寫Java,而且我第一次使用Stackoverflow(這個回答的確很好,......)。我使用c命名約定似乎這是我用來編碼的唯一語言..謝謝生病嘗試瞭解爲什麼byte [] array_enviar = new byte [1024];有警告「價值永遠不會被使用」 – Andre

+0

@Andre:這表明你沒有使用這個變量 - 你正在使用一個不同的變量。仔細檢查一切,包括套管!在命名慣例方面,學習和遵循新語言習慣的一個好處是,它強化了它是一種不同的語言和不同的習語等的信息。 –

相關問題