FileOutputStream 未正确关闭?

问题描述 投票:0回答:1

我有一个可以共享文件和类对象的套接字程序。但是当我共享文件时,服务器套接字正确发送文件,没有任何错误。客户端也获取服务器发送的目标文件并正确存储在本地文件夹中(我也可以打开它)。但收到文件后,

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

尝试过这个,但效果不好。

java sockets file-handling
1个回答
0
投票
服务器永远不会关闭连接。因此,对

read()

inputStream
 调用最终会“阻塞”(它只是坐在那里,等待更多数据;这些数据可能永远不会出现)。您尚未退出该区块,因此 
FileOutputStream
 永远不会关闭。如果您愿意,可以通过添加一些 sysout 语句或使用调试器来仔细检查这就是原因(有一些极其深奥的替代解释,您可能需要仔细检查)来检查这一点。

无论您是要求 lombok 关闭它还是

try-with

 都没有关系 - 两者都不会在这里关闭,因为代码仍在块中。

解决方案通常是协议之一。你还没有解释这个服务器是什么。多种选择:

    作为协议的一部分,您知道有多少字节,并且应该跟踪是否完成。一旦您读取了尽可能多的字节,就不要再次调用
  • read()
    ,因为那样会阻塞。您的 
    while
     条件不得变为 
    > 0
    ,而是递减 
    bytesLeft
     计数器,并且 while 循环应循环直至达到 0。
  • 您编写了服务器,协议规定文件完成后连接将关闭,因此您粘贴的
  • this代码不是问题,而是服务器代码。
  • 相同,但服务器是由其他人编写的,但服务器中仍然存在错误。
© www.soinside.com 2019 - 2024. All rights reserved.