2012-06-27 13 views
18

Tengo un archivo que puede ser cualquier cosa como ZIP, RAR, txt, CSV, doc etc. Me gustaría crear un ByteArrayInputStream de él.
Lo estoy usando para cargar un archivo a FTP a través de FTPClient de Apache Commons Net.Cómo crear ByteArrayInputStream desde un archivo en Java?

¿Alguien sabe cómo hacerlo?

Por ejemplo:

String data = "hdfhdfhdfhd"; 
ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes()); 

Mi código:

public static ByteArrayInputStream retrieveByteArrayInputStream(File file) { 
    ByteArrayInputStream in; 

    return in;  
} 
+0

Para la lectura del archivo en bytes que utilizo RandomAccessFile y la transferencia de archivos enteros los bytes en una matriz de bytes en primer lugar. Encontré que esta es una forma extremadamente rápida para leer archivos en bytes. –

+3

¿Por qué necesitarías hacer esto alguna vez? Puede hacer esto copiando un FileInputStream a un ByteArrayOutputStream y luego creando un ByteArrayInputStream a partir de eso. Es bastante inútil, por supuesto. –

+0

Por favor explique su caso de uso. Probablemente solo desee un FileInputStream. ¿Cómo planeas usarlo una vez que lo tienes? –

Respuesta

28

Utilice la FileUtils#readFileToByteArray(File) de Apache Commons IO, y luego crear el ByteArrayInputStream utilizando el constructor ByteArrayInputStream(byte[]).

public static ByteArrayInputStream reteriveByteArrayInputStream(File file) { 
    return new ByteArrayInputStream(FileUtils.readFileToByteArray(file)); 
} 
+16

Como mencioné en mi respuesta, Java 7 ya contiene un readFileToByteArray en la clase Files, sin necesidad de una biblioteca adicional. –

+6

En realidad, en Java 7, es 'Files.readAllBytes' –

13

La idea general es que un archivo produciría un FileInputStream y una byte[] un ByteArrayInputStream. Ambos implementan InputStream por lo que deben ser compatibles con cualquier método que use InputStream como parámetro.

Poner todos los contenidos del archivo en un ByteArrayInputStream se puede hacer, por supuesto:

  1. de lectura en el archivo completo en un byte[]; La versión de Java> = 7 contiene un convenience method called readAllBytes para leer todos los datos de un archivo;
  2. crear un ByteArrayInputStream alrededor del contenido del archivo, que ahora está en la memoria.

Tenga en cuenta que esta puede no ser la solución óptima para archivos muy grandes: todo el archivo se almacenará en la memoria en el mismo momento. Usar el flujo correcto para el trabajo es importante.

3

Esto no es exactamente lo que estás preguntando, pero es una manera rápida de leer archivos en bytes.

File file = new File(yourFileName); 
RandomAccessFile ra = new RandomAccessFile(yourFileName, "rw"): 
byte[] b = new byte[(int)file.length()]; 
try { 
    ra.read(b); 
} catch(Exception e) { 
    e.printStackTrace(); 
} 

//Then iterate through b 
+0

por favor complete su código si puede? – itro

4

A ByteArrayInputStream es un InputStream envoltura alrededor de un conjunto de bytes. Esto significa que tendrá que leer completamente el archivo en un byte[], y luego usar uno de los constructores ByteArrayInputStream.

¿Puede dar más detalles de lo que está haciendo con el ByteArrayInputStream? Es probable que haya formas mejores en torno a lo que intentas lograr.

Editar:
Si está utilizando Apache FtpClient para cargar, sólo tendrá un InputStream. Puedes hacerlo;

String remote = "whatever"; 
InputStream is = new FileInputStream(new File("your file")); 
ftpClient.storeFile(remote, is); 

Por supuesto, debe recordar cerrar la secuencia de entrada una vez que haya terminado con ella.

+0

Lo estoy usando para subir archivos a ftp a través de FTPClient commons Apache. – itro

+0

@itro - actualicé mi respuesta con FTPClient detalles – Qwerky

1

Esta pieza de código es muy útil:

private static byte[] readContentIntoByteArray(File file) 
{ 
    FileInputStream fileInputStream = null; 
    byte[] bFile = new byte[(int) file.length()]; 
    try 
    { 
    //convert file into array of bytes 
    fileInputStream = new FileInputStream(file); 
    fileInputStream.read(bFile); 
    fileInputStream.close(); 
    } 
    catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 
    return bFile; 
} 

Referencia: http://howtodoinjava.com/2014/11/04/how-to-read-file-content-into-byte-array-in-java/

Cuestiones relacionadas