Java中通过Socket读取文件时InputStream的实际工作机制探究
关于BufferedInputStream转FileInputStream的疑问解答
首先咱们来一步步分析你的问题:
1. 关于Socket另一端是文件的假设是否正确?
这个假设有一定合理性,但不完全准确。当你通过URL获取BufferedInputStream时,底层流的类型完全取决于URL对应的资源类型:
- 如果你的URL是
file://协议(直接指向本地文件系统的资源),那底层流确实会是FileInputStream——这是Java URL处理的默认逻辑,直接映射本地文件流,和Socket没有关系。 - 如果是HTTP/HTTPS这类网络协议的URL,正常情况下底层应该是和Socket相关的输入流(比如
SocketInputStream)。但如果服务器端在响应请求时,直接将本地文件的流通过Socket输出,客户端这边的流依然是Socket流,你不会在客户端代码里看到FileInputStream的调用。
所以你看到的流跳转,更大可能是因为你使用的URL是file://协议,直接访问了本地文件,而非Socket另一端是文件。
2. 关于FileInputStream的read()中path变量的问题
你提到FileInputStream执行read()时,path变量被设置为你的某个内容——结合前面的流情况,这个path大概率就是该FileInputStream对应的本地文件路径:
- 如果是直接访问本地文件,path就是你URL里指定的文件路径;
- 如果是有中间层(比如缓存工具、代理)将网络资源临时存储到本地,那path就是临时文件的路径。
内容的提问来源于stack exchange,提问作者Dipankar Dey
相关产品推荐
相关产品推荐

