CodeGym/Blog Java/Random-ES/Clase Java PrintStream
Autor
Vasyl Malik
Senior Java Developer at CodeGym

Clase Java PrintStream

Publicado en el grupo Random-ES
¡Hola! Hoy hablaremos sobre la clase Java PrintStream y todo lo que puede hacer. En realidad, ya está familiarizado con dos métodos de la clase PrintStream . Son print() y println() , que probablemente use todos los días :) Debido a que la variable System.out es un objeto PrintStream , está llamando a uno de los métodos de esta clase cuando llama a System.out.println() .  El propósito general de la clase PrintStream es enviar información a algún flujo. Por qué necesitamos la clase PrintStream - 1Esta clase tiene varios constructores. Estos son algunos de los más utilizados:
  • Flujo de impresión (Flujo de salidaFlujo de salida)
  • PrintStream(File outputFile) lanza FileNotFoundException
  • PrintStream (String outputFileName) lanza FileNotFoundException
Por ejemplo, podemos pasar el nombre del archivo de salida al constructor PrintStream . Alternativamente, podemos pasar un objeto File . Veamos algunos ejemplos para ver cómo funciona esto:
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 test.txt en el escritorio (si aún no existe) y escribirá secuencialmente nuestro número, cadena y valor booleano en él. Aquí está el contenido del archivo después de ejecutar el programa:
222
Hello world!
false
Como dijimos anteriormente, no tiene que pasar un objeto File . Es suficiente simplemente pasar la ruta del archivo al 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 hace lo mismo que el código anterior. Otro método interesante que merece nuestra atención es printf() , que produce una salida basada en una cadena de formato. ¿Qué es una "cadena de formato"? Déjame 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\\Steve\\Desktop\\test.txt");

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

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

       printStream.close();
   }
}
Aquí, en lugar de indicar explícitamente el nombre y la edad de nuestro robot en la cadena, colocamos marcadores de posición para esta información, representados por %s y %d . Y pasamos como argumentos los datos que los reemplazarán. En nuestro caso, esta es la cadena " Amigo " y el número 18. Podríamos crear otro marcador de posición, digamos %b , y pasar otro argumento. ¿Porqué necesitamos esto? Sobre todo, para una mayor flexibilidad. Si su programa requiere que muestre un mensaje de bienvenida con frecuencia, deberá escribir manualmente el texto necesario para cada nuevo robot. ¡Ni siquiera puedes hacer que este texto sea una constante, ya que todos tienen diferentes nombres y edades! Pero usando este nuevo método, puede aislar el saludo en una constante y, si es necesario, simplemente cambiar los argumentos pasados ​​al método printf() .
import java.io.IOException;
import java.io.PrintStream;

public class Main {

   private static final String GREETINGS_MESSAGE = "My name is %s. I am %d!";

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

       PrintStream printStream = new PrintStream("C:\\Users\\Steve\\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();
   }
}

Sustitución de System.in

En esta lección, "lucharemos contra el sistema" y aprenderemos cómo reemplazar la variable System.in para redirigir la salida del sistema a donde queramos. Es posible que olvide qué es System.in , pero ningún estudiante de CodeGym olvidará nunca esta construcción:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in  (al igual que System.out ) es una variable estática de la clase System . Pero a diferencia de System.out , hace referencia a otra clase, a saber, InputStream . De forma predeterminada, System.in es un flujo que lee datos de un dispositivo del sistema: el teclado. Sin embargo, al igual que con System.out , podemos reemplazar el teclado como fuente de datos. ¡Podemos leer datos desde donde queramos! Veamos un ejemplo:
import java.io.*;

public class Main {

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

       String greetings = "Hi! My name is Amigo!\nI'm learning Java on the CodeGym website.\nOne day I will become a cool programmer!\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? System.in generalmente está vinculado al teclado. Pero no queremos leer datos desde el teclado: ¡hagamos que los datos se lean desde una cadena ordinaria! Creamos una cadena y la obtuvimos como una matriz de bytes. ¿Por qué necesitamos bytes? La cuestión es que InputStream es una clase abstracta, por lo que no podemos crear una instancia de ella directamente. Tenemos que elegir uno de sus descendientes. Por ejemplo, podemos elegir ByteArrayInputStream . Es simple, y solo su nombre nos dice cómo funciona: su fuente de datos es una matriz de bytes. Así que creamos una matriz de bytes y la pasamos al constructor de nuestro flujo que leerá los datos. ¡Y ya está todo listo! Ahora solo necesitamos usar System.setIn()para establecer explícitamente el valor de la variable in . Sin , recordará, tampoco era posible establecer el valor de la variable directamente: teníamos que usar el método setOut() . Después de asignar nuestro InputStream a la variable System.in , queremos verificar si hemos logrado nuestro propósito. Nuestro viejo amigo BufferedReader viene en nuestra ayuda aquí. Normalmente, este código habría abierto la consola en IntelliJ IDEA y luego habría leído los datos que ingresó desde el teclado.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

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

           System.out.println(str);
       }
Pero ahora, cuando lo ejecute, verá que nuestra cadena simplemente se muestra en la consola. No hay lectura desde el teclado. Reemplazamos la fuente de datos. ¡Ya no es el teclado, sino nuestra cuerda! Es así de simple :) En la lección de hoy, conocimos una nueva clase y exploramos un pequeño truco nuevo para trabajar con E/S. Ahora es el momento de volver al curso y completar algunas tareas :) ¡Nos vemos en la próxima lección!
Comentarios
  • Populares
  • Nuevas
  • Antiguas
Debes iniciar sesión para dejar un comentario
Esta página aún no tiene comentarios