关于Java Socket类输入输出流的疑问:为何读用getInputStream?
为什么Java Socket的getInputStream用于读取、getOutputStream用于写入?
核心原因是流的命名始终以你的程序为参照点,而非以Socket或网络另一端为标准:
getInputStream()获取的是输入流:对当前程序来说,这个流里的数据是从网络另一端通过Socket传进来的,属于“外部数据输入到程序”,所以你需要从这个流里读取数据。getOutputStream()获取的是输出流:对当前程序来说,你往这个流里写入的数据会通过Socket发送到网络另一端,属于“程序内部数据输出到外部”,所以你需要向这个流里写入数据。
举个简单的代码例子更直观:
// 连接服务器 Socket socket = new Socket("example.com", 8080); // 读取服务器发来的数据(程序的输入) InputStream input = socket.getInputStream(); byte[] buffer = new byte[1024]; int len = input.read(buffer); // 给服务器发送数据(程序的输出) OutputStream output = socket.getOutputStream(); output.write("Hello Server".getBytes());
其实这个逻辑和文件流完全一致:FileInputStream是把文件内容读取到程序(输入),FileOutputStream是把程序数据写入文件(输出),Socket流只是把“文件”换成了“网络连接”而已。很多人直觉混淆是误把参照点放到了网络另一端,但Java的IO流体系从始至终都是站在当前程序的视角定义方向的。
内容的提问来源于stack exchange,提问作者Joey
相关产品推荐
相关产品推荐

