web-dev-qa-db-fra.com

Comment créer ByteArrayInputStream à partir d'un fichier en Java?

J'ai un fichier qui peut être n'importe quoi comme Zip, RAR, txt, CSV, doc etc. Je voudrais en créer un ByteArrayInputStream .
Je l'utilise pour télécharger un fichier sur FTP via FTPClient depuis Apache Commons Net.

Quelqu'un sait-il comment le faire?

Par exemple:

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

Mon code:

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

    return in;     
}
22
itro

Utilisez le FileUtils#readFileToByteArray(File) de Apache Commons IO , puis créez le ByteArrayInputStream en utilisant le ByteArrayInputStream(byte[]) constructeur.

public static ByteArrayInputStream retrieveByteArrayInputStream(File file) {
    return new ByteArrayInputStream(FileUtils.readFileToByteArray(file));
}
35
npe

L'idée générale est qu'un fichier produirait un FileInputStream et un byte[] a ByteArrayInputStream. Les deux implémentent InputStream et doivent donc être compatibles avec toute méthode qui utilise InputStream comme paramètre.

Mettre tout le contenu du fichier dans un ByteArrayInputStream peut être fait bien sûr:

  1. lire le fichier complet dans un byte[]; Java version> = 7 contient un méthode pratique appelée readAllBytes pour lire toutes les données d'un fichier;
  2. créez un ByteArrayInputStream autour du contenu du fichier, qui est maintenant en mémoire.

Notez que cela peut ne pas être la solution optimale pour les fichiers très volumineux - tout le fichier sera stocké en mémoire au même moment. Il est important d'utiliser le bon flux pour le travail.

17
Maarten Bodewes

Un ByteArrayInputStream est un wrapper InputStream autour d'un tableau d'octets. Cela signifie que vous devrez lire entièrement le fichier dans un byte[], puis utilisez l'un des constructeurs ByteArrayInputStream.

Pouvez-vous donner plus de détails sur ce que vous faites avec le ByteArrayInputStream? Il est probable qu'il existe de meilleures façons de réaliser ce que vous essayez de réaliser.

Modifier:
Si vous utilisez Apache FTPClient pour télécharger, vous avez juste besoin d'un InputStream. Tu peux le faire;

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

Vous devez bien sûr vous rappeler de fermer le flux d'entrée une fois que vous l'avez terminé.

5
Qwerky

Ce n'est pas exactement ce que vous demandez, mais c'est un moyen rapide de lire des fichiers en octets.

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
3
Sam Palmer

Ce morceau de code est pratique:

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;
}

Référence: http://howtodoinjava.com/2014/11/04/how-to-read-file-content-into-byte-array-in-Java/

3
Buddy