A1 · File, rutas y filtros
Bloques A01–A05 y matices de A15. Sin NIO. Seis opciones y una sola correcta por pregunta. Los fragmentos omiten los import y el manejo de IOException.
Entrada y salida
Un programa Java lee un fichero del disco y escribe un resumen en otro fichero. Desde el punto de vista de la E/S de Java, ¿qué afirmación es correcta?
- Leer del disco es entrada y escribir en disco es salida, porque se define desde el programa.
Correcta: entrada y salida se definen respecto al programa (A01).
- Leer del disco es salida, porque los datos salen del disco.
Invierte el punto de vista: se toma el del programa, no el del dispositivo.
- Ambas operaciones son salida, porque las dos usan el disco.
El dispositivo no determina la dirección; la determina el sentido respecto al programa.
- Solo se habla de entrada/salida cuando interviene la red.
La E/S incluye ficheros, consola, memoria, teclado y red.
- Un flujo (stream) siempre representa un fichero del disco.
Un flujo abstrae cualquier origen o destino: memoria, consola, red, ficheros…
- El dato pasa a ser persistente en cuanto se guarda en una variable.
Una variable en RAM no es persistente; la persistencia sobrevive a la ejecución.
Repasar: A01.
Dos ejes independientes
¿Qué afirmación sobre la clasificación de ficheros del temario es correcta?
- Un fichero de texto siempre se lee secuencialmente y uno binario siempre de forma aleatoria.
Son ejes independientes: un binario puede leerse secuencialmente y un texto puede recorrerse con posiciones.
- La extensión
.datconvierte el contenido en binario.La extensión no cambia el formato; lo determina cómo se escribió.
- Texto/binario y secuencial/aleatorio son dos ejes distintos que se combinan.
Correcta: representación y forma de acceso son ejes independientes (A03).
- Un fichero de texto no está formado por bytes.
Físicamente todo son bytes; el texto se interpreta mediante una codificación.
-
RandomAccessFileobliga a que todos los registros tengan el mismo tamaño.Los registros fijos facilitan el cálculo de posiciones, pero la clase no lo impone.
- Se puede acceder aleatoriamente a la entrada de teclado porque es un flujo.
El acceso aleatorio requiere un soporte que permita reposicionarse; el teclado no.
Repasar: A03.
Abstracciones de flujos
¿Qué combinación de clase base y tipo de datos es correcta?
-
Reader→ bytes de entrada.Readeres la base de la entrada de caracteres. -
OutputStream→ caracteres de salida.OutputStreames salida de bytes; los caracteres de salida van conWriter. -
InputStream→ bytes de entrada.Correcta (A02.1).
-
Writer→ bytes de salida.Writerescribe caracteres. -
PrintStream→ familia de caracteres, porque imprime texto.PrintStreamhereda deOutputStream: es familia de bytes aunque imprima texto. -
RandomAccessFile→ subclase deInputStream.Implementa
DataInputyDataOutput, pero no hereda deInputStream.
Repasar: A02.1, A02.3.
¿Crea el fichero?
La carpeta de trabajo está vacía. ¿Qué imprime este fragmento?
File f = new File("informe.txt");System.out.println(f.exists() + " " + f.length() + " " + f.getName());-
false 0 informe.txtCorrecta:
new Filesolo representa la ruta;length()de un inexistente devuelve 0. -
true 0 informe.txtSupone que el constructor crea el fichero; no lo hace.
-
false -1 informe.txtlength()no devuelve -1 para un inexistente: devuelve 0. - Lanza
FileNotFoundExceptionen la primera línea.El constructor de
Fileno comprueba la existencia. -
false 0seguido de la ruta absoluta completa.getName()devuelve solo el último nombre de la ruta. - No compila porque
length()devuelveinty se concatena conboolean.Devuelve
longy la concatenación conStringcompila sin problema.
Repasar: A04.1, A04.2.
length() igual a 0
f.length() devuelve 0. ¿Qué se puede deducir con seguridad?
- Que el fichero existe y está vacío.
También devuelve 0 si no existe.
- Que el fichero no existe.
Un fichero existente y vacío también da 0.
- Que
fes un directorio.El tamaño de los directorios no está especificado por este contrato; no se deduce.
- Nada concluyente sobre su existencia: hay que comprobar
exists()oisFile().Correcta: 0 es ambiguo entre vacío e inexistente (A15).
- Que se ha producido una
IOExceptionsilenciosa.No se deduce ningún error.
- Que el fichero tiene 0 líneas pero puede tener bytes.
length()mide bytes, no líneas.
Repasar: A04.2, A15.
createNewFile dos veces
La carpeta datos existe y está vacía. ¿Qué imprime?
File f = new File("datos", "a.txt");boolean r1 = f.createNewFile();boolean r2 = f.createNewFile();System.out.println(r1 + " " + r2);-
true trueLa segunda llamada no vuelve a crear nada.
-
true falseCorrecta:
falsesignifica que ya existía; no es una excepción. -
false falseLa primera vez sí se crea el fichero.
-
truey después lanzaIOExceptionporque ya existe.Que exista ya no es un error: devuelve
false. -
false trueEl orden es al revés.
- No compila:
File(String, String)no existe.Es uno de los tres constructores del temario: padre y nombre hijo.
Repasar: A04.2.
Padre inexistente
La carpeta nueva no existe. ¿Qué ocurre?
File f = new File("nueva/a.txt");f.createNewFile();- Crea la carpeta
nuevay el ficheroa.txt.createNewFileno crea directorios padre. - Devuelve
falsesin más.falsesignifica «ya existía»; aquí el problema es otro. - Falla con una
IOException, porque el directorio padre no existe.Correcta: no crea padres y la E/S falla.
- Crea
a.txten la carpeta de trabajo.Respeta la ruta indicada; no la cambia.
- Lanza
NullPointerExceptional construir elFile.El constructor acepta la ruta aunque no exista.
- Devuelve
true, pero el fichero se crea al cerrar el programa.No hay creación diferida; eso se parece a
deleteOnExit, que además borra.
Repasar: A04.2, A04.3.
mkdir frente a mkdirs
No existe ninguna de las carpetas x, x/y ni x/y/z. ¿Qué imprime?
File d = new File("x/y/z");System.out.println(d.mkdir() + " " + d.mkdirs() + " " + d.mkdirs());-
true true falsemkdirno crea padres: la primera llamada falla. -
false false falsemkdirssí crea los padres que faltan. -
true false falseLa primera llamada no puede crear
zsinx/y. -
false true falseCorrecta:
mkdirfalla,mkdirscrea toda la ruta y la tercera llamada no crea nada porque ya existe. -
false true trueSi el directorio ya existe,
mkdirsdevuelvefalse. - Lanza
IOExceptionenmkdir().mkdirinforma del fallo confalse, no con excepción.
Repasar: A04.2.
renameTo y el objeto original
viejo.txt existe y nuevo.txt no. El renombrado funciona. ¿Qué imprime?
File a = new File("viejo.txt");boolean ok = a.renameTo(new File("nuevo.txt"));System.out.println(ok + " " + a.getName() + " " + a.exists());-
true nuevo.txt trueEl objeto
Fileoriginal no cambia su ruta tras renombrar. -
true viejo.txt falseCorrecta:
asigue representandoviejo.txt, que ya no existe. -
true viejo.txt trueviejo.txtya no existe en disco. -
false viejo.txt trueEl enunciado indica que el renombrado funciona.
-
true nuevo.txt falsegetName()devuelve la ruta que representa el objeto:viejo.txt. - No compila:
renameTorecibe unString.Recibe un
Filede destino.
Repasar: A04.2.
Borrar un directorio con contenido
carpeta existe y contiene un fichero. ¿Qué devuelve new File("carpeta").delete()?
-
true, y borra la carpeta con su contenido.deleteno borra recursivamente. -
false, porque solo borra ficheros o directorios vacíos.Correcta (A04.2).
-
true, pero la carpeta se borra al terminar la JVM.Eso describe
deleteOnExit, y ese método no devuelveboolean. - Lanza
IOExceptionindicando que el directorio no está vacío.deleteinforma confalse, sin el motivo detallado. -
false, porquedeletesolo sirve para ficheros.Sí borra directorios cuando están vacíos.
- Borra solo el fichero de dentro y devuelve
true.No toca el contenido.
Repasar: A04.2.
Firma de FilenameFilter
¿Cuál es la firma del único método de FilenameFilter?
-
boolean accept(File file)Esa es la de
FileFilter, otra interfaz distinta. -
boolean accept(String path)Recibe también el directorio, y el nombre no es la ruta completa.
-
boolean accept(File dir, String name)Correcta: el directorio que se lista y el nombre de la entrada candidata.
-
void accept(File dir, String name)Debe devolver
booleanpara incluir o descartar. -
String[] accept(File dir)El filtro decide entrada a entrada; el array lo devuelve
list. -
boolean filter(File dir, String name)El método se llama
accept.
Repasar: A05, A15.
Listado sin coincidencias
dir es un directorio existente y accesible. Contiene a.TXT, b.csv y una subcarpeta llamada c.txt. ¿Qué contiene nombres?
String[] nombres = dir.list((padre, nombre) -> nombre.endsWith(".txt") && new File(padre, nombre).isFile());-
nullnullindica que no es un directorio o un error de E/S; aquí el directorio existe. -
{"a.TXT"}endsWithdistingue mayúsculas y minúsculas:.TXTno termina en.txt. -
{"c.txt"}c.txtes un directorio y el filtro exigeisFile(). - Un array vacío.
Correcta: ninguna entrada cumple las dos condiciones.
-
{"a.TXT", "c.txt"}Ignora tanto las mayúsculas como la comprobación
isFile(). - Rutas completas en lugar de nombres.
listdevuelve nombres;listFiles, objetosFile.
Repasar: A05.
list sobre un fichero
notas.txt es un fichero regular existente. ¿Qué ocurre?
String[] r = new File("notas.txt").list();System.out.println(r.length);- Imprime
0, porque un fichero no tiene entradas.Sobre algo que no es un directorio,
list()devuelvenull, no un array vacío. - Imprime
1, con el propio nombre del fichero.No lista el propio fichero.
- Lanza
NullPointerExceptionen la segunda línea.Correcta:
resnully acceder a.lengthfalla. - Lanza
IOExceptionen la primera línea.list()no declaraIOException; informa connull. - Imprime el número de líneas del fichero.
listno lee contenido. - No compila:
list()exige un filtro.Hay sobrecarga sin filtro.
Repasar: A04.2, A05.
Filtro como clase
Una clase Filtrar implements FilenameFilter sobrescribe accept. ¿Qué afirmación es correcta?
- Se escribe
dir.list(new FilenameFilter())para usarla.No se instancia una interfaz.
-
dir.list(new Filtrar())funciona por polimorfismo: se pasa una instancia de una clase que implementa la interfaz.Correcta (A05).
- Solo sirve con
listFiles, no conlist.Ambos tienen una sobrecarga que recibe un
FilenameFilter. - Si
acceptdevuelvetrue, la entrada se descarta.truesignifica incluir la entrada. - Pasar
nullcomo filtro descarta todas las entradas.Un filtro
nullacepta todos los nombres. - Dentro de
acceptno se puede consultar el tamaño del fichero.Se puede construir
new File(dir, name)y consultarlength(),isFile(), etc.
Repasar: A05.
Fichero temporal
¿Qué afirmación sobre File.createTempFile("tmp", ".txt") es correcta?
- Solo crea una representación; el fichero aparece al escribir en él.
A diferencia de
new File, crea físicamente el fichero. - Se borra automáticamente al terminar la JVM.
No se borra solo; para eso se llama además a
deleteOnExit(). - Es un método de instancia que se llama sobre un
Fileexistente.Es estático.
- Devuelve un
Stringcon la ruta.Devuelve un
File. - Crea un fichero vacío con un nombre que no se repite y devuelve su
File; puede lanzarIOException.Correcta (A04.2).
- Acepta prefijos de un solo carácter.
El prefijo debe tener al menos tres caracteres.
Repasar: A04.2.
Progreso del cuestionario
0 / 0 preguntas respondidas (0%)
0 correctas
¡Cuestionario completado!
0%
0 / 0 correctas
Tiempo: