了解getInputStream和getOutputStream

时间:2014-03-21 16:17:33

标签: java stream

这是一个代码

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,但我不理解getinputstreamoutputstreams。我用Google搜索了它,在SO上以及从许多不同的书和oracle文档中读取它同样。请详细讨论。

我知道如何从文件中读取以及如何写入文件。但是在这里我不明白传递buf数组的必要性只包含一个字符串。我想问的是,当它在有套接字的输入流为什么我们不能直接读取它? 套接字inputstreamoutputstream究竟是什么?

我在这里发现了一些东西,这里是链接“Java Networking: Explain InputStream and OutputStream in Socket”,这里DNA的答案说

  

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

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

3 个答案:

答案 0 :(得分:33)

首先需要了解的是 STREAM

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

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

 we have byte stream and character stream.

enter image description here

classes we have in Input Stream and output stream 

enter image description here

顾名思义,简单术语输入流用于输入数据,输出流用于输出数据

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

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

供参考

  1. What is InputStream & Output Stream? Why and when do we use them?

  2. java DataOutputStream getOutputStream() getInputStream()

  3. getInputStream和getOutputStream的示例

    1. http://zerioh.tripod.com/ressources/sockets.html
    2. 新链接 http://docs.oracle.com/javase/tutorial/essential/io/buffers.html

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

out.write(buf)正在通过套接字发送buf的内容,以便套接字的任何读者(在您的情况下,in)都可以接收该数据。无论发送到out的数据是什么,都会在InputStream的插槽的另一侧看到。