2009-09-25 15 views
7

Possiedo un software che consente di scrivere componenti aggiuntivi in ​​file javascript (con estensione js) che consentono di utilizzare la funzione Java (non so se questo è comune, non ho mai visto java call in javascript file before)Scrivi un file binario scaricato su disco in Java

Ho bisogno di scaricare un file binario da un server web e scriverlo sul disco rigido. Ho provato il seguente codice:

baseencoder = new org.apache.commons.codec.binary.Base64(); 
url = new java.net.URL("https://server/file.tgz"); 

urlConnect = url.openConnection(); 
urlConnect.setDoInput(true); 
urlConnect.setDoOutput(true); 
urlConnect.setRequestProperty("authorization","Basic "+ java.lang.String(baseencoder.encodeBase64(java.lang.String(username + ":" + password).getBytes()))); 
urlConnect.setRequestProperty("content-type","application/x-www-form-urlencoded"); 

is = new java.io.DataInputStream(urlConnect.getInputStream()); 
fstream = new FileWriter("C:\\tmp\\test.tgz"); 
out = new BufferedWriter(fstream); 
while((data = is.read()) != -1){ 
    out.write(data); 
} 

out.close(); 
is.close(); 

Il file risultante non è più un archivio gzip valido. Mi dispiace se ho fatto un errore enorme ma non sono un programmatore e non conosco troppo Java.

risposta

33

Non utilizzare un FileWriter - che sta cercando di convertire i dati in testo.

Basta usare FileOutputStream.

byte[] buffer = new byte[8 * 1024]; 

InputStream input = urlConnect.getInputStream(); 
try { 
    OutputStream output = new FileOutputStream(filename); 
    try { 
    int bytesRead; 
    while ((bytesRead = input.read(buffer)) != -1) { 
     output.write(buffer, 0, bytesRead); 
    } 
    } finally { 
    output.close(); 
    } 
} finally { 
    input.close(); 
} 
+1

Inoltre, ti consigliamo di utilizzare la condizione di test corretta nel tuo ciclo while: while ((data = ** is **. Read())! = Null) {...}. –

+0

Funziona grazie a un lavoro FileOutputStream (utilizzo ancora solo una semplice read() perché sembra che non sia possibile utilizzare un buffer di byte in javascript perché non è un oggetto – radius

2

DataInputStream è significato per la lettura primitive Java, non per i dati generici.

È anche ridondante, poiché urlConnect.getInputStream(); restituisce già un InputStream e tutti gli InputStreams supportano read().

is = urlConnect.getInputStream(); 

P.S. Questo presuppone che is e bis siano la stessa variabile. Altrimenti, stai leggendo il flusso sbagliato nel ciclo.

+0

bis era un refuso, l'ho corretto, grazie – radius

+0

Nice Informazioni! È interessante sapere che, nonostante i nomi suggeriscono che DataInputStream non è per dati generici ...! – Gewure

9

So che questa domanda ha già una risposta, ma un approccio più semplice consiste nell'utilizzare il metodo Apache Commons IO IOUtils.copy(), che può copiare completamente un InputStream in un OutputStream.

0

Basta leggere su LimitInputStream come fa esattamente ciò che si sta facendo, bufferizzando il flusso di input per una maggiore efficienza.