La dépendance sur le codage par défaut, que dois-je utiliser et pourquoi?
FindBugs rapports d'un bug:
La dépendance sur l'encodage par défaut
Trouvé un appel à une méthode qui permettra de réaliser un octet String (ou une Chaîne d'octets) conversion, et supposons que la valeur par défaut de la plateforme d'encodage est adapté. Ce sera la cause de la demande, le comportement de varier entre les plates-formes. Utiliser un autre type d'API et de spécifier un jeu de caractères nom ou le jeu de caractères de l'objet explicitement.
J'ai utilisé FileReader comme ça (juste un morceau de code):
public ArrayList<String> getValuesFromFile(File file){
String line;
StringTokenizer token;
ArrayList<String> list = null;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
list = new ArrayList<String>();
while ((line = br.readLine())!=null){
token = new StringTokenizer(line);
token.nextToken();
list.add(token.nextToken());
...
Pour corriger le bug, j'ai besoin de changer
br = new BufferedReader(new FileReader(file));
à
br = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.defaultCharset()));
Et quand j'utilise PrintWriter la même erreur s'est produite. Alors maintenant, j'ai une question. Quand je peux (doit) utiliser FileReader et PrintWriter, si ce n'est pas une bonne pratique de s'appuyer sur l'encodage par défaut?
Et la deuxième question est de savoir utiliser correctement le jeu de caractères.defaultCharset ()? J'ai décidé d'utiliser cette méthode pour la définition de jeu de caractères de l'utilisateur du système d'exploitation.
Vous devez vous connecter pour publier un commentaire.
Si le fichier est sous le contrôle de votre application, et si vous voulez que le fichier encodé dans la plate-forme d'encodage par défaut, vous pouvez utiliser la valeur par défaut de la plateforme d'encodage. Le précisant explicitement le rend plus clair, pour vous et futurs responsables, que c'est votre intention. Ce serait raisonnable par défaut pour un éditeur de texte, par exemple, qui serait alors écrire les fichiers de n'importe quel autre éditeur sur cette plate-forme serait alors en mesure de lire.
Si, d'autre part, vous voulez vous assurer que tout personnage peut être écrite dans votre fichier, vous devez utiliser un encodage universel comme UTF8.
Et si le fichier provient d'une application externe, ou est censé être compatible avec une application externe, vous devez utiliser l'encodage que cette application externe attend.
Ce que vous devez comprendre, c'est que si vous écrivez un fichier comme vous le faites sur une machine, et de lire que vous êtes en train de faire sur une autre machine, qui n'a pas le même encodage par défaut, vous n'aurez pas nécessairement être en mesure de lire ce que vous avez écrit. À l'aide d'un codage spécifique, à lire et à écrire, comme de l'utf-8 permet de s'assurer que le fichier sera toujours le même, quelle que soit la plateforme utilisée lors de l'écriture du fichier.
Idéalement, elle devrait être:
...ou:
...en supposant que le fichier est encodé en UTF-8.
À peu près chaque encodage qui n'est pas une Unicode Transformation Format est obsolète pour le langage naturel de données. Il y a des langues que vous ne peut pas soutenir sans Unicode.
Vous devez utiliser le codage par défaut chaque fois que vous lisez un fichier qui est en dehors de votre application et peut être supposé être dans le local de l'utilisateur de l'encodage, par exemple l'utilisateur écrit des fichiers texte. Vous pouvez utiliser le codage par défaut lors de l'écriture de ces fichiers, en fonction de ce que l'utilisateur va faire avec ce fichier plus tard.
Vous devriez pas utiliser le codage par défaut pour n'importe quel autre fichier, en particulier de l'application fichiers pertinents.
Si vous demande par exemple écrit les fichiers de configuration au format texte, vous devez toujours spécifier l'encodage. En général, UTF-8 est toujours un bon choix, car il est compatible avec presque tout. Ne pas le faire pourrait causer la surprise se bloque par les utilisateurs dans d'autres pays.
Ce n'est pas seulement limité à l'encodage des caractères, mais aussi de la date/de l'heure, numérique ou autre langue, des formats spécifiques. Si vous, par exemple, utiliser le codage par défaut et par défaut de la date/heure de cordes sur une machine, puis essayez de lire le fichier sur un serveur allemand, vous pourriez être surpris de voir pourquoi la moitié est du charabia et l'autre moitié a mois/jours confus ou désactivé par une heure en raison de l'heure d'été.
Lorsque vous utilisez un PrintWriter,