我对在 Java 中使用流和文件的概念很陌生。
我正在编写一段代码,我有一个非常简单的服务器正在监听传入的文件。
然后我有一个处理传入文件的处理程序。
现在,这是代码(删除了 try/catch block )
ObjectInputStream in;
in = new ObjectInputStream(new BufferedInputStream(
clientSocket.getInputStream()));
File f = new File(fileName);
int byteCount = in.readInt();
byte[] fileArray = (byte[]) in.readObject();
Files.write(f.toPath(), fileArray);
当程序遇到 ``byte[] fileArray = (byte[]) in.readObject(); 行时,会出现
int byteCount` 显示了正确的字节数,文件名也是正确的......IOException
。并且 - 可以肯定的是,
堆栈跟踪看起来像这样:
java.io.OptionalDataException
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1304)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at com.fileservice.util.ClientHandlerRunnable.run(ClientHandlerRunnable.java:85)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
发送文件的客户端代码:
Socket socket = new Socket(data.getIp(), data.getTcpPort());
FileInputStream fis = null;
BufferedInputStream bis = null;
// OutputStream os = null;
// send file
File myFile = new File(data.getFileName());
String test = myFile.getAbsolutePath();
byte[] mybytearray = new byte[(int) myFile.length()];
fis = new FileInputStream(myFile);
bis = new BufferedInputStream(fis);
bis.read(mybytearray, 0, mybytearray.length);
ObjectOutputStream os = new ObjectOutputStream(
new BufferedOutputStream(socket.getOutputStream()));
os.flush();
System.out.println("Sending " + data.getFileName() + "("
+ mybytearray.length + " bytes)");
if (os != null) {
os.writeInt(mybytearray.length);
os.write(mybytearray, 0, mybytearray.length);
os.flush();
System.out.println("Done.");
}
if (bis != null) {
bis.close();
}
if (os != null) {
os.close();
}
if (socket != null) {
socket.close();
}
最佳答案
您正在发送原始字节,并且正在读取一个对象。那是行不通的。如果您读取一个对象,则发送者必须写入一个对象(使用writeObject()
)。如果发送方写入字节,则您必须读取字节(使用 read()
)。
请注意,您的文件读取部分也是错误的。 read()
不保证它会读取您要求它读取的字节数。您必须使用循环来读取所有内容。或者您可以简单地使用 Files.readAllBytes()
,它将为您正确读取文件中的所有字节。
关于java - 尝试将 ObjectInputStream 的输出保存到文件时出现 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33221297/