2009-11-20 23 views

risposta

35

È possibile utilizzare IOUtils.write(byte[] data, OutputStream output) da Apache Commons IO.

KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
kgen.init(128); 
SecretKey key = kgen.generateKey(); 
byte[] encoded = key.getEncoded(); 
FileOutputStream output = new FileOutputStream(new File("target-file")); 
IOUtils.write(encoded, output); 
+61

Perché aggiungere una libreria di terze parti per questo? – jarnbjo

+3

IOUtil è sbagliato è IOUtils.write – rover12

+4

L'OP non richiede la codifica AES del byteArray. –

72

Come Sebastian Redl indica il più diretto ora java.nio.file.Files.write. Dettagli per questo possono essere trovati nel Reading, Writing, and Creating Files tutorial.


Vecchia risposta: FileOutputStream.write(byte[]) sarebbe la più semplice. Quali sono i dati che vuoi scrivere?

Il tutorials for Java IO system potrebbe essere di qualche utilità.

+0

byte [] codificato = chiave.getEncoded(); ho bisogno di scrivere codificato in un file di testo – rover12

+2

Che cosa è 'chiave'? –

+0

KeyGenerator kgen = KeyGenerator.getInstance ("AES"); kgen.init (128); Tasto SecretKey = kgen.generateKey(); byte [] encoded = key.getEncoded(); – rover12

12

Per scrivere un array di byte in un file utilizzare il metodo

public void write(byte[] b) throws IOException 

dalla classe BufferedOutputStream.

java.io.BufferedOutputStream implementa un flusso di output bufferizzato. Impostando un tale flusso di output, un'applicazione può scrivere byte nel flusso di output sottostante senza necessariamente causare una chiamata al sistema sottostante per ogni byte scritto.

Per esempio, avete bisogno di qualcosa di simile:

String filename= "C:/SO/SOBufferedOutputStreamAnswer"; 
BufferedOutputStream bos = null; 
try { 
//create an object of FileOutputStream 
FileOutputStream fos = new FileOutputStream(new File(filename)); 

//create an object of BufferedOutputStream 
bos = new BufferedOutputStream(fos); 

KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
kgen.init(128); 
SecretKey key = kgen.generateKey(); 
byte[] encoded = key.getEncoded(); 

bos.write(encoded); 

} 
// catch and handle exceptions... 
+1

+1 per aver menzionato BufferedOutputStream. Dovresti SEMPRE avvolgere un FileOutputStream in un BufferedOutputStream, le prestazioni sono molto migliori. –

+4

Se tutto ciò che si desidera scrivere sul file è una chiave da 16 byte, l'avvolgimento di FileOutputStream in un BufferedOutputStream è probabilmente più lento della scrittura dei dati direttamente in FileOutputStream. – jarnbjo

+0

@SamBarnum Puoi elaborare? Perché avvolgere il FOS in un BOS più veloce? – theJollySin

16

Un commentatore ha chiesto "perché utilizzare una libreria di terze parti per questo?" La risposta è che è troppo doloroso farlo da solo. Ecco un esempio di come correttamente eseguire l'operazione inversa di lettura di un array di byte da un file (scusate, questo è solo il codice che avevo prontamente disponibile, e non è che io voglia che il richiedente scriva e usi comunque questo codice):

public static byte[] toByteArray(File file) throws IOException { 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    boolean threw = true; 
    InputStream in = new FileInputStream(file); 
    try { 
    byte[] buf = new byte[BUF_SIZE]; 
    long total = 0; 
    while (true) { 
     int r = in.read(buf); 
     if (r == -1) { 
     break; 
     } 
     out.write(buf, 0, r); 
    } 
    threw = false; 
    } finally { 
    try { 
     in.close(); 
    } catch (IOException e) { 
     if (threw) { 
     log.warn("IOException thrown while closing", e); 
     } else { 
     throw e; 
     } 
    } 
    } 
    return out.toByteArray(); 
} 

Ognuno dovrebbe essere completamente sconvolto da ciò che è un dolore.

Utilizzare librerie buone. Io, ovviamente, raccomando Guava's Files.write(byte[], File).

+2

Sono inorridito da ciò che è un dolore, ma anche che questo genere di cose non è nella libreria standard. Non stiamo parlando di un formato di file oscuro, ma spostando i byte dalla memoria al disco. –

+2

risposta migliore: File.write di Guava (byte [], File). – jan

33

Come di Java 1.7, c'è un modo nuovo: java.nio.file.Files.write

import java.nio.file.Files; 
import java.nio.file.Paths; 

KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
kgen.init(128); 
SecretKey key = kgen.generateKey(); 
byte[] encoded = key.getEncoded(); 
Files.write(Paths.get("target-file"), encoded); 

Java 1.7 risolve anche l'imbarazzo che Kevin descrive: la lettura di un file è ora:

byte[] data = Files.readAllBytes(Paths.get("source-file")); 
+6

Questo è probabilmente il metodo consigliato al giorno d'oggi. Tutta la roba di 'SecretKey' non è necessaria; chiama semplicemente 'Files.write()'. Grazie Sebastian! –

4

Non c'è bisogno di librerie esterne gonfiare le cose - specialmente quando si lavora con Android. Ecco una soluzione nativa che fa il trucco. Questo è un pice di codice da un'app che memorizza un array di byte come un file immagine.

// Byte array with image data. 
    final byte[] imageData = params[0]; 

    // Write bytes to tmp file. 
    final File tmpImageFile = new File(ApplicationContext.getInstance().getCacheDir(), "scan.jpg"); 
    FileOutputStream tmpOutputStream = null; 
    try { 
     tmpOutputStream = new FileOutputStream(tmpImageFile); 
     tmpOutputStream.write(imageData); 
     Log.d(TAG, "File successfully written to tmp file"); 
    } 
    catch (FileNotFoundException e) { 
     Log.e(TAG, "FileNotFoundException: " + e); 
     return null; 
    } 
    catch (IOException e) { 
     Log.e(TAG, "IOException: " + e); 
     return null; 
    } 
    finally { 
     if(tmpOutputStream != null) 
      try { 
       tmpOutputStream.close(); 
      } catch (IOException e) { 
       Log.e(TAG, "IOException: " + e); 
      } 
    } 
Problemi correlati