Contenidos
Lectura de la salida de un proceso con BufferedReader e InputStreamReader
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import java.io.BufferedReader import java.io.InputStreamReader fun main() { val comando = "ls" // Comando para listar archivos en sistemas Unix/Linux // Crear un objeto ProcessBuilder para ejecutar el comando val processBuilder = ProcessBuilder(comando) // Ejecutar el proceso val proceso = processBuilder.start() // Crear un BufferedReader para leer la salida del proceso val reader = BufferedReader(InputStreamReader(proceso.inputStream)) // Leer y mostrar la salida del proceso línea por línea var linea: String? while (reader.readLine().also { linea = it } != null) { println(linea) } // Esperar a que el proceso termine val estado = proceso.waitFor() if (estado == 0) { println("El comando se ejecutó correctamente.") } else { println("El comando no se ejecutó correctamente.") } } |
Explicación:
- En este ejemplo, utilizamos
ProcessBuilder
para ejecutar un comando en el sistema operativo y luego capturamos y mostramos su salida. InputStreamReader
se utiliza para convertir la salida del proceso en una secuencia de caracteres legibles.BufferedReader
se utiliza para leer la salida del proceso línea por línea.- El bucle
while
lee y muestra cada línea de salida hasta que llega al final de la salida. proceso.waitFor()
se utiliza para esperar a que el proceso termine y devuelve el estado de salida del proceso (0 si se ejecutó correctamente).
Teoría:
ProcessBuilder
se utiliza para crear y controlar procesos en el sistema operativo desde una aplicación Java/Kotlin.InputStreamReader
se utiliza para convertir una secuencia de entrada de bytes (como la salida de un proceso) en una secuencia de entrada de caracteres que se puede leer con facilidad.BufferedReader
se utiliza para leer texto de una secuencia de entrada de caracteres de manera eficiente, ya que almacena en búfer caracteres y realiza lecturas más eficientes en términos de rendimiento en comparación con la lectura de caracteres uno por uno.
Redirección de la salida de un proceso a un archivo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.io.File fun main() { val comando = "ls" // Comando para listar archivos en sistemas Unix/Linux val outputFile = "lista_archivos.txt" // Nombre del archivo de salida // Crear un objeto ProcessBuilder para ejecutar el comando val processBuilder = ProcessBuilder(comando) // Redirigir la salida estándar del proceso al archivo de salida processBuilder.redirectOutput(ProcessBuilder.Redirect.to(File(outputFile))) // Ejecutar el proceso val proceso = processBuilder.start() // Esperar a que el proceso termine val estado = proceso.waitFor() if (estado == 0) { println("El comando se ejecutó correctamente. Los resultados se han guardado en '$outputFile'.") } else { println("El comando no se ejecutó correctamente.") } } |
Explicación:
- En este ejemplo, utilizamos
ProcessBuilder
para ejecutar un comando y redirigir su salida estándar a un archivo específico. ProcessBuilder.Redirect.to(File(outputFile))
se utiliza para especificar que la salida del proceso debe ser redirigida al archivo cuyo nombre se encuentra en la variableoutputFile
.- Después de ejecutar el proceso, esperamos a que termine y verificamos su estado de salida.
Teoría:
- La redirección de la salida de un proceso a un archivo es útil para capturar la salida del proceso y guardarla en un archivo en lugar de mostrarla en la consola.
ProcessBuilder.Redirect.to(File(outputFile))
es una forma de redirigir la salida estándar de un proceso en Java/Kotlin. La salida se escribirá en el archivo especificado enoutputFile
.
Heredar la salida de un proceso a la consola
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
fun main() { val comando = "ls" // Comando para listar archivos en sistemas Unix/Linux // Crear un objeto ProcessBuilder para ejecutar el comando y heredar la salida val processBuilder = ProcessBuilder(comando) // Redirigir la salida estándar del proceso a la consola processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT) // Ejecutar el proceso val proceso = processBuilder.start() // Esperar a que el proceso termine val estado = proceso.waitFor() if (estado == 0) { println("El comando se ejecutó correctamente.") } else { println("El comando no se ejecutó correctamente.") } } |
Explicación:
- En este ejemplo, utilizamos
ProcessBuilder
para ejecutar un comando y heredar su salida estándar, lo que significa que la salida se mostrará en la consola. ProcessBuilder.Redirect.INHERIT
se utiliza para especificar que la salida del proceso debe heredarse y mostrarse en la consola.
Teoría:
- La herencia de la salida de un proceso a la consola es útil cuando deseas que la salida del proceso se muestre directamente en la consola en lugar de redirigirla a un archivo o capturarla en tu programa.
ProcessBuilder.Redirect.INHERIT
es una opción que permite heredar la salida estándar del proceso y mostrarla en la consola en lugar de redirigirla o capturarla en el programa.