Changer l'encodage de vos fichiers textes avec java.io, java.nio et java.nio.charsets

Vous en avez assez de ne pas voir correctement les caractères spéciaux ou accentués de vos fichiers ASCII DOS sous votre éditeur favori ? Vous souhaitez convertir vos fichiers Unicode en ASCII DOS ? Cette classe vous permettra de convertir l’encodage de vos fichiers textes, sous réserve que l’encodage que vous spécifiez soit reconnu. Il est question de canaux de fichier (java.nio.channels.FileChannel), de mapping en buffer (java.nio.MappedByteBuffer) et de gestion des encodages (java.nio.charsets.*).

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException;

/**
* Permet le changement d’encodage de fichiers textes
*
* @author Frédéric Chuong
* @version 0.1
*/
public class Converter {

/**
* Transfert le contenu texte d’un fichier dans un autre fichier en assurant
* la conversion de l’encodage du texte
*
* @param in
* Fichier d’origine. Ne sera pas modifié sauf si passé en 2ème
* paramètre également
* @param out
* Fichier à créer
* @param encodingIn
* Encodage du fichier d’origine (tel que ISO-8859-15, UTF-8 ou
* UTF-16)
* @param encodingOut
* Encodage du fichier de destination
* @throws FileNotFoundException Quand le fichier d’origine n’existe pas
* @throws IllegalCharsetNameException Quand un des encodages est invalide ou introuvable
* @throws UnsupportedCharsetException Quand un des encodages n’est pas supporté
* @throws IOException Erreur d’entrées/sorties
*/
public static void convert(File in, File out, String encodingIn,
String encodingOut) throws FileNotFoundException,
IllegalCharsetNameException, UnsupportedCharsetException,
IOException {
CharsetDecoder decoder = Charset.forName(encodingIn).newDecoder();
CharsetEncoder encoder = Charset.forName(encodingOut).newEncoder();
FileInputStream fis = new FileInputStream(in);
FileChannel channelIn = fis.getChannel();
MappedByteBuffer buffer = channelIn.map(FileChannel.MapMode.READ_ONLY,
0, channelIn.size()); // Mappe tout le fichier dans buffer
channelIn.close();
fis.close();
FileOutputStream fos = new FileOutputStream(out);
FileChannel channelOut = fos.getChannel();
channelOut.write(encoder.encode(decoder.decode(buffer)));
channelOut.close();
fos.close();
}

public static void main(String[] args) {
File unicode = new File("Unicode.txt"); // Fichier d’origine
File dos = new File("DOS.txt"); // Fichier à créer
File iso = new File("ISO-8859-15.txt"); // Fichier à créer
try {
// Conversion en page de codes DOS européen
Converter.convert(unicode, dos, "UTF-16", "CP850");
// Conversion en ISO d’Europe de l’ouest
Converter.convert(unicode, iso, "UTF-16", "ISO-8859-15");
} catch (Exception e) {
e.printStackTrace();
}
}
}

Laboratoire SUPINFO des technologies Sun
labo-sun@supinfo.com


Conditions d'utilisation et © Copyright SUPINFO International University
23, rue de Château Landon - 75010 PARIS - Tél : +33 (0) 153359700 Fax : +33 (0) 153359701
Respect de la vie privée