Supposons que je viens d'utiliser un BufferedInputStream
pour lire les octets d'un fichier texte encodé UTF-8 dans un tableau d'octets. Je sais que je peux utiliser la routine suivante pour convertir les octets en chaîne, mais y a-t-il un moyen plus efficace / plus intelligent de faire cela que de simplement parcourir les octets et de convertir chacun?
public String openFileToString(byte[] _bytes)
{
String file_string = "";
for(int i = 0; i < _bytes.length; i++)
{
file_string += (char)_bytes[i];
}
return file_string;
}
String fileString = new String(_bytes,"UTF-8");
?byte[]
en mémoire et de le convertir vianew String(_bytes,"UTF-8")
(ou même par morceaux avec+=
sur la chaîne) est le plus efficace. Le chaînage des flux d'entrée et des lecteurs peut fonctionner mieux, en particulier sur les fichiers volumineux.Réponses:
Regardez le constructeur de String
Et si vous vous sentez paresseux, vous pouvez utiliser la bibliothèque d' E / S Apache Commons pour convertir directement le InputStream en une chaîne:
la source
java.nio.charset.Charset.availableCharsets()
carte tous les jeux de caractères et pas seulement les jeux de caractères dans leStandardCharsets
. Et si vous voulez utiliser un autre jeu de caractères et que vous voulez toujours empêcher le constructeur de String de lancer,UnsupportedEncodingException
vous pouvez utiliserjava.nio.charset.Charset.forName()
La classe Java String possède un constructeur intégré pour convertir le tableau d'octets en chaîne.
la source
Pour convertir des données utf-8, vous ne pouvez pas supposer une correspondance 1-1 entre octets et caractères. Essaye ça:
(Bah. Je vois que je suis en train de ralentir en appuyant sur le bouton Publier votre réponse.)
Pour lire un fichier entier en tant que chaîne, faites quelque chose comme ceci:
la source
Vous pouvez utiliser le
String(byte[] bytes)
constructeur pour cela. Voir ce lien pour plus de détails. EDIT Vous devez également prendre en compte le jeu de caractères par défaut de votre plateforme conformément au document java:la source
Charset
argument pour vous assurer que la conversion est correcte.Vous pouvez utiliser les méthodes décrites dans cette question (surtout depuis que vous commencez avec un InputStream): lire / convertir un InputStream en une chaîne
En particulier, si vous ne voulez pas compter sur des bibliothèques externes, vous pouvez essayer cette réponse , qui lit le
InputStream
via unInputStreamReader
dans unchar[]
tampon et l'ajoute dans unStringBuilder
.la source
Sachant que vous avez affaire à un tableau d'octets UTF-8, vous voudrez certainement utiliser le constructeur String qui accepte un nom de jeu de caractères . Sinon, vous risquez de vous exposer à certaines vulnérabilités de sécurité basées sur le codage de charset. Notez qu'il lance
UnsupportedEncodingException
ce que vous devrez gérer. Quelque chose comme ça:la source
Voici une fonction simplifiée qui lira en octets et créera une chaîne. Il suppose que vous savez probablement déjà dans quel encodage le fichier se trouve (et sinon par défaut).
la source
La chaîne a un constructeur qui prend l'octet [] et le nom de jeu de caractères comme paramètres :)
la source
Cela implique également l'itération, mais c'est beaucoup mieux que la concaténation de chaînes car elles sont très très coûteuses.
la source
String str = new String(byte[])
fera très bien.Pourquoi ne pas obtenir ce que vous recherchez dès le départ et lire une chaîne du fichier au lieu d'un tableau d'octets? Quelque chose comme:
puis lisez en ligne jusqu'à ce que ce soit fait.
la source
J'utilise de cette façon
String strIn = new String(_bytes, 0, numBytes);
la source