Понимание 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();
    }
}

Я отметил утверждения, что у меня проблема с пониманием. Я не понимаю, что будет делать объект OutputStream out, когда ему назначено s.getOutputStream(), и что необходимо передать buf в out на out.write(buf).

Я изучил входные и выходные потоки, используя файлы, но я не понимаю getinputstream и outputstreams. Я искал его, читал его здесь как SO, так и из многих разных книг и из документов оракула. пожалуйста, обсудите его подробно.

Я знаю, как читать из файлов и как писать для них. Но здесь я не понимаю, в чем заключается необходимость передачи массива buf, который содержит только строку. Я хочу спросить, что когда у входной поток сокета, почему мы не можем напрямую читать его? Что такое сокеты inputstream и outputstream?

Я нашел здесь что-то здесь, вот ссылка "Java Networking: Объясните InputStream и OutputStream в Socket", здесь ответ ДНК говорит

В Java, чтобы отправлять данные через сокет, вы получаете из него OutputStream (1) и записываете в OutputStream (вы выводите некоторые данные).

Это меня смущает, когда outputStream используется для отправки данных через сокет, что нужно для 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 записывает два байта в время.

Для справки

Пример для getInputStream и getOutputStream

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

Новая ссылка http://docs.oracle.com/javase/tutorial/essential/io/buffers.html

Ответ 2

Здесь OutputStream используется для отправки данных на другую сторону в сокете всякий раз, когда вы пишете out.write(buf), он будет отправлять данные буфера в сокет.

InputStream используется для приема данных из сокета.

Ответ 3

InputStream in и OutputStream out будут содержать ссылки на два типа потоков, в которые вы можете либо считывать данные, либо записывать данные. Не ожидайте, что они будут хранить значения из самого потока - вместо этого они обладают способностью работать с потоком. Когда вы создаете эти объекты, вы не отправляете/не получаете никаких данных - вы просто получаете объект, который вы можете использовать для отправки/получения данных.

out.write(buf) отправляет содержимое buf поверх Socket, чтобы любые считыватели сокета (в вашем случае in) могли получать эти данные. Независимо от того, какие данные отправлены на out, на другой стороне Socket будет отображаться InputStream.