Рубрики
Без рубрики

Потоки де Ява

Большая часть того, что делают сетевые программы, – это простой ввод и вывод: перемещение байтов из одной системы в другую. Помеченные как распределенные системы, системы распространения, java, потоки.

Большая часть того, что делают сетевые программы, – это простой ввод и вывод: перемещение байтов из одной системы в другую. Байты-это байты; в значительной степени, читать данные, отправленные вам сервером это не так сильно отличается от чтения файла. Отправка текста клиенту ничем не отличается от записи в файл. Однако вход и выход (ввод/вывод) в Java организована по-разному, чем в большинстве языков, таких как C или C++.

Ввод/вывод в Java построен с//потоки .

  • Входные потоки лин датос.
  • Выходные потоки escriben datos.

Существуют различные классы потоков для чтения и записи в разные источники данных. Тем не менее, все они с теми же основными методами как для записи и чтения данных, так и после того, как вы создали поток, вы можете игнорировать детали того, что Вы читаете или пишете.

Поскольку все, что записывается или читается, – это байты, существуют filter streams//для изменения данных записи и чтения. Они могут быть объединены для выполнения преобразований данных.

Теперь у нас есть инструмент на один уровень выше, чем фильтры, который помогает нам писать программы для чтения и записи текста вместо байтов, это Readers и Писатели . Вместо того, чтобы сами преобразовывать наши данные в байты, они делают их для нас.

Потоки//синхронны , то есть, когда программа запрашивает поток для чтения или записи данных, он ждет данных, которые будут прочитаны или записаны, прежде чем делать что-либо. Однако, начиная с более поздних версий Java 1.4 поддерживает Неблокирующий ввод/вывод с использованием каналов и буферов. Это немного сложнее, но это намного быстрее для приложений с большим объемом данных, таких как веб-серверы. Точно так же неблокирующий ввод-вывод не будет обсуждаться в этом посте, но было полезно упомянуть об этом.

Чтобы закончить введение, я хочу, чтобы вы рассматривали потоки как системы слоев, где мы переходим от более низкого уровня к более высокому:

  1. Занимая//базовые классы streams |/нам нужно будет немного поработать, манипулируя байтами в форматах, которые мы хотим. Занимая фильтры//это уже облегчает нам работу.
  2. Занять Readers и
  3. 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”