содержимое buf - google.com в байтовом формате. так что мой вопрос, что будет "в" читать? \ Понимание 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();
    }
}

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

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

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

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

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

Меня это смущает, когда outputStream используется для отправки данных через сокет, зачем нужен out.write (buf), зачем нам отправлять google.com в outputStream?