2011-02-08 26 views

Respuesta

28

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 devolver el File o String utilizados en la construcción de la corriente.

EDITAR: Lo mismo vale para FileInputStream.

+1

Supongo que la misma respuesta es para FileInputStream ¿no? –

+3

@ Stephen- Leí los documentos, pero solo quería confirmar que no me había perdido nada. –

12

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.

que sugeriría la aplicación de algunas FileNameAware interfaz para esto), como E/S corrientes están referenciadas por lo general con los InputStream/OutputStream clases abstractas para evitar el acoplamiento de su aplicación con implementaciones específicas.

-2

Mi respuesta llega un poco tarde. Pego el mismo problema cuando escribo un código.

Para evitarlo, utilicé un FileOutputStream(File file) en 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()); 
+0

¿Por qué el voto negativo? ¿Alguien puede explicar? –

+10

Tal vez porque putStream File (Out/In) no importó aquí al mantener el archivo. Si el método solo devuelve un flujo, no tiene ninguna posibilidad (con el uso directo de FileInputStream) de recuperar el archivo subyacente o la ubicación –

7

posible, con la reflexión: Tom G respuesta es correcta, es decir, no hay una 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.

+0

. No existe tal campo en JDK 1.6, 1.7 o 1.8. – EJP

+0

EJP, estás equivocado. Hay tal campo. Acabo de probarlo en Java 1.8.0_112-b16. El código completo aquí: –

+0

import java.io.FileOutputStream; import java.lang.reflect.Field; clase pública FileOutputStreamTest { principales (args String []) public static void inicia excepción { FileOutputStream flujoSalida = new FileOutputStream ("./ FileOutputStreamTest.java"); Campo pathField = FileOutputStream.class.getDeclaredField ("ruta"); pathField.setAccessible (true); String path = (String) pathField.get (outputStream); System.out.println ("ruta =" + ruta); } } –

1

Esto no es posible, incluso 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 archivos, y nunca necesité esta funcionalidad. Lo que está pidiendo sugiere que tiene un defecto de diseño. Es decir, tienes un problema XY.

  • Casi no hay razón para código para declarar la clase de una referencia a un objeto de secuencia a ser una corrientearchivo. El código IO puede usar un InputStream o OutputStteam. De hecho, es debería, como parte de la programación de una interfaz, y para 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.
Cuestiones relacionadas