java mp3 inputstream de tableau d'octets?
avant de vous dire "Google", j'ai essayé, trouvé quelques articles intéressants, mais rien n'a fonctionné.
J'ai besoin de convertir un fichier mp3 à partir d'un site web à un flux d'octets, que je puisse ensuite l'enregistrer dans un fichier local.
Voici mon code (le plus important):
Url url = new Url("someUrl");
URLConnection conn = url.openConnection();
byte[] result = inputStreamToByteArray(conn.getInputStream());
//.... some code here
byteArrayToFile(result, "tmp.mp3");
public byte[] inputStreamToByteArray(InputStream inStream){
InputStreamReader in = new InputStreamReader(inStream):
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int next = inStream.read();
while (next > -1){
baos.write(next);
next = in.read();
}
byte[] result = baos.toByteArray();
baos.flush();
in.close();
return result;
}
public void byteArrayToFile(byte[] byteArray, String outFilePath){
FileOutputStream fos = new FileOutputStream(outFilePath);
fos.write(byteArray);
fos.close()
}
Le code compile sans erreurs.
Connexion à l'url est valide. Il envoie le droit de réponse.
Le problème est quelque part dans la conversion.
J'ai également le nouveau fichier sur le disque, après byteArrayToFile () appropriée de la longueur, mais je ne peux pas jouer dans n'importe quel lecteur. Il est dit de longueur 00:00 et ne seront pas jouer.
Btw. Je voudrais éviter un 3ème partie libs. Mais si rien ne fonctionne...
OriginalL'auteur ZolaKt | 2010-11-25
Vous devez vous connecter pour publier un commentaire.
(Le code que vous avez présenté ne serait pas compiler sans erreurs, par la manière. Vous n'avez pas requis la gestion des exceptions, et
inputStream
devrait êtreInputStream
, juste pour des démarreurs.)C'est le problème:
Vous essayez de lire à partir d'un flux binaire, et de le convertir en texte. Il n'est pas texte. Vous ne devriez pas utiliser quoi que ce soit à voir avec le "Lecteur" ou "Écrivain" pour des données binaires comme un fichier MP3.
Voici ce que votre
inputStreamToByteArray
méthode devrait ressembler (ou utiliser Goyave et sesByteStreams.toByteArray
méthode):Note que j'ai laissé pour la appelant pour nettoyer le flux d'entrée. Généralement celui qui récupère le flux ferme - il serait un peu étrange pour une méthode de ce genre pour la fermer lui-même, de l'OMI. Vous pouvez le faire si vous voulez, mais probablement dans un
finally
bloc de sorte que vous savez ce qu'il toujours être fermé, même si une exception a été levée.Noter que votre "écriture" code un peu plus tard de ne pas fermer le fichier si il y a une exception, soit. Vous devriez prendre l'habitude de toujours de clôture du cours d'eau dans
finally
blocs.Vous avez eu dynamiquement, un tampon de taille: la ByteArrayOutputStream. Le 8K de mémoire tampon est juste là que de très espace de stockage temporaire. Pourquoi voudriez-vous que à la dynamique de taille moyenne?
Je ne sais pas. Je n'aime pas tout codées "en dur" les chiffres 🙂 Mais vous avez raison, c'est le chemin à parcourir. Je vous remercie beaucoup.
N'hésitez pas à faire une constante, quelque part, ou même le mettre comme paramètre. Je soupçonne 8K est parfait pour presque toutes les fins...
Skeet: Une chose de plus...comment dois-je faire référence le flux dans le bloc finally. Dans mon exemple je l'obtenir à partir de l'objet de connexion. Dans votre approche, je dois créer une nouvelle instance de la rivière d'abord, à droite?
OriginalL'auteur Jon Skeet