A2 · Bytes, copia y parámetros
Bloque A06, apoyado en A02 y A09. Sin NIO. Los ficheros de los enunciados contienen bytes ASCII salvo que se indique otra cosa. Los fragmentos omiten los import y el manejo de IOException.
Retorno de read()
¿Qué devuelve FileInputStream.read() sin argumentos?
- Un
byteentre -128 y 127, o-1al final.El retorno es
int; si fuerabyte, el valor -1 no se podría distinguir del byte0xFF. - Un
intentre 0 y 255 con el byte leído, o-1al llegar al final.Correcta (A06.1).
- Un
charcon el carácter leído.Lee bytes, no caracteres decodificados.
- La cantidad de bytes leídos.
Eso lo devuelve
read(byte[]). -
nullal llegar al final del fichero.Un tipo primitivo no puede ser
null;nulles la señal dereadLine(). - Lanza
EOFExceptional llegar al final.read()devuelve -1;EOFExceptionla lanzan métodos comoreadInt().
Repasar: A06.1, A15.
Byte 0xFF
El fichero uno.bin contiene un único byte con valor hexadecimal FF. ¿Qué imprime?
try (FileInputStream in = new FileInputStream("uno.bin")) { System.out.println(in.read() + " " + in.read());}-
-1 -1El primer
read()devuelve el byte como valor 0–255, no -1. -
-1 255El orden y los valores no corresponden.
-
255 -1Correcta: el byte
FFse devuelve como 255 y luego llega el final. -
FF -1Se imprime un
intdecimal, no hexadecimal. -
255 0Al final se devuelve -1, no 0.
-
-1y luegoEOFException.read()no lanzaEOFException.
Repasar: A06.1.
write(300)
¿Cuántos bytes tiene n.bin y qué valor tiene el primero?
try (FileOutputStream out = new FileOutputStream("n.bin")) { out.write(300);}- 4 bytes, con el entero 300 en binario.
write(int)escribe un único byte, no unintde cuatro. - 3 bytes:
'3','0','0'.No escribe texto.
- 1 byte con valor 44.
Correcta: escribe los 8 bits bajos; 300 mod 256 = 44.
- 1 byte con valor 255, porque 300 no cabe.
No satura: trunca a los 8 bits bajos.
- Lanza
IllegalArgumentExceptionporque 300 > 255.No valida el rango; trunca.
- 2 bytes, porque 300 necesita 9 bits.
Siempre escribe exactamente un byte.
Repasar: A06.1, A15.
Truncado al abrir
log.txt contiene HOLA. ¿Qué tamaño tiene después de ejecutar esto?
FileOutputStream out = new FileOutputStream("log.txt");out.close();- 4 bytes: no se ha escrito nada, así que no cambia.
El truncado se produce al abrir sin
append, no al escribir. - 0 bytes.
Correcta: al abrir sin anexado, el contenido anterior se pierde.
- 1 byte con un salto de línea.
No se escribe nada.
- Lanza
IOExceptionporque el fichero ya existe.Abrir un fichero existente para escritura es válido.
- El fichero se borra del disco.
Queda el fichero, vacío; truncar no es borrar la entrada.
- Depende de si se llamó a
flush().Sin datos pendientes, el truncado ya ocurrió al abrir.
Repasar: A06.1, A09.
Abrir para leer un inexistente
no-existe.bin no existe. ¿Qué pasa al ejecutar new FileInputStream("no-existe.bin")?
- Crea un fichero vacío y devuelve el flujo.
Abrir para lectura nunca crea el fichero.
- Devuelve un flujo cuyo primer
read()da -1.El constructor ya falla.
- Devuelve
null.Un constructor no devuelve
null. - Lanza
FileNotFoundException, que es subclase deIOException.Correcta (A06.1).
- Lanza
NoSuchFileException.Esa excepción pertenece a NIO, que no se usa aquí.
- Lanza
EOFException.No se ha intentado leer.
Repasar: A06.1.
read con off y len
f.bin contiene ABCDE. ¿Qué imprime?
byte[] b = new byte[6];try (FileInputStream in = new FileInputStream("f.bin")) { int n = in.read(b, 2, 3); System.out.println(n + " " + Arrays.toString(b));}-
3 [65, 66, 67, 0, 0, 0]off= 2 indica dónde se escribe en el array, no cuánto se salta del fichero. -
3 [0, 0, 65, 66, 67, 0]Correcta: lee 3 bytes del principio del fichero y los coloca desde el índice 2.
-
3 [0, 0, 67, 68, 69, 0]Interpreta
offcomo posición del fichero. -
5 [0, 0, 65, 66, 67, 68]lenlimita a 3 bytes como máximo. -
67 [0, 0, 65, 66, 67, 0]El retorno es una cantidad, no un byte.
- Lanza
IndexOutOfBoundsException.2 + 3 = 5 ≤ 6: el tramo es válido.
Repasar: A06.1.
Copia con un error
origen.bin contiene ABCDEF. Supón que las lecturas devuelven 4, luego 2 y luego -1. ¿Qué contiene destino.bin?
byte[] buffer = new byte[4];int leidos;while ((leidos = in.read(buffer)) != -1) { out.write(buffer);}-
ABCDEFSería el resultado con
write(buffer, 0, leidos). -
ABCDEFCDCorrecta: la segunda vuelta escribe el array completo,
E F C D, incluidos los restos. -
ABCDEFseguido de dos bytes a cero.Los restos no son ceros: son
CyDde la lectura anterior. -
ABCDEl bucle sigue hasta -1.
-
ABCDABCDLa segunda lectura sí sobrescribe las dos primeras posiciones con
E F. - Bucle infinito.
Termina al recibir -1.
Repasar: A06.2.
Condición del bucle de copia
En el bucle de copia por bloques, ¿qué condición usa la señal de final que garantiza el contrato?
-
while ((leidos = in.read(buffer)) != -1)Correcta: -1 es la señal contractual de final; el ejemplo docente usa
> 0, que funciona con búfer no vacío. -
while ((leidos = in.read(buffer)) != null)readdevuelve unint; no puede compararse connull. -
while (in.available() > 0)available()es una estimación, no un detector de final. -
while ((leidos = in.read(buffer)) == buffer.length)Una lectura puede no llenar el búfer sin haber llegado al final.
-
while (in.read() != '\n')Es un criterio de texto, no de final de fichero binario.
-
while (!in.eof())FileInputStreamno tiene métodoeof().
Repasar: A06.2.
Escribir un tramo
¿Qué contiene s.txt al terminar?
byte[] b = "HOLA MUNDO".getBytes(StandardCharsets.US_ASCII);try (FileOutputStream out = new FileOutputStream("s.txt")) { out.write(b, 5, 5);}-
HOLAEscribe desde el índice 5, no los 5 primeros.
-
MUNDOCorrecta: desde el índice 5, cinco bytes.
-
MUNDOy un salto de línea.writeno añade separadores. -
MUNDO(cinco espacios delante).offes un índice del array, no una posición del fichero. -
HOLA MUNDOSolo se escribe el tramo indicado.
- Lanza
IndexOutOfBoundsException.5 + 5 = 10 =
b.length: el tramo es válido.
Repasar: A06.1.
Anexado de bytes
a.bin contiene AB. ¿Qué contiene después?
try (FileOutputStream out = new FileOutputStream("a.bin", true)) { out.write('C');}try (FileOutputStream out = new FileOutputStream("a.bin")) { out.write('D');}-
ABCDLa segunda apertura no usa
appendy trunca. -
ABCLa segunda apertura sí escribe
Ddespués de truncar. -
DCorrecta: primero queda
ABC, pero la segunda apertura sin anexado lo vacía y escribeD. -
DBCSupone escribir desde el principio sin truncar;
FileOutputStreamno hace eso. -
ABDNo hay sustitución del último byte.
- No compila:
writeno admite unchar.El
charse promociona aint.
Repasar: A06.1.
Tamaños de primitivas
¿Cuántos bytes tiene p.bin al terminar?
try (DataOutputStream out = new DataOutputStream(new FileOutputStream("p.bin"))) { out.write(65); out.writeInt(65); out.writeDouble(1.5);}- 3
Cuenta un byte por llamada.
- 6
Cuenta 1 + 1 + 4.
- 9
Cuenta
write(65)como 4 bytes y olvida eldouble. - 13
Correcta: 1 (
write) + 4 (writeInt) + 8 (writeDouble). - 16
Cuenta
write(65)como unintde 4 bytes. - 12
Olvida el byte de
write(65).
Repasar: A06.3.
Leer más de lo escrito
d.bin se creó con writeInt(10) y writeInt(20) en un DataOutputStream. ¿Qué ocurre?
try (DataInputStream in = new DataInputStream(new FileInputStream("d.bin"))) { System.out.println(in.readInt()); System.out.println(in.readInt()); System.out.println(in.readInt());}- Imprime
10,20y-1.readIntno tiene valor centinela: -1 podría ser un entero válido. - Imprime
10,20y0.No inventa valores.
- Imprime
10,20ynull.Un
intno puede sernull. - Imprime
10y20, y la tercera lectura lanzaEOFException.Correcta: faltan bytes para un
intcompleto. - Imprime
10,20,10: vuelve al principio.Un flujo secuencial no rebobina.
- Imprime
1020.Cada
printlnimprime un valor.
Repasar: A06.3, A15.
writeUTF frente a texto
¿Qué afirmación sobre DataOutputStream.writeUTF("Hola") es correcta?
- Escribe exactamente los 4 bytes UTF-8 de
Hola, igual que unFileWriteren UTF-8.writeUTFañade delante una longitud de dos bytes. - Escribe dos bytes de longitud seguidos de la cadena en UTF-8 modificado: 6 bytes en este caso.
Correcta (A06.3).
- Escribe 8 bytes: dos por carácter.
Eso se parecería a
writeChars, que escribecharde 2 bytes. - Añade un salto de línea al final.
No añade separadores.
- Puede leerse con
BufferedReader.readLine()sin problemas.Se lee con
readUTF(), que conoce la cabecera de longitud. - Usa la codificación predeterminada del sistema.
Usa siempre UTF-8 modificado.
Repasar: A06.3.
available()
¿Qué afirmación sobre available() es correcta?
- Devuelve el tamaño total del fichero.
Para el tamaño se usa
File.length(). - Devuelve 0 únicamente cuando se ha llegado al final.
Puede devolver 0 sin haber terminado.
- Es una estimación de los bytes que se pueden leer sin bloquear; no sirve como detector general del final.
Correcta (A06.1).
- Devuelve -1 al final, como
read().No devuelve -1.
- Indica cuántos bytes se han leído hasta ahora.
No es un contador de lectura.
- Solo existe en
RandomAccessFile.Es un método de
InputStream.
Repasar: A06.1.
Copia binaria o por líneas
Hay que duplicar foto.png exactamente. ¿Qué enfoque es correcto?
-
BufferedReader.readLine()yBufferedWriter.write()línea a línea.Decodifica y cambia los terminadores: no conserva los bytes.
-
FileReaderyFileWritercarácter a carácter.También interpreta los bytes como texto con una codificación.
-
FileInputStreamyFileOutputStreampor bloques, escribiendo solo los bytes leídos en cada vuelta.Correcta: la copia binaria no interpreta los bytes.
-
DataInputStream.readInt()hastaEOFException, escribiendo conwriteInt.Si el tamaño no es múltiplo de 4 se pierden los últimos bytes.
-
ObjectOutputStream.writeObjectcon el fichero.Serializaría un objeto Java, no copiaría el contenido.
- Cambiar la extensión a
.txty copiarla como texto.La extensión no cambia el formato.
Repasar: A06.2, A09.
Progreso del cuestionario
0 / 0 preguntas respondidas (0%)
0 correctas
¡Cuestionario completado!
0%
0 / 0 correctas
Tiempo: