Lecture et copie d'un fichier en Java

Branubiba - 21 févr. 2013 à 14:40
 Branubiba - 28 févr. 2013 à 12:30
Bonjour
Je dois faire une application qui a en entré un fichier contenant des Centaines de lignes .
je dois decouper ce dernier en plusieurs fichier de 5 lignes
donc je suis supposé avoir Pleins de nouveau fichiers en sortie..
mon probleme se sutie au Niveau des Boucle qu'il faut utiliser je suis complétement perdu..
Au debut je voulais faire une fonction de comptage qui compte le nombre de ligne du fichier source ce qui pourrais m'aide a savoir quant le programme s'arrete
mais tout est vraiment confus dans ma tete actuellement.!
Help Please..

15 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 févr. 2013 à 14:53
Salut,

Cette fonction te permet de récupérer le contenu de ton fichier dans une arraylist :
/**
 * cette fonction va lire le contenu d'un fichier
 * @param nomFichier : nom du fichier en entree
 * @return resultat : liste des lignes
 */
public static List<String> lireFichier(String nomFichier){
BufferedReader fluxEntree=null;
String ligneLue;
List<String> lignes = new ArrayList<String>();
try{
fluxEntree = new BufferedReader(new FileReader(nomFichier));
ligneLue = fluxEntree.readLine();
while(ligneLue!=null){
lignes.add(ligneLue);
ligneLue = fluxEntree.readLine();
}
}
catch(IOException exc){
exc.printStackTrace();
}
try{
fluxEntree.close();
}
catch(IOException e){
e.printStackTrace();
}
return lignes;
}


Et cette fonction te permet d'écrire une liste dans un fichier :
/**
 * Ce procédure écrit dans le fichier les lignes de la liste
 * @param nomFichier : nom du fichier dans lequel écrire
 * @param lignes : liste des lignes à écrire
 */
public static void ecrireFichier(String nomFichier, List<String> lignes){
Writer fluxSortie=null;
try{
fluxSortie = new PrintWriter(new BufferedWriter(new FileWriter(
nomFichier)));
for(int i=0;i<lignes.size()-1;i++){
fluxSortie.write(lignes.get(i)+"\n");
}
fluxSortie.write(lignes.get(lignes.size()-1));
}
catch(IOException exc){
exc.printStackTrace();
}
try{
fluxSortie.close();
}
catch(IOException e){
e.printStackTrace();
}
}


Une fois que tu as cette ArrayList, il te suffit de récupérer les lignes 5 par 5 :

List<String> lignes = lireFichier(tonFichier);
while(lignes.size()>0){
   List<String> cinqLignes = new ArrayList<String>();
   for(int i=0; i<Math.min(liste.size(), 5); i++){
      cinqLignes.add(lignes.remove(i));
   }
   ecrireFichier(nomFichier, cinqLignes);
}
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 févr. 2013 à 14:54
Je n'ai pas vérifié ce code mais l'idée est là, tu n'as pas grand chose de plus à faire
0
Bonsoir Julien
Merci Julien
tu me sauves la vie j'essaye de voir et apprendre donc ce fut d'une grande aide tout cela
Je continue Avec des hauts et des Bas merci pour ta disponibilité..!
0
desolé de tarder a repliquer.. j'etais malade depuis Jeudi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
24 févr. 2013 à 10:16
Salut,

C'est pas grave, il n'y a pas d'urgence.

Peux tu accepter la réponse si ton problème est réglé ?
0
Bonjour voici mon code final et bizarement il ne copie qu'une seule ligne du fichier source..
Et sur ton dernier code je n'ai pas compris la commande Remove..
for(int i=0; i<Math.min(lignes.size(), 5); i++){/** J'ai remplacé listes par lignes
cinqLignes.add(lignes.remove(i)); /** remove est sensé supprimer non..?
Mon code n'est pas supposé supprimer des lignes du premier fichier juste les copier sur plusieurs fichier contenant chaque une 5 ligne..
Merci pour ton Aide Julien


package InjectionFichier;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

public class TriFichier {

/**
* @param args
*/

public static List<String> lireFichier(String nomFichier){
BufferedReader fluxEntree=null;
String ligneLue;
List<String> lignes = new ArrayList<String>();
try{
fluxEntree = new BufferedReader(new FileReader(nomFichier));
ligneLue = fluxEntree.readLine();
while(ligneLue!=null){
lignes.add(ligneLue);
ligneLue = fluxEntree.readLine();
}
}
catch(IOException exc){
exc.printStackTrace();
}
try{
fluxEntree.close();
}
catch(IOException e){
e.printStackTrace();
}
return lignes;
}
public static void ecrireFichier(String nomFichier, List<String> lignes){
Writer fluxSortie=null;
try{
fluxSortie = new PrintWriter(new BufferedWriter(new FileWriter(nomFichier)));
for(int i=0;i<lignes.size()-1;i++){
fluxSortie.write(lignes.get(i)+"\n");
}
fluxSortie.write(lignes.get(lignes.size()-1));
}
catch(IOException exc){
exc.printStackTrace();
}
try{
fluxSortie.close();
}
catch(IOException e){
e.printStackTrace();
}
}

public static void main(String[] args) {
String fichiersource ="C:/JavaHome/workspace/GestionDesDTS/FichierEntré/fichierDentree.txt";
String fichierSortie =("C:/JavaHome/workspace/GestionDesDTS/FichierSortie/Fichier.txt");
// TODO Auto-generated method stub
List<String> lignes = lireFichier(fichiersource);
while(lignes.size()>0){
List<String> cinqLignes = new ArrayList<String>();


for(int i=0; i<Math.min(lignes.size(), 5); i++){
cinqLignes.add(lignes.remove(i));
}

ecrireFichier(fichierSortie, cinqLignes);
}

}

}
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
24 févr. 2013 à 11:36
Désolé, j'ai fais une erreur grossière :

for(int i=0; i<Math.min(lignes.size(), 5); i++){ 
cinqLignes.add(lignes.remove(0));// C'est 0 et pas i 
} 
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
24 févr. 2013 à 11:37
La fonction remove sur une liste supprime l'élément passé en argument et retourne l'élément supprimé :
remove(0) retourne donc l'élément d'indice 0 de la liste et le supprime de celle ci.
0
il ne copie que la derniere ligne du fichier.. et ne cree qu'un seul fichier..
Dis moi S'il te plait comme faire pour qu'il cree un nouveau fichier apres avoir ecrit les 5 premieres ligne sur le fichier Precedent
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
24 févr. 2013 à 13:36
Il faut que le nom de ton fichier soit différent à chaque fois :
public static void main(String[] args) { 
String fichiersource ="C:/JavaHome/workspace/GestionDesDTS/FichierEntré/fichierDentree.txt"; 
 
List<String> lignes = lireFichier(fichiersource);
int i=1; 
while(lignes.size()>0){ 
List<String> cinqLignes = new ArrayList<String>(); 


for(int i=0; i<Math.min(lignes.size(), 5); i++){ 
cinqLignes.add(lignes.remove(i)); 
} 
String fichierSortie =("C:/JavaHome/workspace/GestionDesDTS/FichierSortie/Fichier_"+i+".txt"); 
ecrireFichier(fichierSortie, cinqLignes); 
i++;
} 

} 
0
ça me crée toujour un seul fichier et renvoi une seule ligne.. Bizarre.

Bon je vais me decider a leur dire que je suis nul en Programmation et que meme les plus petits programme je n'arrive pas a les faire tournée..

Merci Ange Julien.
0
Je vous demande d'excuser ma bêtise..
J'ai oublier de changer le chemin du répertoire du coups il les cree dans un autre dossier..
Le Hic est qu'il commence par la fin du fichier source et ne pars pas a la ligne aprés l'ecriture de la ligne.? Pourtant y'a un (\n ) à la fin de chaque "fluxSortie.write(lignes.get(i)+"\n");"
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
24 févr. 2013 à 16:23
Avec quel logiciel ouvre tu le fichier texte généré ? notepad ? si c'est le cas, c'est peut être juste un problème d'affichage avec ton éditeur de fichiers.

Essayes de l'ouvrir avec wordpad ou notepad++ pour voir.

Je pense que le "\n" a bien été ajouté mais que ton éditeur attend un autre délimiteur de ligne : ^M
0
c'eest vrai que j'ouvrais plus tot avec BlocNote..
Mais avec notepad il donne ça ligne par ligne.. je vais t'envoyer en privée certaines chose que je ne peux pas ecrire ici..
Merci
0
Bonjour Julien..
Merci Pour ta grande aide et disponibilité..
J'ai réussi a faire une grande partie de ce que je voulais faire.. Mon Code Marche Pour créer les Nouvelles page voici le code..


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

public class TriFichier2 {


/**
* @param args
*/
/** fonction trouverFichier
*
* @param directoryPath
*/
public void trouverFichier(String directoryPath) {
File directory = new File(directoryPath);
File moreRecentFile = null;
if (!directory.exists()) {
System.out.println("Le fichier/répertoire '" + directoryPath + "' n'existe pas");
} else if (!directory.isDirectory()) {
System.out.println("Le chemin '" + directoryPath + "' correspond à un fichier et non à un répertoire");
} else {
File[] subfiles = directory.listFiles();
String message = "Le répertoire '" + directoryPath + "' contient " + subfiles.length + " fichier"
+ (subfiles.length > 1 ? "s" : "");
System.out.println(message);
for (int i = 0; i < subfiles.length; i++) {
File subfile = subfiles[i];
System.out.println(subfile.getName());
if (moreRecentFile != null && subfile.lastModified()>moreRecentFile.lastModified()) {
moreRecentFile = subfile;
} else {
moreRecentFile = subfile;
}
}
System.out.println("Le fichier le plus récent du répertoire "+directoryPath +" est "+moreRecentFile.getName());
}
}

/**fonction de
*
* @param nomFichier
* @return
*/

@SuppressWarnings("resource")
public static List<String> lireFichier(String nomFichier){
BufferedReader fluxEntree=null;
String ligneLue;
List<String> lignes = new ArrayList<String>();
try{
fluxEntree = new BufferedReader(new FileReader(nomFichier));

LineNumberReader lineNumber = new LineNumberReader(new FileReader(nomFichier));
ligneLue = lineNumber.readLine();
while(ligneLue!=null){
//if(ligneLue.equals(""))break;
lignes.add(ligneLue);
System.out.println("ligne : "+ligneLue+" -- "+lineNumber.getLineNumber());
ligneLue = lineNumber.readLine();
}
}
catch(IOException exc){
exc.printStackTrace();
}
try{

fluxEntree.close();
}
catch(IOException e){
e.printStackTrace();
}
System.out.println("taille : "+lignes.size());
return lignes;
}

/** Ecriture sur les fichiers de sorties
*
* @param nomFichier
* @param lignes
*/
public static void ecrireFichier(String nomFichier, List<String> lignes){
Writer fluxSortie=null;
System.out.println("fichier : "+nomFichier);
try{
fluxSortie = new PrintWriter(new BufferedWriter(new FileWriter(nomFichier)));
for(int i=0;i<lignes.size()-1;i++){
fluxSortie.write(lignes.get(i)+"\n");
System.out.println("ligne : "+lignes.get(i));


}
fluxSortie.write(lignes.get(lignes.size()-1));

}
catch(IOException exc){
exc.printStackTrace();
}
try{
fluxSortie.close();
}
catch(IOException e){
e.printStackTrace();
}
System.out.println("#####################");
}

public static int Generer(String fichiersource , List<String> lignes, int Nbrl , String ChS){


int i=0;
int Numfichier=0;
int NbrL= Nbrl;
String Ch =ChS;

while (i<lignes.size()){
List<String> cinqLignes = new ArrayList<String>();


System.out.println("before --> indice i : "+i+" -- taille : "+lignes.size());
System.out.println("minimum lignes.size()-(i),NbrL: "+Math.min(lignes.size()-(i), NbrL));
int cpt= Math.min((Math.min(lignes.size()-(i),NbrL)>NbrL?Math.min(lignes.size()-(i),NbrL):lignes.size()-(i)),NbrL);
for( int k=0; k<cpt; k++){
System.out.println("indice i : "+i+" -- Math.min((Math.min(lignes.size()-(i),NbrL)>NbrL?Math.min(lignes.size()-(i),NbrL):NbrL),NbrL) --> "+Math.min((Math.min(lignes.size()-(i),5)>5?Math.min(lignes.size()-(i),5):5),5));
System.out.println("ligne at indice "+i+" --> "+lignes.get(i));
cinqLignes.add(lignes.get(i));
i++;
}
//i = i + Math.min(lignes.size()-(i), 5);
System.out.println("after --> indice i : "+i+" -- taille : "+lignes.size());
Numfichier =(i%NbrL>0?i/NbrL+1:i/NbrL) ;
String fichierSortie =( Ch+"_"+Numfichier+ ".txt");
ecrireFichier(fichierSortie, cinqLignes);

System.out.println("voici le nom du fichier:"+Numfichier+" ");
}
return Numfichier;





}

public static void main(String[] args) {

// TODO Auto-generated method stub
final int NbrL =5;

String cheminSortie = "C:";
String fichiersource ="C:";
List<String> lignes = lireFichier(fichiersource);

Generer(fichiersource ,lignes,NbrL , cheminSortie);


}

}


Bon la je veux qu'a chaque fois qu'il cree un nouveau fichier qu'il l'abrite dans un Dossier Appart..
Je pense que c'est avec la fonction create.Directory().. Mais ou la placé..?
tu t'y connait en recuperation de fichier Image a partir d'un serveur..?
0
Rejoignez-nous