1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
/***
*
* @param file fichier en entrée
* @param outputDir répertoire pour les fichiers en sortie
* @param outputName nom du fichier en sortie avec {0} pour l'emplacement du numéro (exemple : "fichier{0}.txt")
* @param startWord le mot qui commence chaque partie
* @param charset le type d'encodage
* @throws IOException
*/
public static void splitFile(File file, File outputDir, String outputName, String startWord, Charset charset) throws IOException {
// pour gérer le nommage de manière complète et générique
MessageFormat outputNameFormat;
if ( !outputName.contains("{0}") ) {
int index = outputName.lastIndexOf("."); // on cherche l'extension
if ( index<0 ) {
outputNameFormat = new MessageFormat(outputName + "{0}");
outputName = outputName + "{0}";
}
else {
// on intercale le pattern avant l'extension
outputNameFormat = new MessageFormat( outputName.substring(0, index) + "{0}" + outputName.substring(index));
}
}
else {
outputNameFormat = new MessageFormat( outputName );
}
//
StringBuilder buffer = new StringBuilder(); // pour cumuler les lignes lues
int fileIndex = 1; // pour gérer l'index de fichier de sortie
try ( BufferedReader reader = Files.newBufferedReader(file.toPath(), charset) ) { // le try avec les parenthèses = try-with-resource : close() sera automatiquement appelé à la fin du bloc
// pour la création du reader, une syntaxe introduite en Java 8 équivalent à BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF8"))
for(String line = reader.readLine(); line!=null; line = reader.readLine() ) {
/* NB si tu veux introduire un mot de fin (STOP), la ligne sera :
for(String line = reader.readLine(); line!=null && !line.contains(stopWord) ; line = reader.readLine() ) {
attention : la ligne contenant STOP ne sera jamais dans aucun fichier en sortie */
if ( line.contains( startWord ) && buffer.length()!=0 ) {
// on écrit le fichier courant, s'il n'est pas vide
writeFile(outputDir, outputNameFormat, fileIndex, charset, buffer);
buffer.setLength(0); // on remet à zéro le buffer
fileIndex++;
}
// dans tous les cas on ajoute la ligne au buffer
if( buffer.length()!=0 ) {
// retour à ligne entre chaque ligne sauf la première
buffer.append('\n');
}
buffer.append(line); // on ajoute la ligne lue dans le buffer
}
// à la fin, il faut écrire ce qu'il y a dans le buffer
if ( buffer.length()!=0 ) {
// on écrit le fichier courant, s'il n'est pas vide
writeFile(outputDir, outputNameFormat, fileIndex, charset, buffer);
}
}
}
private static void writeFile( File outputDir, MessageFormat outputNameFormat, int fileIndex, Charset charset, StringBuilder buffer) throws IOException {
try ( BufferedWriter writer =
Files.newBufferedWriter( new File(outputDir, outputNameFormat.format(fileIndex)).toPath(), charset ) ) {
writer.write(buffer.toString());
}
} |
Partager