【问题标题】:Trying to Change the Encdoing of a File in Java is Doubling the Contents of the File尝试在 Java 中更改文件的编码会使文件的内容翻倍
【发布时间】:2014-04-10 01:41:00
【问题描述】:

我在 java 中有一个 FileOutputStream,它正在读取 UDP 数据包的内容并将它们保存到一个文件中。在阅读它们的最后,我有时想转换文件的编码。问题是,目前这样做时,它只会使文件的所有内容加倍。我能想到的唯一解决方法是使用新编码创建一个临时文件,然后将其保存为原始文件,但这似乎太老套了。

我一定只是忽略了我的代码中的某些内容:

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();
        }

有什么可疑的吗?

提前感谢您的帮助!

【问题讨论】:

  • 您应该在此处使用 Reader 和 Writer,并在这两种情况下指定适当的 CharSet。

标签: java character-encoding fileoutputstream


【解决方案1】:

问题是您从 InputStream 读取的字节数组将被转换为 ascii 字符,我假设它不是。在将其字节转换为 String 时指定 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"));

【讨论】:

  • 另外,这个问题和这个答案都忽略了InputStream.read(byte[])的返回值,这将导致从文件中读取任意数量的字节而不是完整的文件内容。
  • @OlegEstekhin 你能详细说明一下吗?我不太明白我所拥有的问题是什么。
  • 请参阅 Javadoc 以了解 read()。未指定填充缓冲区。它只需要传输至少一个字节。你必须循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 2013-07-22
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多