Большая часть того, что делают сетевые программы, – это простой ввод и вывод: перемещение байтов из одной системы в другую. Байты-это байты; в значительной степени, читать данные, отправленные вам сервером это не так сильно отличается от чтения файла. Отправка текста клиенту ничем не отличается от записи в файл. Однако вход и выход (ввод/вывод) в Java организована по-разному, чем в большинстве языков, таких как C или C++.
Ввод/вывод в Java построен с//потоки .
- Входные потоки лин датос.
- Выходные потоки escriben datos.
Существуют различные классы потоков для чтения и записи в разные источники данных. Тем не менее, все они с теми же основными методами как для записи и чтения данных, так и после того, как вы создали поток, вы можете игнорировать детали того, что Вы читаете или пишете.
Поскольку все, что записывается или читается, – это байты, существуют filter streams//для изменения данных записи и чтения. Они могут быть объединены для выполнения преобразований данных.
Теперь у нас есть инструмент на один уровень выше, чем фильтры, который помогает нам писать программы для чтения и записи текста вместо байтов, это Readers и Писатели . Вместо того, чтобы сами преобразовывать наши данные в байты, они делают их для нас.
Потоки//синхронны , то есть, когда программа запрашивает поток для чтения или записи данных, он ждет данных, которые будут прочитаны или записаны, прежде чем делать что-либо. Однако, начиная с более поздних версий Java 1.4 поддерживает Неблокирующий ввод/вывод с использованием каналов и буферов. Это немного сложнее, но это намного быстрее для приложений с большим объемом данных, таких как веб-серверы. Точно так же неблокирующий ввод-вывод не будет обсуждаться в этом посте, но было полезно упомянуть об этом.
Чтобы закончить введение, я хочу, чтобы вы рассматривали потоки как системы слоев, где мы переходим от более низкого уровня к более высокому:
- Занимая//базовые классы streams |/нам нужно будет немного поработать, манипулируя байтами в форматах, которые мы хотим. Занимая фильтры//это уже облегчает нам работу.
- Занять Readers и
- Writers//облегчает нам обработку текста.
- Базовый выходной класс Java
java.io. OutputStream
. - Класс предоставляет методы, необходимые для записи данных.
- Классы, которые расширяют это, используют свои методы для записи данных на разные носители.
- Соображения при использовании непосредственно, а не с помощью фильтра: из-за проблем с буфером всегда желательно очистить его с помощью//flush ( )
.
Взгляд на то, как выглядит класс OutputStream:
public abstract class OutputStream { //hay que implementarla segun el medio public abstract void write(int b) throws IOException //en lugar de enviar uno por uno, enviar un conjunto de bytes public void write(byte[] data) throws IOException public void write(byte[] data, int offset, int length) throws IOException //enviar los datos en buffer y vaciarlo public void flush( ) throws IOException //cerrar el stream public void close( ) throws IOException }
- Базовый класс ввода Java
java.io. InputStream
. - Он предоставляет методы, необходимые для чтения данных в виде необработанных байтов.
- Каждый класс, который его расширяет, будет использовать свои методы для чтения данных с определенного носителя. Взгляд на то, как выглядит класс OutputStream:
public abstract class InputStream { //hay que implementarla segun el medio public abstract int read() throws IOException //en lugar de enviar uno por uno, enviar un conjunto de bytes public int read(byte[] input) throws IOException public int read(byte[] input, int offset, int length) throws IOException public int skip(long n) throws IOException public int available() throws IOException public void close() throws IOException }
Пример
Мы будем общаться с сервером и клиентом с помощью TCP-сокетов. В этом примере клиент использует OutputStream сокета для записи сообщения, а сервер использует InputStream для чтения сообщения. Для этого отправленное сообщение должно перейти от исходного формата (String) к массиву байтов и наоборот на сервере. Код выглядит так:
public class Cliente { public static void main(String[] args) { String mensaje = "Hola servidor!"; byte bytesDelMensaje[] = mensaje.getBytes(); try { Socket socket = new Socket("localhost", 8000); OutputStream alServidor = socket.getOutputStream(); alServidor.write(bytesDelMensaje); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } public class Servidor { public static void main(String[] args) { ServerSocket svc; try { svc = new ServerSocket(8000); Socket socket = svc.accept(); byte bytesDelMensaje[] = new byte[1024]; InputStream delCliente = socket.getInputStream(); delCliente.read(bytesDelMensaje); String mensaje = new String(bytesDelMensaje); System.out.println(mensaje); socket.close(); svc.close(); } catch (IOException e) { e.printStackTrace(); } } }
Я хочу, чтобы вы имели в виду, что есть много деталей, которые могут быть реализованы, если вы хотите привести к более реальному миру, где связь осуществляется глобальной сетью и не локально на компьютере. Но для того, чтобы узнать основы и основы того, как это работает, достаточно. В другом посте я мог бы объяснить эти детали.
Внутри того, что фильтры у нас есть две версии:
- лос фильтрует потоки.
- лос-анджелесские читатели и писатели. Эти фильтры являются цепными, что делает преобразование данных очень гибким. ## Filter Streams работают с необработанными данными, такими как байты, и у нас есть несколько классов из них, которые предоставляют различные функции, такие как:
- Сжатие данных в двоичные числа.
- Шифрование данных.
- Сделать буфер программного обеспечения для хранения данных.
- и т. д.
Среди этих фильтров у нас есть:
- BufferedStream.
- PrintStream.
- PushbackInputStream.
- DataStream.
- CompressingStream.
- DigestStream.
- EncryptingStream.
Пример
Мы будем использовать приведенный выше пример, но реализуя фильтр DataStream, чтобы они могли оценить 2 вещи:
- //Цепочка|/, которая может быть выполнена с более низкого уровня ((Входной поток o выходной поток) не имеет значения (поток ввода данных и поток вывода данных). И мы больше не беспокоимся о//преобразование//из String в байты и наоборот. Код выглядит так:
public class Cliente { public static void main(String[] args) { String mensaje = "Hola servidor!"; try { Socket socket = new Socket("localhost", 8000); DataOutputStream alServidor = new DataOutputStream(socket.getOutputStream()); alServidor.writeUTF(mensaje); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } public class Servidor { public static void main(String[] args) { ServerSocket svc; try { svc = new ServerSocket(8000); Socket socket = svc.accept(); DataInputStream delCliente = new DataInputStream(socket.getInputStream()); String mensaje = delCliente.readUTF(); System.out.println(mensaje); socket.close(); svc.close(); } catch (IOException e) { e.printStackTrace(); } } }
Писатели и читатели
Trabajan con el manejo de casos особенности текста и различные варианты кодификации сказок в формате UTF-8 e ISO 8859-1. На данный момент я хочу, чтобы из них у вас были идеи, как они являются копиями всего вышеперечисленного, но вместо работы с байтами он абстрагирует нас от работы с разнообразие текстов, которые доступны.
Оригинал: “https://dev.to/martinnacimiento/streams-de-java-5bmp”