web-dev-qa-db-fra.com

Convertir un fichier en tableau d'octets et vice versa

J'ai trouvé de nombreuses façons de convertir un fichier en tableau d'octets et d'écrire tableau d'octets en fichier sur le stockage.

Ce que je veux, c'est convertir Java.io.File en un tableau d'octets, puis reconvertit un tableau d'octets en un Java.io.File.

Je ne veux pas l'écrire sur le stockage comme suit:

//convert array of bytes into file
FileOutputStream fileOuputStream = new FileOutputStream("C:\\testing2.txt"); 
fileOuputStream.write(bFile);
fileOuputStream.close();

Je veux en quelque sorte faire ce qui suit:

File myFile = ConvertfromByteArray(bytes);
34
Reg

Je pense que vous avez mal compris ce que le Java.io.File La classe représente vraiment. C’est juste une représentation du fichier sur votre système, c’est-à-dire son nom, son chemin, etc.

Avez-vous même regardé le Javadoc pour le Java.io.File classe? Regardez ici Si vous vérifiez les champs qu'il contient, les méthodes ou les arguments du constructeur, vous obtenez immédiatement l'indice que tout ce dont il s'agit est une représentation de l'URL/chemin.

Oracle fournit un didacticiel assez complet dans leur didacticiel d'E/S de fichier Java , avec la dernière fonctionnalité de NIO.2.

Avec NIO.2, vous pouvez le lire sur une seule ligne avec Java.nio.file.Files.readAllBytes () .

De même, vous pouvez utiliser Java.nio.file.Files.write () pour écrire tous les octets de votre tableau d'octets.

[~ # ~] met à jour [~ # ~]

Puisque la question est étiquetée Android, la méthode la plus classique consiste à envelopper le FileInputStream dans un BufferedInputStream, puis dans un ByteArrayInputStream. Cela vous permettra de lire le contenu dans un byte[]. De même, leurs homologues existent pour le OutputStream.

22
jbx

Sinon, essayez ceci:

Conversion de fichier en octets

  import Java.io.File;
  import Java.io.FileInputStream;
  import Java.io.FileNotFoundException;
  import Java.io.IOException;


   public class Temp {

        public static void main(String[] args) {

         File file = new File("c:/EventItemBroker.Java");

         byte[] b = new byte[(int) file.length()];
         try {
               FileInputStream fileInputStream = new FileInputStream(file);
               fileInputStream.read(b);
               for (int i = 0; i < b.length; i++) {
                           System.out.print((char)b[i]);
                }
          } catch (FileNotFoundException e) {
                      System.out.println("File Not Found.");
                      e.printStackTrace();
          }
          catch (IOException e1) {
                   System.out.println("Error Reading The File.");
                    e1.printStackTrace();
          }

       }
    }

Conversion d'octets en fichier

      public class WriteByteArrayToFile {

         public static void main(String[] args) {

            String strFilePath = "Your path";
            try {
                 FileOutputStream fos = new FileOutputStream(strFilePath);
                 String strContent = "Write File using Java ";

                 fos.write(strContent.getBytes());
                 fos.close();
           }
          catch(FileNotFoundException ex)   {
                 System.out.println("FileNotFoundException : " + ex);
          }
         catch(IOException ioe)  {
                 System.out.println("IOException : " + ioe);
          }

       }
     }
53
RajeshVijayakumar

Tu ne peux pas faire ça. Un File n'est qu'un moyen abstrait de faire référence à un fichier dans le système de fichiers. Il ne contient aucun contenu du fichier lui-même.

Si vous essayez de créer un fichier en mémoire auquel vous pouvez vous référer à l'aide d'un objet File, vous ne pourrez pas le faire non plus, comme expliqué dans ce fil , ce fil , et beaucoup d'autres endroits ..

8
Ted Hopp

Apache FileUtil donne des méthodes très pratiques pour effectuer la conversion

try {
    File file = new File(imagefilePath);
    byte[] byteArray = new byte[file.length()]();
    byteArray = FileUtils.readFileToByteArray(file);  
 }catch(Exception e){
     e.printStackTrace();

 }
7
Jess

Vous ne pouvez pas le faire pour File, qui est principalement un chemin de fichier intelligent. Pouvez-vous refactoriser votre code afin qu'il déclare les variables et transmette les arguments, avec le type OutputStream au lieu de FileOutputStream? Si tel est le cas, voir les classes Java.io.ByteArrayOutputStream et Java.io.ByteArrayInputStream

OutputStream outStream = new ByteArrayOutputStream();
outStream.write(whatever);
outStream.close();
byte[] data = outStream.toByteArray();
InputStream inStream = new ByteArrayInputStream(data);
...
3
Patricia Shanahan

Il n’existe pas de telle fonctionnalité, mais vous pouvez utiliser un fichier temporaire de File.createTempFile () .

File temp = File.createTempFile(prefix, suffix);
// tell system to delete it when vm terminates.
temp.deleteOnExit();
3
auselen

Du côté serveur

@RequestMapping("/download")
public byte[] download() throws Exception {
    File f = new File("C:\\WorkSpace\\Text\\myDoc.txt");
     byte[] byteArray = new byte[(int) f.length()];
        byteArray = FileUtils.readFileToByteArray(f);
        return byteArray;
}

Côté client

private ResponseEntity<byte[]> getDownload(){
    URI end = URI.create(your url which server has exposed i.e. bla 
              bla/download);
    return rest.getForEntity(end,byte[].class);

}

public static void main(String[] args) throws Exception {


    byte[] byteArray = new TestClient().getDownload().getBody();
    FileOutputStream fos = new 
    FileOutputStream("C:\\WorkSpace\\testClient\\abc.txt");

     fos.write(byteArray);
     fos.close(); 
     System.out.println("file written successfully..");


}
0
Manas