了解getInputStream和getOutputStream

这是一个代码

import java.io.*; import java.net.*; public class Whois { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub int c; Socket s = new Socket("whois.internic.net",43); *InputStream in = s.getInputStream(); *OutputStream out = s.getOutputStream(); String str = (args.length == 0 ? "osborne.com" : args[0] ) + "\n"; byte buf[] = str.getBytes(); *out.write(buf); System.out.print("hey baby"); while ((c=in.read()) != -1) { System.out.print((char) c); } s.close(); } } 

我已经标记了我有问题理解的语句。我不明白当分配s.getOutputStream()时,OutputStream对象将保持什么,并且需要通过out.write(buf)buf传递给out

我已经学会了使用文件输入和输出Streams,但我不了解getinputstreamoutputstreams 。我用google搜索它,在SO上以及从许多不同的书和oracle文档中读取它。 请详细讨论。

我知道如何从文件中读取以及如何写入它们。但是在这里我不明白需要传递只保存字符串的buf数组。我想要问的是当in有插槽的输入流时为什么我们不能直接读它呢? 什么是套接字输入inputstreamoutputstream

我在这里发现了一些东西,这里是链接“ Java Networking:在Socket中解释InputStream和OutputStream ”,这里的答案由DNA说

在Java中,要通过套接字发送数据,可以从中获取OutputStream(1),并写入OutputStream(输出一些数据)。“

这让我感到困惑,当outputStream用于通过socket发送数据时需要out.write(buf)为什么我们需要将“google.com”发送到outputStream?

您需要了解的第一件事是什么是STREAM

流可以定义为数据序列。 InputStream用于从源读取数据,OutputStream用于将数据写入目标。

****接下来是流的类型****

  we have byte stream and character stream. 

在此处输入图像描述

 classes we have in Input Stream and output stream 

在此处输入图像描述

顾名思义, 简单来说,输入流用于输入数据,输出流用于输出数据

Java 字节流用于执行8位字节的输入和输出。 尽管有许多与字节流相关的类,但最常用的类是FileInputStream和FileOutputStream。 也

Java 字节流用于执行8位字节的输入和输出,其中Java 字符流用于执行16位unicode的输入和输出。 虽然有许多与字符流相关的类,但最常用的类是FileReader和FileWriter ..虽然内部FileReader使用FileInputStream而FileWriter使用FileOutputStream,但主要区别在于FileReader一次读取两个字节而FileWriter写入两个字节一时间

以供参考

  1. 什么是InputStream和输出流? 我们为何以及何时使用它们?

  2. java DataOutputStream getOutputStream()getInputStream()

getInputStream和getOutputStream的示例

  1. http://zerioh.tripod.com/ressources/sockets.html

新链接 http://docs.oracle.com/javase/tutorial/essential/io/buffers.html

这里OutputStream用于在写出时将数据发送到套接字的另一端。写out.write(buf)它将在套接字中发送缓冲区数据。

InputStream用于从套接字接收数据。

InputStream inOutputStream out将保存对两种类型流的引用,您可以从中读取数据或向其写入数据。 不要指望它们从流本身保存值 – 相反,它们具有使用流的能力。 当您创建这些对象时,您不会发送/接收任何数据 – 您只是获取可用于发送/接收数据的对象。

out.write(buf)通过Socket发送out.write(buf)的内容,以便socket的任何读者(在你的情况下, in )都可以接收该数据。 无论发送到何处的数据都将通过InputStream在Socket的另一侧看到。