2014-04-09 28 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