Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我';我在文件中获取垃圾数据?_Java_File_Byte_Fileinputstream_Fileoutputstream - Fatal编程技术网

Java 为什么我';我在文件中获取垃圾数据?

Java 为什么我';我在文件中获取垃圾数据?,java,file,byte,fileinputstream,fileoutputstream,Java,File,Byte,Fileinputstream,Fileoutputstream,我从服务器收到一个文件,在客户端我想把这个文件保存到一个目录中。下面是保存文件的代码 FileDetails obj1= (FileDetails)object; String str= "A "+obj1.fileExtension+" Received From "+obj1.source; JOptionPane.showMessageDialog(null,str,"Success", WIDTH, null);

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

          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;

}

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

请看以下内容:

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

,java.nio.file.Path,java.nio.file.CopyOption…

我认为部分问题是在记事本中查看文件。如果我在另一个编辑器中打开该文件,比如说使用二进制模式的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();

这将只写出文件的字节。

永远不要将文件读入字节[]。如果您不能100%确定可能导致OutOfMemoryError的大小,我假设要保存的文件在1KB以内。如果我想变得更强壮,我能做什么?在这种特殊情况下,字节数组的替代方案是什么?非常感谢。根据您的建议修复了我的代码,并且一切正常!:)很高兴你成功了!你介意接受这个作为正确答案吗?