了解 getInputStream 和 getOutputStream

2022-09-05 00:29:48

这是一个代码

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 对象在分配时将包含什么,以及需要传递给 。outs.getOutputStream()bufoutout.write(buf)

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

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

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

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

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


答案 1

您需要了解的第一件事是什么是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. 什么是 InputStream & Output Stream?我们为什么以及何时使用它们?

  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


答案 2

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

out.write(buf)通过套接字发送 的内容,以便套接字的任何读取器(在您的情况下)都可以接收该数据。发送到的任何数据都将在套接字的另一侧通过 .bufinoutInputStream


推荐