moteur de recherche de fichier en java

  • Auteur de la discussion nomack
  • Date de début

nomack

Nouveau membre
Bonjour,
je souhaiterais réaliser en java un petit moteur de recherche d'images jpg.

En fait, celui-ci devrait être capable de chercher une image jpg dans tout un disque dur à partir de son nom et ensuite de la copier dans un répertoire dont le chemin est donné par l'utilisateur.

Cependant, je ne vois pas du tout comment faire ca, j'ai une petite partie de code pour la recherche qui n'a pas l'air de bien fonctionner. La voici :

public boolean chercheRef(String ref, File rep)
{
if(rep.isDirectory())
{
destCourante.setText(rep.getPath());

File[] liste = rep.listFiles();

for(int i = 0; i < liste.length; i++)
{
chercheRef(ref, liste);
}
}
else
{
String nom = ""+rep;

if(nom.equals(ref))
{
fichierTrouve = rep;
return(true);
}
}
return(false);
}

fichierTrouve est une variable membre de type File
destCourante est une variable membre de type JLabel

Donc voilà si quelqu'un peu à partir de ca me dire ce qui peut être suceptible de clocher ca serait cool.

L'erreur que j'ai est un java.lang.NullPointerException

Et voici l'erreur en entière (histoire de faire joli) :

java.lang.NullPointerException
at RechercheImage.chercheRef(RechercheImage.java:221)
at RechercheImage.chercheRef(RechercheImage.java:223)
at RechercheImage$BoutonsListener.actionPerformed(RechercheImage.java:272)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

et n'étant pas une bête en java j'avou que je suis un peu dépassé je commence à avoir mal au crâne en fait.

merci pour les réponses que vous pourrez m'apporter.
 

zeb

Modérateur
Histoire de faire joli, utilise la balise
Code:
 ! ;) Dès que ce sera lisible, tout PPC va se précipiter pour corriger ton bout de code :)
 

fledren

Nouveau membre
Tu peux peut-être t'inspirer de çà (recherche des répertoires "database" contenus dans un répertoire donné)

/**
* findDatabases - Finds list of databases (absolute paths) contained in specified file.
* @param path
* @param depth
* @return
* @throws VSTException
*/
private List findDatabases(String path, int depth) throws VSTException {
List paths = new ArrayList();
File file = null;
int depth_MAX = 5;
depth = (depth < depth_MAX ? depth : depth_MAX);
File[] files = (new File(path)).listFiles(new FileFilter() {
public boolean accept(File arg0) {
return (
(arg0.getName().equals("database")) && arg0.isDirectory());
}
});
File[] otherFiles = (new File(path)).listFiles(new FileFilter() {
public boolean accept(File arg0) {
return (
!(arg0.getName().equals("database")) && arg0.isDirectory());
}
});
for (int i = 0; i < files.length; i++) {
file = files;
paths.add(file.getAbsolutePath());
}
for (int i = 0; i < otherFiles.length; i++) {
file = otherFiles;
paths.addAll(findDatabases(file.getAbsolutePath(), depth - 1));
}
return paths;
}
 

djabpas

Nouveau membre
Java:
TUTORIELS 


Java : afficher un fichier texte
Page 1 | 2

Seconde partie de notre série "coup de pouce" pour les débutants Java, ici en abordant les flux E/S.  (25 février 2004)
 
Voici la nouvelle classe Contenu complète avec les changements/nouveautés en gras; nous les expliquons ensuite :
class Contenu extends JPanel
  {
  private FenetreSimple maFenetre = null;
  String monFichier = "texte.txt";
  String fichierContenu= "";
  JTextArea champTexte = new JTextArea();

  public Contenu(FenetreSimple maFenetre)
    {
    setLayout(new BorderLayout());

    JButton boutonFermer = new JButton("Charger fichier");
    add(boutonFermer, BorderLayout.SOUTH);

    champTexte.setLineWrap(true);
    champTexte.setWrapStyleWord(true);
    add(champTexte);

    this.maFenetre = maFenetre;
    MyListener monEcouteur = new MyListener();
    boutonFermer.addActionListener(monEcouteur);
    }

  public void LireFichier()
    {
    try 
      {
      RandomAccessFile raf = new RandomAccessFile(monFichier, "r");
      String ligne;
      while ( (ligne = raf.readLine()) != null )
        {
        fichierContenu += ligne;
        }
      champTexte.setText(fichierContenu);
      }
   catch (IOException e) 
     {
     System.out.println("erreur dans: " + e);
     }
    }

  class MyListener implements ActionListener 
    {
    public void actionPerformed(ActionEvent event)
      {
      LireFichier();
      }
    }
  }

Expliquons ces lignes dans l'ordre...

String monFichier = "texte.txt";
String fichierContenu= "";
JTextArea champTexte = new JTextArea();

1) nous définissons la variable monFichier, contenant le nom du fichier à charger ;
2) puis la variable fichierContenu, qui recevra le contenu du fichier lorsque nous le chargerons ;
3) nous définissons enfin champTexte, un objet de type JTextArea. C'est ici que s'affichera notre fichier. Il est défini avant le constructeur afin que nous puissions y avoir accès depuis le constructeur tout comme les autres fonctions de la classe.

JButton boutonFermer = new JButton("Charger fichier");

Nous changeons simplement l'étiquette du bouton, qui auparavant s'appelait "Fermer".

 

champTexte.setLineWrap(true);
champTexte.setWrapStyleWord(true);
add(champTexte);

Nous sommes ici dans le constructeur de Contenu. Avant d'afficher champTexte à l'aide de add(), nous appelons ses méthodes setLineWrap() et setWrapStyleWord() avec "true" afin que le texte revienne à la ligne s'il était plus long que la largeur de la fenêtre.

public void LireFichier()
  {
  try 
    {
    RandomAccessFile raf = new RandomAccessFile(monFichier, "r");
    String ligne;
    while ( (ligne = raf.readLine()) != null )
      {
      fichierContenu += ligne;
      }
    champTexte.setText(fichierContenu);
    }
 catch (IOException e) 
   {
   System.out.println("erreur dans: " + e);
   }
  }

La fonction LireFichier() est le coeur de notre application, comme son nom l'indique.
Nous avons choisi d'accéder à notre fichier au moyen de la classe RandomAccessFile(). Celle-ci permet d'extraire (et stocker) des données dans un fichier à accès aléatoire. "Accès aléatoire" signifie que la classe dispose de méthode permettant de déplacer la "tête de lecture" au sein du fichier, ce dont nous n'avons pas besoin ici... Ce qui nous intéresse, c'est que cette classe nous permet d'accéder à un fichier de manière directe, à la différence des autres classes où l'accès est "séquentiel" : les données doivent être traitées avant de pouvoir être exploitée. Notons que cette différence tient au fait que RandomAccessFile() n'est pas un flux à proprement parler, et est donc bien à part des autres classes. Nous l'utilisons ici tout simplement parce qu'elle plus rapide à mettre en oeuvre dans notre cas, mais son utilisation n'est pas universelle...


 Discutez en sur les forums
La chaîne ligne sera utilisée par la structure while() : on y stockera les lignes de texte tirées de notre objet raf à l'aide de la méthode readLine(), et ce tant que nous ne tirons pas une ligne vide, puis nous remplissons la chaîne fichierContenu (définie au début de notre code) grâce à l'opérateur +=, qui nous permet d'ajouter une chaîne à la suite du contenu déjà présent dans la variable.
Ceci fait, nous passer le contenu de fichierContenu à notre champ champTexte, via sa méthode setText().

L'ensemble de ce code est placé au sein d'un gestionnaire d'exceptions, pour s'assurer que tout se déroule comme on le souhaite.

Reste à lier cette fonction LireFichier() à notre bouton : c'est fait grâce à l'écouteur que nous avons attaché à ce dernier :

class MyListener implements ActionListener 
  {
  public void actionPerformed(ActionEvent event)
    {
    LireFichier();
    }
  }

Ainsi paré, notre programme est prêt à être lancé. Il ne reste qu'à créer un fichier texte simple, au même niveau que le programme, appelé "texte.txt".

Page 1 | 2
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 848
Membres
1 586 373
Dernier membre
https://forum.tomshardwar
Partager cette page
Haut