保存通过Java中的DatagramPackets接收的文件

时间:2015-10-28 17:31:16

标签: java

我正在尝试使用Java中的DatagramPackets(分配器的一部分)以片段形式发送文件。当我尝试保存传入的文件时,我得到访问被拒绝错误,但我认为这不是权限问题。 这是首当其冲:

我让用户发送文件以使用FileChooser选择它。并创建一个新的Message对象。

//....
File f = content.showFileChooser();
            byte type = Byte.parseByte("4");
            Message m;
            try {
                if (mode == 1){
                    m = new Message(f, content.getServerData().getFragmentSize(), (short) (sentMessages.size()+1), type);
                    serverThread.send(m);
                }
//...

在创建消息期间,文件被拆分为字节数组,其中每个数组的大小由用户预先确定。代码是相当冗长的,所以我不打算发布斩波过程,但这是我将File对象转换为大字节[]然后被切断的方式

    Path p = Paths.get(file.getAbsolutePath());
    this.rawData = Files.readAllBytes(p);

创建消息并将其切换为字节数组后,我使用DatagramPackets发送它们。然后另一方使用它们来创建一个新的Message对象。一旦所有片段到达,就会再次从Message对象中提取rawData。问题出在这里:

            Message m = receivedMessages.get(msgIndex-1);
            byte[] fileData = m.getFile();
            if (fileData != null){
                System.out.println("All file fragments received.");
                content.append("Received a file in" + m.getFragmentCount()+" fragments. Choose directory. " ,1);
                //I BELIEVE THIS TO BE THE CRITICAL POINT
                String filePath = content.chooseDirectory();
                if (filePath == null)
                    return;
                FileOutputStream fos;
                try {
                    fos = new FileOutputStream(filePath);
                    fos.write(fileData);
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

一旦所有片段到达,我让用户使用具有DIRECTORY_ONLY选择模式的FileChooser选择目录。据我了解,FileOutputStream需要新文件的完整路径。我是否必须单独发送文件名和扩展名,还是可以从收到的文件数据中提取?

1 个答案:

答案 0 :(得分:1)

您正在编写filePath的目录路径,然后尝试使用FileOutputStream打开该目录。难怪这不起作用,你也必须指定文件名。

String filename = "myfile.txt"; //Or receive and set this some other way
File outFile = new File(filePath, filename);
fos = new FileOutputStream(outFile);

但我没有看到你在任何地方发送/接收文件名。您需要使其保持不变或将其与文件内容一起传输。