【问题标题】:Why I'm getting junk data in the File?为什么我在文件中得到垃圾数据?
【发布时间】:2013-11-22 21:48:58
【问题描述】:

我正在从服务器接收一个文件,在客户端我想将此文件保存到一个目录中。这是保存文件的代码

          FileDetails obj1= (FileDetails)object;
          String str= "A "+obj1.fileExtension+" Received From "+obj1.source;
          JOptionPane.showMessageDialog(null,str,"Success", WIDTH, null);
          FileOutputStream saveFile = new FileOutputStream("F:\\Download\\"+obj1.fileExtension);
          ObjectOutputStream save = new ObjectOutputStream(saveFile);
          byte[] buf= convertToByteArray(obj1.file);
          save.write(buf);
          save.close();

函数convertToByteArray如下

 private byte[] convertToByteArray(File file){       
       try{
       FileInputStream fis = new FileInputStream(file);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];

        for (int readNum; (readNum = fis.read(buf)) != -1;) {
            bos.write(buf, 0, readNum); //no doubt here is 0
            bos.flush();
            System.out.println("read " + readNum + " bytes,");
        }
        byte[] bytes = bos.toByteArray();
    return bytes;
    } catch (IOException ex) {
        ex.printStackTrace();
    }
       return null;
   }

FileDetails 是一个可序列化的对象,其中包含服务器发送的文件和fileExtension 中的文件名。类如下 -

public class FileDetails implements Serializable{
    public File file;
    public String fileExtension;
    public String source;
    public String destination;

}

现在的问题是我在客户端保存的文件中获取垃圾数据。为了测试我是否从服务器接收纯数据,我在控制台中打印了文件的内容并得到了预期的结果。但是当我打开指定目录中保存的文件时,我得到了一些中文脚本,我该怎么办?请帮帮我。

【问题讨论】:

  • 永远不要将文件读入一个字节[]。如果您不能 100% 确定大小,您可能会导致 OutOfMemoryErrors
  • 我假设要保存的文件在 1KB 以内。如果我想变得更健壮,我该怎么办?在这种特殊情况下,字节数组的替代品是什么?

标签: java file byte fileinputstream fileoutputstream


【解决方案1】:

我认为,部分问题在于在记事本中查看文件。如果我在另一个编辑器中打开文件,比如使用二进制模式的 TextPad,我会看到文件以序列化标头开头。使用 ObjectOutputStream 将文件的二进制数据序列化为对象。我认为您想要做的是删除 ObjectOutputStream 行并将其更改为以下内容:

FileOutputStream saveFile = new FileOutputStream("F:\\Download\\"+obj1.fileExtension);
//ObjectOutputStream save = new ObjectOutputStream(saveFile);
byte[] buf= convertToByteArray(obj1.file);
saveFile.write(buf);
saveFile.close();

这将只写出文件的字节。

【讨论】:

  • 非常感谢。根据您的建议修复了我的代码并做对了! :)
  • 很高兴你能成功!你介意接受这个作为正确答案吗?
【解决方案2】:

看看以下内容:

http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#move(java.nio.file.Path, java.nio.file.Path, java.nio.file.CopyOption...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2020-11-08
    相关资源
    最近更新 更多