Tengo un método que espera que de la una de la entrada de la variable de java.io.Tipo de archivo, pero lo que me pasa es solo InputStream. También, no puedo cambiar la firma del método.

¿Cómo puedo convertir el InputStream en tipo de Archivo con escribir el archivo en el sistema de ficheros?

  • Es esta una función integrada? o es una función personalizada?
  • «No puedo cambiar la firma del método.»
  • ¿Por qué es exactamente lo que usted necesita un File objeto en lugar de la InputStream?
  • No puedo utilizar el InputStream porque la API estoy usando mandatos Archivo
  • Me parece que alguien ha diseñado un roto de la API de que sólo acepta archivos en lugar de InputStreams, y ahora usted tiene que utilizar esta API
InformationsquelleAutor Ram | 2010-11-30

2 Comentarios

  1. 114

    Algo como esto debería funcionar. Tenga en cuenta que para simplificar, he usado Java 7 característica (bloque try con closeable de recursos), y IOUtils de Apache commons-io. Si usted no puede utilizar esos que va a ser un poco más largo, pero la misma idea.

    import org.apache.commons.io.IOUtils;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class StreamUtil {
    
        public static final String PREFIX = "stream2file";
        public static final String SUFFIX = ".tmp";
    
        public static File stream2file (InputStream in) throws IOException {
            final File tempFile = File.createTempFile(PREFIX, SUFFIX);
            tempFile.deleteOnExit();
            try (FileOutputStream out = new FileOutputStream(tempFile)) {
                IOUtils.copy(in, out);
            }
            return tempFile;
        }
    
    }
    • No createTempFile en realidad no escribir un archivo real, que se puede ver en el sistema de archivos?
    • usted es técnicamente correcto. utilizando el código anterior, el archivo temporal existirá hasta que el programa termina o es eliminado por el programa.
    • La documentación de deleteOnExit decir que no debe confiar en que el trabajo (y creo que en realidad no hacer nada) : developer.android.com/reference/java/io/… . Además, si usted sabe cómo transmitir el sonido en el juego, sin ningún tipo de archivo, por favor escribir sobre ella aquí: stackoverflow.com/q/36552381/878126
    • Hablando en general, yo prefiero para la aplicación a eliminar el archivo temporal cuando tenga sentido hacerlo. Yo uso deleteOnExit como un extra de la cordura-cheque, nunca confiar en ella incondicionalmente. Sé que en ciertas situaciones (kill -9 la JVM, por ejemplo) el cierre de ganchos que realizar el borrado nunca será llamado.
    • Si usted está usando esto en Android, agregar implementation 'org.apache.directory.studio:org.apache.commons.io:2.4' a gradle.
  2. 30

    No se puede. La secuencia de entrada es sólo un genérico de los datos de flujo y no hay ninguna garantía de que realmente se origina a partir de un Archivo. Si alguien crea un InputStream a partir de la lectura de un servicio web o simplemente convertir una Cadena en un InputStream, no habría ninguna manera el vínculo con un archivo. Así que la única cosa que usted puede hacer es escribir los datos de la secuencia a un archivo temporal (por ejemplo, utilizando el Archivo.createTempFile método) y alimentar este archivo en su método.

    • De hecho, el File#createTempFile() es realmente su mejor apuesta.
    • Véase también File#deleteOnExit(), que hace que la JVM para intentar eliminar el archivo de forma automática cuando la JVM salidas. Por supuesto, es mejor para eliminar el archivo temporal manualmente y de inmediato, una vez que usted sabe que el archivo ya no es necesario y ya no está en uso. Pero en un mundo imperfecto, a veces imperfecto soluciones son necesarias.

Dejar respuesta

Please enter your comment!
Please enter your name here