我正在尝试使用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需要新文件的完整路径。我是否必须单独发送文件名和扩展名,还是可以从收到的文件数据中提取?
答案 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);
但我没有看到你在任何地方发送/接收文件名。您需要使其保持不变或将其与文件内容一起传输。