web-dev-qa-db-fra.com

Comment lire un fichier en Java avec un encodage de caractères spécifique?

J'essaie de lire un fichier en tant que UTF-8 ou Windows-1252 en fonction de la sortie de cette méthode:

public Charset getCorrectCharsetToApply() {
    // Returns a Charset for either UTF-8 or Windows-1252.
}

Jusqu'à présent, j'ai:

String fileName = getFileNameToReadFromUserInput();
InputStream is = new ByteArrayInputStream(fileName.getBytes());
InputStreamReader isr = new InputStreamReader(is, getCorrectCharsetToApply());
BufferedReader buffReader = new BufferedReader(isr);

Le problème que je rencontre est de convertir l'instance BufferedReader en FileReader.

En outre:

  • Le nom du fichier lui-même (fileName) ne peut pas être approuvé pour être un Charset particulier; parfois le nom de fichier contiendra des caractères UTF-8, et parfois Windows-1252. Il en va de même pour le contenu du fichier (cependant, si le nom et le contenu du fichier toujours auront des jeux de caractères correspondants).
  • Seule la logique à l'intérieur de getCorrectCharsetToApply() peut sélectionner le jeu de caractères à appliquer, donc essayer de lire un fichier par son nom avant pour appeler cette méthode pourrait très bien aboutir avec, Java essayant de lire le nom du fichier avec le mauvais encodage ... ce qui le fait mourir!

Merci d'avance!

22
IAmYourFaja

Donc, en premier lieu, sachez que fileName.getBytes() tel que vous l'avez obtient les octets du nom de fichier, pas le fichier lui-même.

Deuxièmement, lire à l'intérieur des documents de FileReader :

Les constructeurs de cette classe supposent que l'encodage de caractères par défaut et la taille de tampon d'octets par défaut sont appropriés. Pour spécifier vous-même ces valeurs, construisez un InputStreamReader sur un FileInputStream.

Ainsi, des sons comme FileReader ne sont en fait pas la voie à suivre. Si nous suivons les conseils dans la documentation, vous devez simplement modifier votre code pour avoir:

String fileName = getFileNameToReadFromUserInput();
FileInputStream is = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(is, getCorrectCharsetToApply());
BufferedReader buffReader = new BufferedReader(isr);

et ne pas essayer de faire du tout un FileReader.

31
Dennis Meng

Avec Java 7+, vous pouvez créer le Reader en une seule ligne:

BufferedReader buffReader = Files.newBufferedReader(Paths.get(fileName), getCorrectCharsetToApply());

5
dlauzon

Notez que si vous utilisez Google Guava , vous pouvez utiliser Files.newReader :

final BufferedReader reader =
        Files.newReader(new File(filename), getCorrectCharsetToApply());
4
shadowmatter