【问题标题】:Understanding getInputStream and getOutputStream了解 getInputStream 和 getOutputStream
【发布时间】:2014-04-29 03:05:36
【问题描述】:

这是代码

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 将持有什么以及通过out.write(buf)buf 传递给out 的需要是什么。

我已经学习了使用文件的输入和输出流,但我不明白getinputstreamoutputstreams。我已经用谷歌搜索了它,在 SO 以及许多不同的书籍和 oracle 文档中阅读它。请详细讨论。

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

我在这里找到了一些东西,这里是链接“https://stackoverflow.com/questions/12715321/java-networking-explain-inputstream-and-outputstream-in-socket”,这里是 DNA 的回答说

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

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

【问题讨论】:

    标签: java stream


    【解决方案1】:

    首先你需要了解的是什么是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. What is InputStream & Output Stream? Why and when do we use them?

    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

    【讨论】:

    • 我知道什么是流,什么是输入和输出流。我不明白的是,当将 buf 发送到输出流时,输入流如何读取它。输入流仅获取 buf 的内容,即只有一个字节形式的字符串。那么它是如何读取的呢?
    • 将 out.write(buf) 写入套接字的输出流的目的是什么?这就是我所问的。out 保存具有 inetadress google.com 的套接字的输出流。什么是写入这种套接字的输出流的目的是什么?这就是我所要求的,我得到了除此之外的一切。我需要对此进行解释
    • 不不不。你没有明白我的意思,我正在尝试在 java 中学习套接字。尽管非常努力,但我无法理解这段代码。要么我很愚蠢,要么你们没有明白我的意思,我想问什么?
    • 当我将 buf 写入从它读取的套接字的输出流中?
    • 在重新阅读您所说的内容后,我现在理解的是套接字已连接到服务器,它通过其输出流将 buf 发送到另一端,服务器然后读取它并返回它已要求是 google.com。返回的字符串/对象存储在套接字的输入流中?我说的对吗?
    【解决方案2】:

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

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

    【讨论】:

    • buf的内容是google.com的字节格式。所以我的问题是“in”会读什么? \
    【解决方案3】:

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

    InputStream用于从socket接收数据。

    【讨论】:

    • 发送“google.com”到套接字的另一端有什么需要?我们不能只获取 inputputStream 并从中读取吗?为什么我们需要先将 buf 写入输出流然后只从中读取?请在您的答案中写下详细信息,因为它并没有说明任何事情。这就是我在谷歌上得到的结果,不幸的是它没有说明问题
    • 您正在将域名发送到另一端并从另一端接收适当的响应。 osborne.com 您要发送到另一端的字符串
    • 所以你的意思是说osborne.com的服务器正在从保存buf数据的输出流中读取?
    • 我是说Socket s = new Socket("whois.internic.net",43); 这将连接到 whois.internic.net 并且您想知道的域是 'osborne.com' 所以当您将此字符串发送到服务器作为响应时将向您发送有关“osborne.com”的信息。
    猜你喜欢
    • 2011-06-22
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2020-02-17
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多