java - leer - Obtener el nombre de archivo de FileOutputStream
fileoutputstream java ejemplo (5)
¿Hay alguna manera de obtener el nombre de archivo de FileOutputStream
o FileInputStream
?
Esta función no es proporcionada por el archivo-entrada / salida-Stream listo para usar, pero nada le impide escribir su propia subclase que almacena el archivo (o fileName) y proporciona un getter para ello.
Sugiero implementar alguna interfaz FileNameAware
para esto), ya que las E / S Streams generalmente se referencian con las clases abstractas InputStream
/ OutputStream
para evitar el acoplamiento de su aplicación con implementaciones específicas.
Esto no es posible, ni siquiera en principio. La suposición de la pregunta es que cada flujo de entrada de archivo está asociado con un archivo que tiene un nombre. La última suposición es incorrecta, para los sistemas POSIX. Para los sistemas POSIX, un archivo puede tener cualquier cantidad de nombres (enlaces duros), incluido cero. El caso de cero nombres es bastante común para los archivos temporales, para garantizar que el archivo temporal se elimine al salir del programa.
He escrito un montón de código IO de archivo y nunca necesité esta funcionalidad. Lo que está pidiendo sugiere que tiene un defecto de diseño. Es decir, tienes un problema XY.
- No hay casi ninguna razón para que el código declare que la clase de una referencia a un objeto de transmisión es una secuencia de archivos . El código IO puede usar un InputStream o OutputStteam. De hecho, debería , como parte de la programación de una interfaz, y permitir pruebas de unidades baratas de su código IO (habilitando el uso de una transmisión de matriz de bytes simple como un objeto simulado).
- ¿Quizás esperas usar el nombre de archivo en algunos mensajes de registro? Si es así, eso sugiere que está intentando registrar errores de IO de archivo demasiado bajos en la jerarquía de su programa. Quizás esté detectando IOExceptions demasiado "temprano", en lugar de dejar que se propaguen a partes superiores de su programa, que saben que el IO es el archivo IO y conocen el nombre del archivo.
Mi respuesta llega un poco tarde. Pego el mismo problema cuando escribo un código.
Para file.getAbsolutePath()
, utilicé FileOutputStream(File file)
lugar de FileOutputStream(String location)
porque puedo hacer file.getAbsolutePath()
. Vea el fragmento de ejemplo a continuación.
String location = "some.relative.path.txt";
File file = new File(location);
FileOutputStream f = new FileOutputStream(file);
String question = "<h3>"+header+"</h3>";
String finalSource = HTMLWrapper.HTML_START+question +htmlContent;
f.write(finalSource.getBytes());
f.flush();
f.close();
System.out.println("The report is now available at"+file.getAbsolutePath());
Parece que la respuesta es no: http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileOutputStream.html
http://docs.oracle.com/javase/7/docs/api/index.html?java/io/FileOutputStream.html
No hay métodos públicos que devuelvan el File
o la String
utilizados en la construcción de la transmisión.
EDITAR: Lo mismo vale para FileInputStream
.
Posible, con reflexión : la respuesta de Tom G es correcta, es decir, no hay API para obtener la ruta. Sin embargo, si estás atascado como yo con un marco que no puedes cambiar y no puedes obtener el nombre de archivo de ninguna otra manera, puedes usar el reflejo para obtener la ruta (en mi caso, la necesité para propósitos de depuración).
Field pathField = FileOutputStream.class.getDeclaredField("path");
pathField.setAccessible(true);
String path = (String) pathField.get(outputStream);
Obviamente, la implementación de FileOutpuStream podría cambiar con el tiempo y este código podría romperse. Además, omití el manejo de excepciones en el fragmento anterior para mayor claridad.
No disponible en 1.6 y 1.7 Confirmado disponible en 1.8.