Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Riconoscere immagini in una lista di file

    ciao!

    data una directory, devo sostanzialmente elaborare solo gli oggetti che sono effettivamente immagini.
    l'unica cosa che mi è venuta in mente, è quella di testare le estensioni e vedere se rientra in una lista di estensioni accettate (png, jpg, jpeg,....).
    ma nel caso di molti file, non penso sia molto performante.

    avete qualche altre soluzione?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    l'unica cosa che mi è venuta in mente, è quella di testare le estensioni e vedere se rientra in una lista di estensioni accettate (png, jpg, jpeg,....).
    Testare la estensione dei file è quello che si fa normalmente/tipicamente. Non è quello il problema maggiore.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    ma nel caso di molti file, non penso sia molto performante.
    Nel caso di directory con un numero elevatissimo di file, sì, può essere un problema di performance se si usano i metodi di lista di java.io.File. Ma esiste la API NIO che offre altri modi più performanti per scansionare directory. Vedi sul tutorial ufficiale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ciao andbin!

    intanto grazie per la risposta.
    mi sono un pò documentato, ed ho "creato" questo metodo:
    codice:
        public ArrayList<String> getImages2(Path directory, boolean recursive) throws IOException {
            ArrayList<String> listImages = new ArrayList<>();
            Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                    if (file.toFile().getName().toLowerCase().endsWith(".jpg") || file.toFile().getName().toLowerCase().endsWith(".png")) {
                        listImages.add(file.toFile().toString());
                    }
                    return (recursive) ? FileVisitResult.CONTINUE : FileVisitResult.TERMINATE;
                }
            });
            return listImages;
        }
    funzionare funziona, mi daresti un tuo parere?
    nel senso, potrebbe andare o mi è sfuggito qualcosa?
    considera che quello che mi interesserebbe è questo:
    -scansionare una directory, scegliendo se farlo in maniera ricorsiva o meno
    -aggiungere all'ArrayList solo i file che terminano con le estensioni impostate

    poi l'ArrayList lo uso da un'altra parte.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    funzionare funziona, mi daresti un tuo parere?
    nel senso, potrebbe andare o mi è sfuggito qualcosa?
    Sì, qualcosa ti è sfuggito. Innanzitutto il tuo codice compila solo su Java 8 (i controlli sull'uso di variabili locali da parte di anonymous inner class è stato "rilassato"). Su Java 7 non compila perché recursive e listImages non sono final.
    Se il tuo codice deve funzionare solo da Java 8 in poi, ok. Altrimenti devi correggere.

    Questo comunque è il problema minore. Il problema maggiore è la comprensione di cosa succede con walkFileTree. Se recursive è true scansioni in "profondità". Ma se recursive è false prende 1 solo file e basta. Insomma, non scansioni completamente solo la directory in argomento.

    Se vuoi scansionare non in profondità, allora o usi l'altro walkFileTree che ha il maxDepth, oppure usi l'altro metodo di Files che è newDirectoryStream, apposta per iterare su una singola directory.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    allora, per la versione di java non c'è problema perchè mi serve solo per java 8.
    quindi starei a posto.

    per quanto riguarda il secondo punto, in teoria per decidere se scansionare ricorvisamente le directory o meno, non mi basta questo?
    codice:
    return (recursive) ? FileVisitResult.CONTINUE : FileVisitResult.TERMINATE;
    io ho notato che FileVisitResult.TERMINATE la scansione si ferma solo alla directory iniziale.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    in teoria per decidere se scansionare ricorvisamente le directory o meno, non mi basta questo?
    codice:
    return (recursive) ? FileVisitResult.CONTINUE : FileVisitResult.TERMINATE;
    No se visitFile restituisce il TERMINATE, tutto il walkFileTree termina lì subito. Quindi prendi solo 1 file, che tra l'altro potrebbe essere della directory "base" in argomento oppure di una sotto-directory .... dipende.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    ricapitolo un attimo.

    quindi se ho capito bene questa riga non mi serve allo scopo:
    codice:
    return (recursive) ? FileVisitResult.CONTINUE : FileVisitResult.TERMINATE;
    ma dovrei agire prima.
    usare magari l'altro walkFileTree, passando come parametro la profondità a cui voglio arrivare a eseguire la scansione?

    tipo una cosa del genere?
    codice:
        public ArrayList<String> getImages2(Path directory, int depth) throws IOException {
            ArrayList<String> listImages = new ArrayList<>();
            Files.walkFileTree(directory, EnumSet.of(FileVisitOption.FOLLOW_LINKS), depth, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                    if (file.toFile().getName().toLowerCase().endsWith(".jpg") || file.toFile().getName().toLowerCase().endsWith(".png")) {
                        listImages.add(file.toFile().toString());
                    }
                    return FileVisitResult.CONTINUE;
                }
            });
            return listImages;
        }
    Ultima modifica di fermat; 18-05-2015 a 12:23

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    tipo una cosa del genere?
    Sì, una cosa del genere, provala. E devi passare 1 come maxDepth se vuoi le entri della sola directory "base" in argomento.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    ho fatto qualche prova e pare funzionare bene.
    grazie mille per le dritte!!

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.