Понимание 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
- 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
.