JavaRush /Blog Java /Random-ES /¿Para qué sirve la clase PrintStream?

¿Para qué sirve la clase PrintStream?

Publicado en el grupo Random-ES
¡Hola! Hoy hablaremos de la clase PrintStreamy de todo lo que puede hacer. ¿Para qué sirve la clase PrintStream? - 1En realidad, ya estás familiarizado con dos métodos de la clase PrintStream. Estos son los métodos print()y println()que probablemente uses todos los días :) Dado que una variable System.outes un objeto PrintStream, cuando llamas a un método System.out.println(), estás llamando a un método de esta clase en particular. El propósito general de la clase PrintStreames enviar información a algún flujo. Esta clase tiene varios constructores. Éstos son algunos de los más comunes:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) throws FileNotFoundException
  • PrintStream(String outputFileName) throws FileNotFoundException
Como puede ver, podemos pasar al constructor del objeto PrintStream, por ejemplo, el nombre del archivo en el que queremos generar los datos. O, alternativamente, el objeto mismo File. Veamos cómo funciona esto con ejemplos:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class Main {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));

       filePrintStream.println(222);
       filePrintStream.println("Hello world");
       filePrintStream.println(false);
   }
}
Este código creará un archivo en el escritorio test.txt(si aún no existe allí) y escribirá nuestro número, cadena y booleanvariable allí secuencialmente. Aquí está el contenido de nuestro archivo después de que se ejecute el programa:

222
Hello world!
false
Como dijimos anteriormente, no es necesario pasar el objeto del archivo en sí File. Solo necesita especificar la ruta en el constructor:
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class Main {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream("C:\\Users\\Username\\Desktop\\test.txt");

       filePrintStream.println(222);
       filePrintStream.println("Hello world");
       filePrintStream.println(false);
   }
}
Este código hará lo mismo que el anterior. Otro método interesante a considerar es printf()la salida de cadena formateada. ¿Qué significa "cadena formateada"? Para explicarlo, daré un ejemplo:
import java.io.IOException;
import java.io.PrintStream;

public class Main {

   public static void main(String[] args) throws IOException {

       PrintStream printStream = new PrintStream("C:\\Users\\Евгений\\Desktop\\test.txt");

       printStream.println("Hello!");
       printStream.println("I'm robot!");

       printStream.printf("My name is %s, my age is %d!", "Amigo", 18);

       printStream.close();

   }
}
Aquí, en lugar de escribir explícitamente el nombre y la edad de nuestro robot en una línea, parece que dejamos “espacio libre” para esta información usando punteros %sy %d. Y pasamos los datos que deberían estar en estos lugares como parámetros. En nuestro caso, esta es la cadena " Amigo " y el número 18. Podríamos, por ejemplo, crear otro espacio: digamos, %by pasar otro parámetro. ¿Para qué sirve? En primer lugar, aumentar la flexibilidad. Si su programa necesita mostrar con frecuencia un mensaje de bienvenida, deberá ingresar manualmente el texto requerido para cada nuevo robot. Ni siquiera podrás poner este texto en una constante: ¡los nombres y las edades de cada persona son diferentes! Pero con el nuevo método, puede generar una cadena con un saludo en una constante y, si es necesario, simplemente cambiar los parámetros en el método printf().
import java.io.IOException;
import java.io.PrintStream;

public class Main {

   private static final String GREETINGS_MESSAGE = "My name is %s, my age is %d!";

   public static void main(String[] args) throws IOException {

       PrintStream printStream = new PrintStream("C:\\Users\\Евгений\\Desktop\\test.txt");

       printStream.println("Hello!");
       printStream.println("We are robots!");

       printStream.printf(GREETINGS_MESSAGE, "Amigo", 18);
       printStream.printf(GREETINGS_MESSAGE, "R2-D2", 35);
       printStream.printf(GREETINGS_MESSAGE, "C-3PO", 35);

       printStream.close();
   }
}

System.in suplantación de identidad

En esta conferencia "lucharemos contra el sistema" y aprenderemos cómo reemplazar una variable System.iny redirigir la salida del sistema al lugar que necesitamos. ¿Para qué sirve la clase PrintStream? - 2Puede que hayas olvidado qué es System.in, pero ningún estudiante de JavaRush olvidará jamás esta construcción:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in(como System.out) es una variable de clase estática System. Pero, a diferencia de System.out, pertenece a una clase diferente, a saber, a InputStream. De forma predeterminada System.in, este es un hilo que lee datos del dispositivo del sistema: el teclado. Sin embargo, como en el caso de System.out, podemos reemplazar la fuente de datos y la lectura no se realizará desde el teclado, sino desde el lugar que necesitamos. Veamos un ejemplo:
import java.io.*;

public class Main {

   public static void main(String[] args) throws IOException {

       String greetings = "¡Hola! Меня зовут Амиго!\nЯ изучаю Java на сайте JavaRush.\nОднажды я стану крутым программистом!\n";
       byte[] bytes = greetings.getBytes();

       InputStream inputStream = new ByteArrayInputStream(bytes);

       System.setIn(inputStream);

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

       while ((str = reader.readLine())!= null) {

           System.out.println(str);
       }

   }
}
entonces, ¿qué hicimos? Generalmente System.in“atado” al teclado. Pero no queremos que los datos se lean desde el teclado: ¡que se lean desde una línea de texto normal! Creamos una cadena y la recibimos como una matriz de bytes. ¿Por qué necesitamos bytes? El hecho es que InputStreames una clase abstracta y no podemos crear una instancia de ella. Tendrás que elegir alguna clase entre sus herederos. Por ejemplo, podemos tomar ByteArrayInputStream. Es simple, y sólo por su nombre queda claro cómo funciona: su fuente de datos es una matriz de bytes. Entonces creamos esta misma matriz de bytes y se la pasamos a nuestro constructor stream, que leerá los datos. De hecho, ¡ya está todo listo! Ahora solo necesitamos usar el método System.setIn()para establecer explícitamente el valor de la variable in. En el caso de out, como recordarás, tampoco era claramente posible establecer el valor de la variable: había que utilizar un método especial setOut(). Después de haber asignado InputStreamla variable que creamos System.in, debemos verificar si nuestra idea funcionó. Un viejo amigo nos ayudará con esto BufferedReader. En una situación normal, este código haría que se abriera una consola en su Intellij IDEa y los datos que ingresó desde el teclado se leerían desde allí.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

       while ((str = reader.readLine())!= null) {

           System.out.println(str);
       }
Pero cuando lo ejecute ahora, verá que nuestro texto del programa simplemente se enviará a la consola, no habrá lectura desde el teclado. Hemos cambiado la fuente de datos, ahora no es el teclado, ¡sino nuestra cadena! Es muy fácil y simple :) En la conferencia de hoy nos familiarizamos con una nueva clase y analizamos un pequeño "truco" nuevo para trabajar con E/S. Es hora de volver al curso y resolver algunos problemas :) ¡Nos vemos en la próxima conferencia!
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION