将文件复制到新路径的Java不起作用

时间:2015-08-29 21:38:50

标签: java file-io objectinputstream

我有另一个问题。现在我正在写一个小程序,它在我的电脑和笔记本电脑上运行。这两个程序相互通信。我可以写字符串(就像聊天),我想发送文件。这个小聊天有​​效,但文件正在制作问题。 Wich让我有点疑惑,因为几天前我已经把它运行了。但现在它不起作用(不记得我改变了重要的事情)。不幸的是我无法撤消因为Eclipse已经关闭了。

所以我一直在寻找错误,但我几小时都找不到它。我希望你能帮助我。

情况:

我在我的电脑/笔记本电脑上选择一个文件并将其发送到我的笔记本电脑/电脑(我发送文本[字符串]的方式与文件一样,并且有效)。接收方应将文件保存在目录中(targetPath - 它在代码中的其他位置定义。它是我桌面上的文件夹)。所以我从“ObjectInputStream”获取文件作为对象并将其转换为“文件”:

 if(msg instanceof File){ //msg is the object i got from the ObjectInputStream
                        //its a file
                        model.copyFileTo((File) msg);
}

这是制造麻烦的方法:

    public void copyFileTo(File file) throws IOException{
            System.out.println(file.getName());//this is just a test and it works. It prints out the name of the sended file
    if(targetPath.toFile().exists()){
        if(file.exists()){
            Path temp = Paths.get(targetPath+"/"+file.getName());
            if(!temp.toFile().exists()){
                Files.copy( file.toPath(), temp,  StandardCopyOption.REPLACE_EXISTING);
                System.out.println("copied");
            }else{
                System.out.println("File already exists");
            }
        }else{
            System.out.println("File doesnt exists");
        }
    }else{
        System.out.println("targetPath doesnt exists!");
    }
}

我没有成为错误,但它打印“文件不存在”,所以“if(file.exists())”出错了。如果我把这个部分剪掉了,那么程序就会在Files.copy(...)中挂起,我知道因为它没有打印出“复制”。

我希望你能帮助我,如果你需要更多信息就说出来。

2 个答案:

答案 0 :(得分:0)

在源系统上,你会做这样的事情(Java 7):

Path path = Paths.get("C:\\MyFolder", "MyFile.bin");
byte[] fileContent = Files.readAllBytes(path);
// send fileContent to target system

在目标系统上,您可以:

// receive fileContent from source system
Path path = Paths.get("C:\\Where\\To\\Store\\File", "MyFile.bin");
Files.write(path, fileContent);

在Java 6或更低版本中,您将使用File对象而不是Path对象并自行复制字节。

答案 1 :(得分:0)

我遵循安德烈亚斯的建议

  

在源系统上,你会做这样的事情(Java 7):

Path path = Paths.get("C:\\MyFolder", "MyFile.bin");
byte[] fileContent = Files.readAllBytes(path);
// send fileContent to target system
  

在目标系统上,您可以:

Path path = Paths.get("C:\\Where\\To\\Store\\File", "MyFile.bin");
Files.write(path, fileContent);
  

在Java 6或更低版本中,您将使用File对象而不是Path对象并自行复制字节。

我只想为其他人写下我的代码:

当我收到输入时,会调用此部分:

 if(msg instanceof Message){// Message is a self made class wich contains the byte[] as an object and the File/Path as an Object #
                        model.copyFileTo((byte[]) ((ChatMessage)msg).getMessage(), (File)((ChatMessage)msg).getName());
 }

方法:

    public void copyFileTo(byte[] bytes, File file) throws IOException{
    if(targetPath.toFile().exists()){
            Path temp = Paths.get(targetPath+"/"+file.getName());
            if(!temp.toFile().exists()){
                Files.write(temp, bytes);
                System.out.println("Wurde kopiert");
            }else{
                System.out.println("File already exists");
            }
    }else{
        System.out.println("targetPath doesnt exists!");
    }
}

感谢Andreas。