Lecture de fichiers binaires à partir de URLConnection
Je suis en train de lire un fichier binaire à partir d'un URLConnection. Quand je l'ai tester avec un fichier texte qu'il semble fonctionner très bien, mais pour les fichiers binaires, il n'est pas. Je suis à l'aide de la suite de mime-type sur le serveur lorsque le fichier est envoyer:
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();
Vous devez vous connecter pour publier un commentaire.
C'est de cette façon que je le fais,
n > 0
test est inutile. Selon la documentation javadoc, le seul cas où la valeur zéro peut être retourné, c'est quandbuffer.length
est égale à zéro.Si vous essayez de lire un flux binaire, vous ne devriez PAS envelopper la
InputStream
dans unReader
de toute nature. Lire les données dans un tableau d'octets de la mémoire tampon à l'aide de laInputStream.read(byte[], int, int)
méthode. Alors écrire à partir de la mémoire tampon pour unFileOutputStream
.La façon dont vous êtes en train de lire/écrire le fichier sera converti en "caractères" et de retour d'octets à l'aide de votre plate-forme de codage de caractères par défaut. Ce qui est susceptible de coder les données binaires.
(Il y a un jeu de caractères (LATIN-1) qui fournit un 1-de-1 sans perte de mappage entre les bytes et un sous-ensemble de la
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 à partir debyte[]
àchar[]
et de retour ... qui ne réalise rien dans ce contexte.)InputStreamReader
transformera octet de données à caractère UTF-16 données (dans ce cas, l'utilisation de la plateforme par défaut l'encodage, ce qui est une mauvaise idée, même pour text/plain). Java char n'est pas un octet comme il l'est dans d'autres langues.