0/5 (6 avis)
Vue 19 019 fois - Téléchargée 1 649 fois
import java.awt.* ; import java.awt.event.* ; import java.io.* ; import java.util.Vector ; import java.awt.datatransfer.* ; public class index implements ActionListener, WindowListener, ItemListener, Runnable { Frame F = new Frame("Index") ; Toolkit tk = F.getToolkit() ; Button B1 = new Button() ; Button B2 = new Button() ; Button B3 = new Button("Portée de la recherche") ; TextField tf = new TextField() ; List list = new List() ; Label L = new Label() ; PrintStream PS ; //écriture des fichiers indexation File fichierIndex ; //fichier d'indexation static File dossierIndex = new File("index") ; //Dossier où son ranger les fichiers d'indexation String rech ; //mot à rechercher Vector V = new Vector(8,5) ; int nombreDossier ; //compte rendu recherche int nombreFichier ; StringBuffer SB = new StringBuffer() ; String[] listvol ; //liste des volumes String[] listindex = null; //liste des index String extension = ".log" ; //extension pour les index int mode = -1 ; //mode en cour (voir methode setMode) Checkbox checkMaj = new Checkbox("Ignorer les majuscules",true) ; Checkbox checkIgnoreSpace = new Checkbox("Ignorer les espaces") ; Checkbox checkIgnoreAccent = new Checkbox("Ignorer les accents") ; boolean ignoreMaj ; boolean ignoreSpace ; boolean ignoreAccent ; Font FPetite = new Font("Sans",Font.PLAIN,10) ; Font FGrosse = new Font("Sans",Font.PLAIN,12) ; boolean tourne ; boolean exit ; int erreur = 0 ; static { dossierIndex.mkdir() ; } public static void main(String[] argv) { /*boolean graph = false ; if ((argv.length > 0) && (argv[0].equalsIgnoreCase("ui"))) { graph = true ; } new index(graph) ;*/ new index() ; } //public index (boolean graph) { public index () { //if (graph) { F.addWindowListener(this) ; F.setLocation(300,100) ; Panel P = new Panel() ; P.setSize(440,420) ; P.setLayout(null) ; B1.addActionListener(this) ; B1.setBounds(20,20,140,20) ; B2.addActionListener(this) ; B2.setBounds(170,100,100,20) ; B3.addActionListener(this) ; B3.setBounds(280,100,140,20) ; B3.setActionCommand("portée") ; tf.addActionListener(this) ; tf.setBounds(20,100,140,20) ; list.addActionListener(this) ; list.addItemListener(this) ; list.setBounds(20, 140, 400, 260) ; checkIgnoreAccent.setBounds(280,10,150,20) ; checkIgnoreSpace.setBounds(280,40,150,20) ; checkMaj.setBounds(280,70,150,20) ; L.setBounds(20, 120, 400, 20) ; P.add(list) ; P.add(L) ; P.add(B1) ; P.add(B2) ; P.add(tf) ; P.add(B3) ; P.add(checkMaj) ; P.add(checkIgnoreSpace) ; P.add(checkIgnoreAccent) ; F.add(P) ; setMode(0) ; //initialisation des composants graphiques F.pack() ; F.setResizable(false) ; F.show() ; /*} else { execIndex() ; rech = "salut" ; recherche() ; Fermer() ; }*/ } public void runThread() { Thread THR = new Thread(this) ; tourne = true ; THR.start () ; } public void run() { if (mode == 4) { //execution du Thread d'indexation try { FileOutputStream FOS = new FileOutputStream(fichierIndex) ; //ouvre le flux de l'index à créer PS = new PrintStream(FOS) ; for (int i = 0 ;(tourne) && (i < listvol.length) ; i++) { L.setText("Indexation de " + listvol[i]) ; File dir = new File(listvol[i]) ; PS.println(dir.getAbsolutePath()) ; indexdossier(dir,1) ; } PS.close() ; //ferme le flux if (! tourne) fichierIndex.delete() ; } catch (Exception e) { /*erreur = 1*/ ; e.printStackTrace() ; } //********************************************* setMode(0) ; if (erreur != 0) L.setText(erreur + " erreur lors de l'indexation") ; tk.beep() ; } else if (mode == 1) { //recherche BufferedReader BR = null ; for ( int i = 0 ;(tourne) && (i < listindex.length) ; i++) { fichierIndex = new File(dossierIndex,listindex[i]) ; try { BR = new BufferedReader(new FileReader(fichierIndex)); //ouverture flux de lecture V.removeAllElements() ; String line ; //contient une ligne while (tourne && ((line = BR.readLine() ) != null)) Analyse(line) ; //Analyse la ligne BR.close() ; //femeture du flux } catch (Exception e) { System.out.println(fichierIndex) ; e.printStackTrace() ; } } traitResultat() ; //stastistique setMode(6) ; } if (exit) Fermer() ; tourne = false ; } public void recherche() { if ((listindex == null) && (mode != 5)) sourceRecherche() ; else execRecherche() ; } public void sourceRecherche() { list.removeAll() ; setMode(5) ; fichierExtension() ; } public void execRecherche() { if (mode == 5) listindex = list.getSelectedItems() ; if (listindex.length == 0) { L.setText("Aucun index selectionné pour effectuer la recherche") ; return ; } setMode(1) ; traiteOptions() ; nombreDossier = nombreFichier = 0 ; //compteur à 0 runThread() ; //lance la boucle de recherche dans un thread séparé //la fin du thread place le mode à 0 } char[] charRech ; char[] charLine ; public boolean compare(String str) { if (ignoreMaj) str = str.toUpperCase() ; charLine = str.toCharArray() ; if (ignoreSpace) charLine = ignoreSpace(charLine) ; if (ignoreAccent) charLine = ignoreAccent(charLine) ; int i = 0 ; int y = 0 ; int espoir = -1 ; int c1 = charRech.length ; int c2 = charLine.length ; boolean esp = false ; while(true) { if (i == c1) return(true) ; if (y == c2) return(false) ; if (charLine[y] == charRech[i]){ if (i == 0) { espoir = y ; esp = true ; } i++ ; y++ ; } else { if (esp) { y = espoir + 1 ; i = 0 ; esp = false ; } else y++ ; } } } public void traiteOptions() { rech = tf.getText() ; ignoreMaj = checkMaj.getState() ; ignoreSpace = checkIgnoreSpace.getState() ; ignoreAccent = checkIgnoreAccent.getState() ; if (ignoreMaj) rech = rech.toUpperCase() ; charRech = rech.toCharArray() ; // transforme rech en tableau de caractères if (ignoreSpace) charRech = ignoreSpace(charRech) ; if (ignoreAccent) charRech = ignoreAccent(charRech) ; } public char[] ignoreSpace(char[] ch) { int length = ch.length ; int y = 0 ; for (int i = 0; i < length ; i++ ) { if (! Character.isWhitespace(ch[i])) ch[y++] = ch[i] ; } if (length == y) return(ch) ; char[] retour = new char[y] ; System.arraycopy(ch,0,retour,0,y) ; return(retour) ; } public char[] ignoreAccent(char[] ch) { char c ; int length = ch.length ; for (int i = 0; i < length ; i++ ) { c = ch[i] ; if (c < 128) { SB.append(c) ; continue ; } switch (c) { //********************************** case 'é' : case 'è' : case 'ê' : case 'ë' : SB.append('e') ; break ; case 'à' : SB.append('a') ; break ; case 'ç' : SB.append('c') ; break ; case '?' : SB.append('o').append('e') ; break ; default : SB.append(c) ; } } length = SB.length() ; char[] retour = new char[length] ; SB.getChars(0,length,retour,0) ; SB.setLength(0) ; return(retour) ; } public void Analyse(String line) { //Analyse une ligne int i = 0 ; while (line.charAt(i) == '\t') { i++ ; } line = line.substring(i) ; //enleve les tabulations de la ligne boolean isDossier = line.endsWith("\\") ; //si dossier if (isDossier) { //met la ligne dans le vector au niveau du dossier if (V.size() == i ) V.addElement(line) ; else V.setElementAt(line, i) ; } if (compare(line)) { for (int y = 0 ; y < i ; y++ ) { SB.append(V.elementAt(y)) ; //concaténe les éléments du path } if (isDossier) nombreDossier++ ; //met à jour le compte rendu de recherche else nombreFichier++ ; SB.append(line) ; //concaténe le nom du fichier au path list.addItem(SB.toString() ) ; //add à la list la chaine créée SB.setLength(0) ; //vide la chaine } } public void traitResultat() { //Créer des statistiques if (! tourne) { L.setText("Recherche annulée") ; return ; } int nombreTotal = nombreDossier + nombreFichier ; //créer le total if (nombreTotal == 0) { //pas de résultat L.setText("Aucun resultat") ; } else { L.setText("Total : " + nombreTotal + " (" + nombreFichier + " Fichier(s), " + nombreDossier + " Dossier(s) )") ; } } public void ouvrirPath(String path) { File F = new File(path) ; if (! F.exists()) { L.setText("L'élément est introuvable") ; return ; } L.setText("Ouverture...") ; path = '\"' + path + '\"' ; // guillemets, sinon start.exe echoue s'il y a un espace int pf = -1 ; String strOs = System.getProperty("os.name", "???") ; if ( strOs.equals("Mac OS") ) pf = 2 ; // Macintosh else if ( strOs.equals("Windows NT") ) pf = 1 ; // Windows NT, 2000 et XP else if ( strOs.equals("Windows 95") ) pf = 0 ; // Windows 95, 98 et Me boolean succes = false ; switch (pf) { case 0 : succes = startWin(path) ; break ; case 1 : succes = startNT(path) ; break ; default : L.setText("Ouverture sur la plate forme " + strOs + " non programmée") ; } if (! succes) L.setText("Echec de l'ouverture") ; else L.setText("") ; } public boolean startWin (String path) { // "start" lance l'exe lie a l'extension DOS (selon la base de registres) try { Runtime.getRuntime( ).exec (new String [] { "start ", path } ) ; } // lance la commande catch (IOException floc) { return (false) ; } // erreur : pas d'application, erreur commande = false return (true) ; } // -------------------- fin de methode start public boolean startNT (String path) { // "start" lance l'exe lie a l'extension DOS (selon la base de registres) try { Runtime.getRuntime( ).exec (new String [] { "cmd", "/c", "start", "\"\"", path } ) ; } catch (IOException floc) { return (false) ; } // erreur : pas d'application, erreur commande = false return (true) ; } // -------------------- fin de methode start public void actionPerformed(ActionEvent ae) { //Object source = ae.getSource() ; String command = ae.getActionCommand() ; if (command.equals("stop")) tourne = false ; else if (tourne) return ; else if (command.equals("getvol")) sourceIndex() ; //bouton 1 en mode 0(défault) else if (command.equals("saveas")) cibleIndex() ; //bouton 2 en mode 2(choix des volumes à indexer) else if (command.equals("lanceindexation")) execIndex() ; //bouton 2 en mode 3(choix fichier d'index) else if (command.equals("recherche")) recherche() ; //bouton 2 en mode 0,2,5(défault) else if (command.equals("portée")) { //bouton 3 switch (mode) { case 0 : case 5 : case 6 : sourceRecherche() ; } } else if (command.equals("index0")) setMode(0) ; else {Object source =ae.getSource() ; if (source == tf) { switch (mode) { case 0 : case 5 : case 6 : recherche() ; } } else if (source == list) { switch (mode) { case 6 : ouvrirPath(command) ; } } } } public void itemStateChanged(ItemEvent ie) { if (mode == 3) { //en mode de selection d'un fichier pour enregistrer l'index if (list.getSelectedIndex() == 0) tf.setText("index" + extension) ; else tf.setText(list.getSelectedItem()) ; //place le texte de l'item dans le text field } } public void setMode(int md) { if (md == mode) return ; //si mode inchanger : return ; switch (md) { case 0 : //Réinitialisation list.removeAll() ; tf.setText("") ; B1.setLabel("Indexer l'ordinateur") ; B1.setActionCommand("getvol") ; B2.setLabel("Rechercher") ; B2.setActionCommand("recherche") ; L.setText("") ; break ; case 1 : //Recherche en cours L.setText("Recherche en cours...") ; list.removeAll() ; B1.setLabel("Annuler") ; B1.setActionCommand("stop") ; list.setFont(FPetite) ; list.setMultipleMode(false) ; break ; case 2 : //Obtention des volumes L.setText("Selectionner les volumes à indexer et cliquer \"J'ai fini\" ") ; B1.setLabel("Annuler") ; B1.setActionCommand("index0") ; B2.setLabel("J'ai fini") ; B2.setActionCommand("saveas") ; list.setMultipleMode(true) ; list.removeAll() ; list.setFont(FGrosse) ; break ; case 3 : //demande d'emplacement et du nom de fichier pour l'enregistrement de l'index B2.setLabel("Enregistrer") ; B2.setActionCommand("lanceindexation") ; L.setText("Taper un nouveau nom ou cliquez sur un fichier existant") ; list.removeAll() ; list.setMultipleMode(false) ; break ; case 4 : //pendant l'indextation B1.setActionCommand("stop") ; B2.setLabel("Rechercher") ; B2.setActionCommand("rien") ; break ; case 5 : //porté de la recherche list.setMultipleMode(true) ; list.setFont(FGrosse) ; break ; case 6 : //fin de la recherche list.setMultipleMode(false) ; B1.setLabel("Indexer l'ordinateur") ; B1.setActionCommand("getvol") ; } mode = md ; } public void sourceIndex () { // obtenir la list des volumes dans la list setMode(2) ; listvol = getVolumes() ; for (int i = 0 ; i < listvol.length ; i++) { list.addItem(listvol[i]) ; //met dans la list tous les volumes } } public void cibleIndex() { //met dans la list les fichiers d'index déja créer listvol = list.getSelectedItems() ; //enregistrer les volumes selectionner pour l'indextation setMode(3) ; list.addItem("Fichier par défault(index" + extension + ")") ; //item fichier par défault fichierExtension() ; } public void fichierExtension() { String[] listfichier = dossierIndex.list() ; //demande la list du dossier des index for (int i = 0 ; i < listfichier.length ; i++) { if (listfichier[i].endsWith(extension)) { list.addItem(listfichier[i]) ; //propose les fichiers terminé par l'extension des index } } } public void execIndex () { //lance l'indextation avec les paramètre régler précédament String name = tf.getText() ; //nom pour enregistrer le fichier if (! name.endsWith(extension)) name += extension ; //rajoute l'extension si il n'y a pas fichierIndex = new File(dossierIndex, name) ; //créer le file du fichier index à créer setMode(4) ; runThread() ; //lance la boucle d'indextation dans un thread séparé //la fin du thread place le mode à 0 } public String [] getVolumes () { // renvoie les noms des volumes montes char [] vol = new char [26] ; int count = 0 ; String sep = ":\\" ; for (char c = 'B' ; c < '[' ; c ++) { // essaie toutes les lettres de volumes if ( (new File (c + sep)).exists() ) vol [count ++] = c ; } String [] ret = new String [count] ; for (int pif = 1 ; pif < count ; pif ++) ret [pif] = vol [pif] + sep ; ret [0] = "A" + sep ; return (ret) ; } public void indexdossier (File dir, int j) { //index le dossier et les dossiers contenu en se rappelant try { String[] list = dir.list() ; int len = list.length ; for (int i = 0 ;(tourne) && (i < len) ; i++) { File F = new File(dir,list[i]) ; boolean b = F.isDirectory() ; traiteDonnées(F,j,b) ; if (b) { indexdossier(F,j+1) ; } } } catch (Exception e) { if (e.getMessage() == null) erreur = 2 ; else erreur++ ; } } public void traiteDonnées(File F, int j, boolean b) { //écrit les donner récolter dans le fichier for (; j >0 ; j--) { //écrit le nbr de tabu en raport avec l'implementation PS.print('\t') ; } PS.print(F.getName()) ; if (b) PS.println('\\') ; else PS.println() ; } public void Fermer() { //créer si un jour y'a besoin de faire un truc avant de quitter if (tourne) { exit = true ; tourne = false ; } System.exit(0) ; } public void windowClosing (WindowEvent e) { Fermer () ; } public void windowClosed (WindowEvent e) { } public void windowActivated (WindowEvent e) { } public void windowDeactivated (WindowEvent e) { } public void windowIconified (WindowEvent e) { } public void windowDeiconified (WindowEvent e) { } public void windowOpened (WindowEvent e) { } }
9 juil. 2012 à 18:31
j' ai essai d’exécuter ton programme mais j'ai pas réussit.
voici l'erreur : impossible de trouver la classe principale ou n’existe pas.
merci de m'aider.
18 août 2006 à 15:41
amateur_java > utilise un JOptionpane atu met ton contenu dedans comme ca tu n'aura que la croix de fermeture
et accessoirement il y a un forum pour poser des questions et si tu as des problèmes pour ecrire dessus mentionne le par mail en disant precisement les problèmes de connexion que tu as!
le matheu> "donc préfère le java 1.1.8 plus rapide" c'est faux la version 2 à eu un gros coup de boost concernant le JIT encore plus avec les versions 5 et 6 de java.
pour info la jvm 1.5 d'ibm fait merveilleusement bien tourner une appli swing sur un PPC G3 266Mhz 128M de ram
18 août 2006 à 15:13
oui c'est ca Frame.setRezisable(false) ;
merci ca fesait un bout de temp que je cherchait un peu partou comment faire;
Sait tu alors comment disabler ou enlever aussi l'autre icone qui reduit la fenetre de mon programme vers le bureau....Ca aussi je ne sais pas faire.
Merci d'avence ;-)
18 août 2006 à 15:01
Frame.setRezisable(false) ;
Préçision : je programme en 1.1.8 et non en java 2.
On me m'a pas appris le java 2 car celui qui m'a lancer n'a que des vieux ordi (moi aussi)et donc préfère le java 1.1.8 plus rapide. J'utilise seulement les awt car les swing n'éxiste pas en java 1.
Merçi à Twinuts pour cette grande aide.
Je vait essayer de passer en Unicode.
L'ouverture d'un fichier est programmmer que pour win 95, NT et bientot Mac mais il est vrai que le JFileChooser serait bien pratique. Existe t-il un équivalent en java 1 ? Je vait chercher (c'est pas FileChooser en tout cas).
la Méthode listRoots() de la class File n'éxiste pas en java 1 (très dommage).
Je vait essayer de respecter les normes pour les noms mais j'ai beaucoup de mal...
Peut-être je ferait 2 version (une pour le java 1 (pour un copain) et une pour le java 2) mais il faudrait encors que le serveur me réponde quand je veux télécharger je J2SE 1.5...
Bon je vait modifié tous ça...
18 août 2006 à 09:58
Bon je n'ai pas encore lu tout le code mais deja à ce que j'en vois c'est un peut le bazar :P
quelques petites precisition concerant les regles de nomage java :
une classe commence par une majuscule et chaque mot qui la compose aussi exemple : MaClassAMoi.
une methode commence par une minuscule et chaque nouveau mot par une majuscule exemple : setUnTruc(....)
une variable à le meme comportement qu'une methode soit : maVariable
une constante(final) est en majuscule et chaque nouveau mot separé d'un '_' exemple : final int MA_CONSTANTE = 1
Concerant le code de ce que j'en vois je le trouve super lourd, tu ferais mieux d'utiliser les composants swing plutot qu'awt, de plus l'utilisation des layout t'eviterais d'avoir un positionnement barbare à coup de setBounds, enfin tu devrais séparer dans une autre classe les actions afin d'épurer ton code et de le rendre plus lisible.
maintenant concernant les accents tu les cherche en brute de forme exemple : 'é' hors je ne le dirais jamais assez cette methode n'est absolumement pas portable au niveau du code exemple si tu est en UTF-8 et que tu met s ton code java sur un system en ISO ba la ton 'é' devient '?' ou je ne sais quel autre merdouille, la solution la plus simple serait de cheque le caractere sous sa forme unicode soit :
switch (c) {
case '\u00e9' :
case '\u00e8' :
case '\u00ea' :
case '\u00eb' : SB.append('e') ; break ;
case '\u00e0' : SB.append('a') ; break ;
case '\u00e7' : SB.append('c') ; break ;
}
voici le lien d'un applet java qui propose une liste des caractères et leurs équivalent :
http://mindprod.com/applets/unicode.html
Quand tu fais :
public void ouvrirPath(String path); je suppose que c'est pour ouvrir l'explorateur crosoft, c'est bien, c'est beau mais tu pourrais faire autrement avec un JFileChooser(swing offre plus de composants qu'awt) qui peut aussi te permettre de selectionner des repertoire , et ainsi t'eviter de brider ton application à windows
concernant getVolume oublie cette methode et utilise File.listRoots qui te renvoit un tableau de file des different devices root (A:, C:, D: ou encore / pour linux), de plus portable:
for(File f : File.listRoots())//syntax 1.5
System.out.println(f);
sinon qd meme mise à part c'est petites choses pour un début c'est pas trop mal
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.