我有一个可以共享文件和类对象的套接字程序。但是当我共享文件时,服务器套接字正确发送文件,没有任何错误。客户端也获取服务器发送的目标文件并正确存储在本地文件夹中(我也可以打开它)。但收到文件后,
FileOutputStream
并没有关闭。为了检查这一点,我在进程的末尾放置了一个打印命令。我正在使用 Lombok
执行关闭操作。写入的文件的大小总是小于21MB
,文件类型为
.pdf
(因为
server
管理它)。这是我的代码块。
Path dir = Paths.get("Temp");
if (Files.notExists(dir)) {
Files.createDirectory(dir);
}
Path file = Files.createTempFile(dir, null, ".pdf");
InputStream inputStream
= socket.getInputStream();
@Cleanup
FileOutputStream fileOutputStream
= new FileOutputStream(file.toFile());
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, bytesRead);
}
System.out.println("ok2");
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
我也用try-with-resources
尝试过这个,但效果不好。
read()
的
inputStream
调用最终会“阻塞”(它只是坐在那里,等待更多数据;这些数据可能永远不会出现)。您尚未退出该区块,因此
FileOutputStream
永远不会关闭。如果您愿意,可以通过添加一些 sysout 语句或使用调试器来仔细检查这就是原因(有一些极其深奥的替代解释,您可能需要仔细检查)来检查这一点。无论您是要求 lombok 关闭它还是
try-with
都没有关系 - 两者都不会在这里关闭,因为代码仍在块中。解决方案通常是协议之一。你还没有解释这个服务器是什么。多种选择:
read()
,因为那样会阻塞。您的
while
条件不得变为
> 0
,而是递减
bytesLeft
计数器,并且 while 循环应循环直至达到 0。