2014-04-09 30 views
0

我在Java中有一個FileOutputStream,它讀取UDP數據包的內容並將它們保存到文件中。在閱讀結束時,我有時想轉換文件的編碼。問題是,目前在做這件事時,它最終會使文件的所有內容加倍。我認爲唯一的解決方法是創建一個帶有新編碼的臨時文件,然後將其保存爲原始文件,但這看起來太過分了。嘗試在Java中更改文件的Encdoing將文件的內容翻倍

我必須剛好可以俯瞰在我的代碼的東西:

if(mode.equals("netascii")){ 
       byte[] convert = new byte[(int)file.length()]; 
       FileInputStream input = new FileInputStream(file); 
       input.read(convert); 
       String temp = new String(convert); 
       convert = Charset.forName("US-ASCII").encode(temp).array(); 
       fos.write(convert); 
      } 
      JOptionPane.showMessageDialog(frame, "Read Successful!"); 
      fos.close(); 
     } 

有什麼懷疑?

在此先感謝您的幫助!

+0

您應該使用閱讀器和作家在這裏,指定在這兩種情況下適當的字符集。 – EJP

回答

0

問題是您從InputStream中讀取的字節數組將被轉換爲ascii字符,我假設它不是。將字節轉換爲字符串時指定InputStream編碼,您將獲得標準的Java字符串。

我認爲UTF-16作爲InputStream中的編碼在這裏:

byte[] convert = new byte[(int)file.length()]; 
FileInputStream input = new FileInputStream(file); 

// read file bytes until EOF 
int r = input.read(convert); 
while(r!=-1) r = input.read(convert,r,convert.length); 

String temp = new String(convert, Charset.forName("UTF-16")); 
+0

此外,問題和這個答案都忽略了'InputStream.read(byte [])'的返回值,這將導致從文件讀取任意數量的字節而不是完整的文件內容。 –

+0

@ OlegEstekhin你能詳細說明一下嗎?我不太明白我擁有的是什麼問題。 – Nclay09

+0

請參閱Javadoc的閱讀()。沒有指定填充緩衝區。它只是有義務傳送至少一個字節。你必須循環。 – EJP