2010-07-11 10 views
19

Bir URLConnection'dan bir ikili dosyayı okumaya çalışıyorum. Bir metin dosyası ile test ettiğimde, iyi çalışıyor gibi görünüyor, ancak ikili dosyalar için değil. Dosya gönderildiğinde aşağıdaki mime-type'ı kullanıyorum:URLConnection'dan ikili dosya okuma

application/octet-stream 

Fakat şu ana kadar hiçbir şey işe yaramıyor gibi görünüyor. Bu benim dosyayı almak için kullanın koddur: Bir ikili akışı okumak için çalışıyorsanız

file = File.createTempFile("tempfile", ".bin"); 
file.deleteOnExit(); 

URL url = new URL("http://somedomain.com/image.gif"); 

URLConnection connection = url.openConnection(); 

BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

Writer writer = new OutputStreamWriter(new FileOutputStream(file)); 

int c; 

while((c = input.read()) != -1) { 

    writer.write((char)c); 
} 

writer.close(); 

input.close(); 

cevap

34

Bu benim böyle yaparız). Bu bağlamda hiçbir şey elde hangi ... tekrar char[] için byte[] gelen ikili veri kopyalama ve/

input = connection.getInputStream(); 
byte[] buffer = new byte[4096]; 
int n; 

OutputStream output = new FileOutputStream(file); 
while ((n = input.read(buffer)) != -1) 
{ 
    output.write(buffer, 0, n); 
} 
output.close(); 
+7

'n> 0 'testi gereksizdir. Javadoklara göre, sıfırın geri alınabileceği tek durum, buffer.length'in sıfır olduğu zamandır. –

+5

... ve her durumda sıfır uzunluktaki yazma zararsızdır. – EJP

+0

Günümü kurtardın :) –

14

, herhangi türden bir Reader içinde InputStream DOLAMAYIN gerekir. Verileri InputStream.read(byte[], int, int) yöntemini kullanarak bir bayt dizisi arabelleğe okuyun. Daha sonra tampondan bir FileOutputStream'a yazın.

Şu anda dosyayı okuduğunuz/yazdığınız yol, platformunuzun varsayılan karakter kodlamasını kullanarak "karakterler" ve byte'lara geri dönecektir. Bu ikili veriyi yönlendirmekle yükümlüdür.

(Bayt sayısı 1 ile 1 arasında) ve char değer aralığının bir alt kümesi arasında bire bir kayıpsız eşleştirme sağlayan bir karakter kümesi (LATIN-1) vardır.Ama haritalama çalışırken bile bu kötü bir fikirdir. ,

+0

çeviri olmak Ya da InputStream tamamlıyor deneyebilirsiniz BufferedInputStream içine. – bhups

+1

@bhups - bu doğru, ancak sadece çok sayıda küçük okuma yapacaksanız yardımcı olacaktır. Yalnızca büyük blok okumaları yaparsanız, bir BufferedInputStream gerçekte üretkenliği biraz azaltacaktır. –

+1

Bu doğru; "InputStreamReader", bayt verilerini UTF-16 karakter verilerine dönüştürecektir (bu durumda, varsayılan platform kodlamasını kullanarak, metin/düz için bile kötü bir fikirdir). Java char, diğer dillerde olduğu gibi bir oktet değildir. – McDowell