这是一个代码
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();
}
}
我已经标记了我有问题理解的语句。我不明白OutputStream对象out
在分配s.getOutputStream()
时将保留什么,以及将buf
传递给需要的是什么out
out.write(buf)
。{/ p>
我已经学会了使用文件输入和输出Streams,但我不理解getinputstream
和outputstreams
。我用Google搜索了它,在SO上以及从许多不同的书和oracle文档中读取它同样。请详细讨论。
我知道如何从文件中读取以及如何写入文件。但是在这里我不明白传递buf
数组的必要性只包含一个字符串。我想问的是,当它在有套接字的输入流为什么我们不能直接读取它?
套接字inputstream
和outputstream
究竟是什么?
我在这里发现了一些东西,这里是链接“Java Networking: Explain InputStream and OutputStream in Socket”,这里DNA的答案说
在Java中,要通过套接字发送数据,从中获取OutputStream(1),并写入OutputStream(输出一些数据)。“
这让我很困惑,当outputStream用于通过socket发送数据时需要out.write(buf)为什么我们需要将“google.com”发送到outputStream?
答案 0 :(得分:33)
首先需要了解的是 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 :(得分:0)
这里OutputStream
用于将数据发送到套接字的另一端,只要你写out.write(buf)
它就会在套接字中发送缓冲区数据。
InputStream
用于从套接字接收数据。
答案 2 :(得分:0)
InputStream in
和OutputStream out
将保存对两种类型流的引用,您可以从中读取数据或向其写入数据。不要期望它们保持流本身的值 - 相反,它们具有使用流的能力。当您创建这些对象时,您不会发送/接收任何数据 - 您只需获取可用于发送/接收数据的对象。
out.write(buf)
正在通过套接字发送buf
的内容,以便套接字的任何读者(在您的情况下,in
)都可以接收该数据。无论发送到out
的数据是什么,都会在InputStream
的插槽的另一侧看到。