Lecture de fichiers binaires à partir D'URLConnection

j'essaie de lire un fichier binaire à partir d'une connexion URL. Quand je le teste avec un fichier texte il semble fonctionner très bien, mais pour les fichiers binaires il ne fonctionne pas. J'utilise le type mime suivant sur le serveur lorsque le fichier est envoyé:

application/octet-stream
<!-Mais jusqu'à présent, rien ne semble fonctionner. C'est le code que j'utilise pour recevoir le fichier:

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();
20
demandé sur Luke 2010-07-11 09:33:51

2 réponses

C'est la façon dont je le fais,

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();
34
répondu ZZ Coder 2017-03-09 07:51:26

Si vous essayez de lire un flux binaire, vous ne devriez PAS envelopper le InputStream dans un Reader de n'importe quelle sorte. Lire les données dans une mémoire tampon de type byte en utilisant le InputStream.read(byte[], int, int) méthode. Ensuite, écrivez à partir du tampon vers un FileOutputStream.

la façon dont vous lisez/écrivez actuellement le fichier le convertira en "caractères" et de nouveau en octets en utilisant le codage de caractères par défaut de votre plate-forme. Ceci est susceptible de modifier les données binaires.

(il y a un jeu de caractères (LATIN-1) qui fournit 1-à-1 sans perte de mappage entre les bytes et un sous-ensemble de l' char valeur de l'espace. Cependant, c'est une mauvaise idée, même lorsque la cartographie des œuvres. Vous allez traduire / copier les données binaires de byte[]char[] et de nouveau de retour ... qui ne réalise rien dans ce contexte.)

14
répondu Stephen C 2014-04-10 01:38:48