"Comenzaremos con secuencias para la entrada/salida de archivos. Pero lo primero es lo primero".

Hay dos clases para leer y escribir archivos: FileInputStream y FileOutputStream . Como probablemente ya haya adivinado, FileInputStream puede leer secuencialmente bytes de un archivo y FileOutputStream puede escribir secuencialmente bytes en un archivo. Estos son los métodos que tienen estas clases:

Método que hace el metodo
FileInputStream(String fileName);
— Este es el constructor. Le permite especificar el nombre de un archivo en el disco, desde el cual el objeto creado leerá los datos.
int read();
— Este método lee un byte del archivo y lo devuelve. El valor de retorno se amplía a un int.
int available();
— Este método devuelve el número de bytes no leídos (disponibles).
void close();
— Este método «cierra» el flujo. Llamas a esto cuando hayas terminado de trabajar con la transmisión.
Luego, el objeto realiza las operaciones de limpieza necesarias para cerrar el archivo, etc.
En este punto, no puede leer más datos de la secuencia.

Solo por diversión, calculemos la suma de todos los bytes en un archivo. Así es como se ve el código:

Sumar todos los bytes en un archivo
public static void main(String[] args) throws Exception
{
 //Create a FileInputStream object bound to «c:/data.txt».
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 long sum = 0;

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); //Read the next byte
  sum +=  data; //Add it to the running total
 }
 inputStream.close(); // Close the stream

 System.out.println(sum); // Display the sum on the screen.
}

"Ya hemos investigado algo como esto. ¿Cómo se organiza FileOutputStream?"

"Está bien. Mira esto:"

Método que hace el metodo
FileOutputStream (String fileName);
"Este es el constructor. Te permite especificar el nombre de un archivo en el disco, en el que el objeto creado escribirá datos".
void write(int data);
"Este método escribe el siguiente byte, truncando los datos a un byte".
void flush();
"Los datos que se escribirán a menudo se recopilan primero en grandes bloques en la memoria y luego solo se escriben en el disco".

El comando de descarga obliga a que toda la información no guardada se escriba en el disco.

void close();
"Este método "cierra" la transmisión. Lo llamas cuando terminas de trabajar con la transmisión".
Luego, el objeto realiza las operaciones de limpieza necesarias para cerrar el archivo, etc.

Ya no puede escribir datos en la transmisión y se llama automáticamente a flush.

"¿Eso es todo?"

"Sí, en realidad solo hay un método para escribir: escribir (). Escribe solo un byte a la vez. Pero te permite escribir tanta información como quieras en el archivo".

La programación es un proceso de dividir una tarea grande y compleja en muchas pequeñas. Esencialmente, el mismo proceso está ocurriendo aquí: leer y escribir grandes bloques de datos se divide en lectura y escritura en partes pequeñas, un byte a la vez.

Así es como puede usar estas clases para copiar un archivo en el disco:

Copiar un archivo en el disco
public static void main(String[] args) throws Exception
{
 //Create a stream to read bytes from a file
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 //Create a stream to write bytes to a file
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); // Read the next byte into the data variable
  outputStream.write(data); // and write it to the second stream
 }

 inputStream.close(); //Close both streams. We don't need them any more.
 outputStream.close();
}

"Gracias, Rishi. Finalmente entiendo cómo funciona este código".