Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    99

    [java] eccezione su ricerca file

    ho fatto una funzione di ricerca file che dato un path(una cartella dove cercare) mi restituisce tutti i file html che trova all interno della cartella.però se creo una cartella nello stesso path dove stanno i file e provo ad eseguire la funzione mi sbuca java.lang.ArrayIndexOutOfBoundsException.da cosa dipende??come lo risolvo?
    questo è il mio codice
    package Cercahtml;

    import java.io.File;
    import java.io.FileWriter;
    import java.io.FilenameFilter;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.InputStreamReader;
    import java.io.BufferedReader ;
    import java.io.IOException;

    public class CercaFiles {

    //contatore usato per numerare i file ottenuti
    public static int count = 0;
    //directory dove cercare
    public static File from;
    //vettore contenente gli absolute path dei file
    public static String [] vetthtml;
    //vettore contenente solo il nome dei file trovati(mi serve per stampare a video solo i nomi e non i path interi)
    public static String [] appoggio;

    //funzione che mi serve per inizializzare la variabile from
    public static void popolapath(){
    String path= "c:/cercahtml/listafilehtml/";
    //directory dove cercare i file con determinate estensioni
    from = new File(path);
    }
    public static void esploraFile(File from) {
    String nome = "";
    String tipo= ".html";

    //utilizziamo per la ricerca un filtro
    File[] files = from.listFiles(new Filter(nome, tipo));
    vetthtml= new String [files.length];
    appoggio= new String [files.length];

    //stampiamo su ogni array i file trovati

    for (int i = 0; i < files.length; i++) {

    if (files[i].isFile()){
    vetthtml[i]= files[i].getAbsolutePath();
    appoggio[i]= files[i].getName();
    count++;
    }

    else
    esploraFile(files[i]);

    }

    }

    }

    class Filter implements FilenameFilter {
    //estensione del file
    private String tipo, nome;

    public Filter(String nome, String tipo) {
    this.nome = nome;
    this.tipo = tipo;
    }

    //accettiamo tutti i file con estensione s e le directory che non siano
    //nascoste
    public boolean accept(File dir, String file) {
    File f = new File(dir, file);

    //controllo sul tipo.
    //Ad esempio se cerco "pippo.txt" la indexOf(.txt) è uguale a 4,file.lenght è uguale a 9 ne sottraggo tipo.lenght e controllo


    boolean flag1=true;
    if(tipo!=null && tipo!="")
    flag1=(file.indexOf(tipo) == file.length()-tipo.length());

    //controllo sul nome
    //flag2 è true se il file contiene la parola cercata

    boolean flag2=true;
    if(nome!=null && nome!="")
    flag2=file.toUpperCase().indexOf(nome.toUpperCase( ))!=-1;
    //ritorno i file che passano il controllo del tipo e del nome le directory

    return ( ( flag1 && flag2 ) || f.isDirectory()) && !f.isHidden();

    }
    }
    f4s4n0

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Quando trovi una cartella, chiami ricorsivamente il metodo e sovrascrivi alcune variabili (essendo statiche), perdendo quindi informazioni sulla cartella superiore.
    Quando il controllo torna al metodo precedente, le variabili sovrascritte sollevano l'eccezione.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    99
    ho risolto grazie.....mi ero dimenticato che nella classe filter beccavo anche le cartelle....mi è bastato aggiungere nella accept della classe Filter un
    if(f.isDirectory())return false;
    e il gioco è fatto.ora funziona alla perfezione.
    grazie cmq
    f4s4n0

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Se t'interessano anche i file delle sottocartelle, puoi aggirare il problema non usando variabili statiche e usando ArrayList al posto di array per non esser costretto ad indicare a priori la dimensione. Una possibile implementazione e'
    codice:
    /*Oggetto da inserire nell'ArrayList, cosi' ne posso fare solo una e' avere comunque 
     * tutte le info che mi interessano.
     */
    public class FileInfo {
        private String name;
        private String path;
        
        public FileInfo(String name, String path){
            this.name = name;
            this.path = path;
        }
        
        public String getName() {
            return this.name;
        }
        
        public String getPath() {
            return this.path;
        }
    }
    codice:
    import java.io.File;
    import java.io.FilenameFilter;
    import java.util.ArrayList;
    
    public class CercaFile {
        
        public static ArrayList<FileInfo> esploraFile(File from) {
            //Creo un ArrayList, meglio di un array perche' non devo sapere le dimensioni a priori
            ArrayList<FileInfo> list = new ArrayList<FileInfo>();
            
            //Creo la lista dei file applicando l'opportuno filtro
            File[] files = from.listFiles(new FilenameFilter() {
                public boolean accept(File dir, String name) {
                    File tmpFile = new File(dir, name);
                    //Se il file non e' nascosto ed ha la giusta estensione o e' una directory, ritorno true
                    return (!tmpFile.isHidden()&&(name.endsWith(".html")||tmpFile.isDirectory()));
                }
            }
            );
    
            //Inserisco un oggetto FileInfo per ogni file che mi rispetta la condizione
            for (int i = 0; i < files.length; i++) {
                if (files[i].isFile()){
                    //Se e' un file, lo inserisco'
                    list.add(new FileInfo(files[i].getName(), files[i].getAbsolutePath()));
                } else {
                    //altrimenti chiamo ricorsivamente il metodo e copio i risultati della sottocartella nella lista
                    ArrayList<FileInfo> tmp = (new CercaFile()).esploraFile(files[i]);
                    for(int j=0; j<tmp.size(); j++)
                        list.add(tmp.get(j));
                }
            }
    
            //Restituisco la lista dei risultati
            return list;
        }
        
        //Piccolo main di prova
        public static void main(String[] args) {
            CercaFile cercaFile= new CercaFile();
            ArrayList<FileInfo> lista = CercaFile.esploraFile(new File("C:/cercahtml/listafilehtml/"));
            for(int i=0; i<lista.size(); i++) {
                System.out.println("File trovati: "+lista.size());
                System.out.println(lista.get(i).getName()+" - "+lista.get(i).getPath());
            }
        }
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    99
    grazie x l aggiunta che nn guasta mai,ma x ora mi serve che veda solo nella cartella
    f4s4n0

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.