Files öffnen

Ich bin gerade dabei ein Programm zu schreiben, welches alle Files eines Verzeichnisses öffnen und nach einem String suchen soll, sowie Unterordner öffnen und deren Files. Gebe ich einen Ordner ohne Unterordner an funktioniert es einwandfrei, jedoch nicht wenn der Ornder unter Ordner hat, hierbei erscheint dann immer die Meldung: FileNotFoundError und dann der Link zu dem Ordner, dabei existiert er. Ich habe leider keine Ahnung warum es nicht funktioniert.
Hier der aktuelle Code;
Java:
public class tech {

    public static void main(String[] args) throws FileNotFoundException {
        String verzName = "C:\\Users\\xyz\\Videos";
        Scanner parse = new Scanner(System.in);
        String searchp = parse.next();
        HashMap files = getPaths(new File(verzName),
                new ArrayList<File>(), searchp);
        if(files == null) return;
        System.out.print("Files that contain your parse\n" +files);
    }

    private static HashMap getPaths(File file, ArrayList<File> list, String string) throws FileNotFoundException {
        HashMap dic = new HashMap();
        if (file == null || list == null || !file.isDirectory())
            return null;
        File[] fileArr = file.listFiles();
        for (File f : fileArr) {
            if (f.isDirectory()) {
                getPaths(f, list, string);
            }
            list.add(f);
        }
            for (File e : list) {
                ArrayList<String> lines = new ArrayList<>();
                Scanner scanner = new Scanner(e);
                int counter = 0;
                try {
                while (scanner.hasNextLine()) {
                    counter++;
                    String a = scanner.nextLine();
                    if (a.contains(string)) {
                        String cint = Integer.toString(counter);
                        lines.add(cint);
                        if (!dic.containsKey(e)) {
                            dic.put(e, lines);
                        }
                        else {
                            dic.replace(e, lines);
                        }
                    }
                }
                }
                catch(Exception d) {
                    d.printStackTrace();
                }
            }

Vielen Dank schon mal
 
Hier noch die Fehler Meldung:
Code:
Exception in thread "main" java.io.FileNotFoundException: C:\Users\xyz\Videos\Captures (Zugriff verweigert)
    at java.base/java.io.FileInputStream.open0(Native Method)
    at java.base/java.io.FileInputStream.open(FileInputStream.java:216)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
    at java.base/java.util.Scanner.<init>(Scanner.java:639)
    at java_beginnging.tech.getPaths(tech.java:33)
    at java_beginnging.tech.getPaths(tech.java:27)
    at java_beginnging.tech.getPaths(tech.java:27)
    at java_beginnging.tech.main(tech.java:14)
 

LimDul

Top Contributor
Ursache dürfte das hier sein
Java:
            if (f.isDirectory()) {
                getPaths(f, list, string);
            }
            list.add(f); // <-----
Das muss vermutlich in einen else-Zweig.

Denn fügst damit auch Verzeichnisse in die Liste hinzu. Wenn du die mit einem Scanner aufmachen willst, wird das nicht funktionieren. Das heißt, verzeichnise dürfen nicht in der Liste landen.
 
Ursache dürfte das hier sein
Java:
            if (f.isDirectory()) {
                getPaths(f, list, string);
            }
            list.add(f); // <-----
Das muss vermutlich in einen else-Zweig.

Denn fügst damit auch Verzeichnisse in die Liste hinzu. Wenn du die mit einem Scanner aufmachen willst, wird das nicht funktionieren. Das heißt, verzeichnise dürfen nicht in der Liste landen.
Danke jetzt funktionierts
 

mihe7

Top Contributor
@モストウォンテッド den Code kann man aber schon ein wenig anders strukturieren.

Gehen wir mal von "innen nach außen": Du willst eine Datei durchsuchen und eine Liste von Zeilennummern erhalten.
Java:
    public static List<Integer> search(File file, String search) throws IOException {

Jetzt willst Du aber nicht nur eine Datei sondern eine ganze Liste von Dateien durchsuchen. Als Ergebnis willst Du die Zuordnung zwischen Datei und Zeilennummern, was Du über eine Map machst. Kann man machen. Aus Gründen der Typsicherheit ist Map generisch!

Java:
    public static Map<File, List<Integer>> searchAll(List<File> files, String search) {

Ok, jetzt hast Du schon mal den Vorteil, dass Du zwei Methoden hast, die Du unabhängig voneinander testen und unabhängig vom gesamten Vorhaben verwenden kannst.

Als nächstes brauchen wir noch eine Dateiliste, die erzeugst Du rekursiv:
Java:
    public static void findFiles(List<File> root, List<File> found) {

Zack, der Parameter für den Suchtext ist weg. Da der Aufruf nicht so schön ist, spendieren wir noch eine "convinience method":
Java:
    public static List<File> findFiles(File root) {

Insgesamt:
Java:
class Test {
    public static void main(String[] args) {
        String verzName = args[0]; // "C:\\Users\\xyz\\Videos";

        System.out.println("Ermittle Dateien");
        List<File> files = findFiles(new File(verzName));
        System.out.printf("%d Dateien unter %s gefunden.\n", files.size(), verzName);

        System.out.print("Suchtext: ");       
        Scanner parse = new Scanner(System.in);
        String text = parse.next();
       
        System.out.printf("Suche nach %s\n", text);
        Map<File, List<Integer>> results = searchAll(files, text);
        System.out.printf("%s in %d Dateien gefunden: %s\n",
                text, results.size(), results.toString());
    }
   
    public static List<File> findFiles(File root) {
        List<File> files = new ArrayList<>();
        findFiles(root, files);
        return files;
    }
   
    public static void findFiles(File root, List<File> found) {
        if (root == null || root == null || !root.isDirectory())
            return;
   
        for (File file : root.listFiles()) {
            if (file.isDirectory()) {
                findFiles(file, found);
            } else {
                found.add(file);
            }
        }
    }

    public static Map<File, List<Integer>> searchAll(List<File> files, String search) {
        Map<File, List<Integer>> matches = new HashMap<>();
       
        for (File file : files) {
            try {
                List<Integer> matchingLineNumbers = search(file, search);
                if (!matchingLineNumbers.isEmpty()) {
                    matches.put(file, matchingLineNumbers);
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
       
        return matches;
    }
   
    public static List<Integer> search(File file, String search) throws IOException {
        ArrayList<Integer> matchingLineNumbers = new ArrayList<>();
       
        try(Scanner scanner = new Scanner(file)) {
            int counter = 0;
            while (scanner.hasNextLine()) {
                counter++;
                String line = scanner.nextLine();
                if (line.contains(search)) {
                    matchingLineNumbers.add(counter);
                }
            }
        }
       
        return matchingLineNumbers;
    }
}

Beispiel:
Code:
java -cp . Test META-INF/

Ermittle Dateien
2 Dateien unter META-INF/ gefunden.
Suchtext: app
Suche nach app
app in 2 Dateien gefunden: {META-INF/application.xml=[2, 20], META-INF/glassfish-application.xml=[2, 3]}

Zur früh abgeschickt...

Ja, das ist etwas mehr Code, wobei hier ein paar Zeilen für zusätzliche Ausgabe und einige zusätzliche Leerzeilen abzuziehen wären. Dafür ist der Code auch wesentlich sauberer, wobei man das noch weiter spinnen könnte.
 

deppo

Mitglied
Hi @ ... Das sollte eigentlich funktionieren:

Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class TextFilesSearch {
    public static List<File> search(File dir, String fEnding, String fContent) throws IOException {
        return Files.walk(dir.toPath(), FileVisitOption.FOLLOW_LINKS)
                .map(Path::toFile)
                .filter(f -> f.getName().endsWith(fEnding))
                //.filter(TextFilesSearch::isValidUtfBom)
                .filter(f -> isContains(f, fContent))
                .collect(Collectors.toList());
    }

    public static boolean isValidUtfBom(File f) {
        if (f == null || !f.isFile() || !f.canRead()) {
            return false;
        }
        try (FileInputStream is = new FileInputStream(f)) {
            byte[] raw = new byte[3];
            int i = is.read(raw);
            if (i < 2) {
                return false;
            }
            if (i == 2) {
                return raw[0] == (byte) 0xFE && raw[1] == (byte) 0xFF || raw[0] == (byte) 0xFF && raw[1] == (byte) 0xFE;
            }
            return  raw[0] == (byte) 0xEF && raw[1] == (byte) 0xBB && raw[2] == (byte) 0xBF ||
                    raw[0] == (byte) 0xFE && raw[1] == (byte) 0xFF ||
                    raw[0] == (byte) 0xFF && raw[1] == (byte) 0xFE;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    public static boolean isContains(File f, String fContent) {
        try (Scanner scan = new Scanner(f)) {
            while (scan.hasNextLine()) {
                String line = scan.nextLine();
                if (line.contains(fContent)) {
                    return true;
                }
            }
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    public static void main(String[] args) throws IOException {
        System.out.println(search(new File("dir"), "txt", "teeext"));
    }
}

Die Zeile 16 kannst du, je nach dem in welcher Gestalt deine Textdateien sind, ein- oder aus kommentieren... Pass aber mit sehr großen Textdateien auf, diese könnten die Anwendung verlangsamen.

Das funktioniert bei mir ganz gut. Leider gibt es den Command "file -i" in Windows nicht. :(
 

mihe7

Top Contributor
@deppo, der Code tut nicht, was er tun soll: Zeilennummern ausgeben. Außerdem liefert walk auch Directories zurück. Und wenn schon nio (EDIT: was natürlich zu bevorzugen wäre), dann doch konsequent:
Java:
    public static boolean isContains(Path path, String fContent) {
        return Files.lines(path).anyMatch(line -> line.contains(fContent));
    }
 

KonradN

Top Contributor
Woher soll ich denn wissen, was der soll, wenn das nicht vernünftig angegeben ist...
Also Du sagst, dass Du nicht verstehst, was der TE in seinem Code genau machen möchte ... Aber Du hast eine neue Lösung für ihn?

Und das, wo der Code vom TE selbst schon fast ok war, das eigentliche Problem direkt in #3 gefunden und die Lösung in #4 bestätigt wurde?
Dein Vorschlag war jedenfalls total daneben.
Also @mihe7 hat sich auf jeden Fall mit dem Code beschäftigt, versucht zu verstehen, was der TE möchte um dann konstruktive Verbesserungsvorschläge zu bringen.

Ja woraufhin ja auch gefiltert wird.
Öhm ... nein? Zumindest auf den ersten Blick ist das nicht der Fall. Du hast
  • ein Filter auf die Endung - aber das kann auch bei einem Verzeichnis der Fall sein.
  • Eine Prüfung bei dem UTF BOM - das ist aber von dir auskommentiert ...

Aber soll mir auch egal sein ... ich bin wieder raus....
 

deppo

Mitglied
Er hat halt nicht gesagt, welches Format seine plain text files haben, welche Dateiendungen, wonach er genau sucht und wie die Rückgabe sein soll.

5, setzen, hätte man früher in der Schule dazu gesagt.
 

deppo

Mitglied
Hier nochmal für mich "ordentlich":

Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;

public class TextFilesSearch {
    public static Map<File, List<Integer>> search(File dir, String fEnding, String fContent) throws IOException {
        return Files.walk(dir.toPath(), FileVisitOption.FOLLOW_LINKS)
                .map(Path::toFile)
                .filter(f -> isValidFile(f, fEnding))
                //.filter(TextFilesSearch::isValidUtfBom)
                .reduce(new HashMap<File, List<Integer>>(), (map, f) -> {
                    List<Integer> lines = getLines(f, fContent);
                    if (!lines.isEmpty()) {
                        map.put(f, getLines(f, fContent));
                    }
                    return map;
                }, (m1, m2) -> {
                    m1.putAll(m2);
                    return m1;
                });
    }

    public static boolean isValidFile(File f, String fEnding) {
        return f != null && f.isFile() && f.canRead() && f.getName().endsWith(fEnding);
    }

    public static boolean isValidUtfBom(File f) {
        try (FileInputStream is = new FileInputStream(f)) {
            byte[] raw = new byte[3];
            int i = is.read(raw);
            if (i < 2) {
                return false;
            }
            if (i == 2) {
                return raw[0] == (byte) 0xFE && raw[1] == (byte) 0xFF || raw[0] == (byte) 0xFF && raw[1] == (byte) 0xFE;
            }
            return  raw[0] == (byte) 0xEF && raw[1] == (byte) 0xBB && raw[2] == (byte) 0xBF ||
                    raw[0] == (byte) 0xFE && raw[1] == (byte) 0xFF ||
                    raw[0] == (byte) 0xFF && raw[1] == (byte) 0xFE;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    public static List<Integer> getLines(File f, String fContent) {
        List<Integer> lines = new ArrayList<>();
        try (Scanner scan = new Scanner(f)) {
            int i = 0;
            while (scan.hasNextLine()) {
                String line = scan.nextLine();
                i++;
                if (line.contains(fContent)) {
                    lines.add(i);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return lines;
    }

    public static void main(String[] args) throws IOException {
        System.out.println(search(new File("Desktop"), "txt", "eingezahlt"));
    }
}

Ihr dürft natürlich Kritik äußern.
 

KonradN

Top Contributor
Er hat halt nicht gesagt, welches Format seine plain text files haben, welche Dateiendungen, wonach er genau sucht und wie die Rückgabe sein soll.

5, setzen, hätte man früher in der Schule dazu gesagt.
Wozu sollte er auch noch diese zusätzlichen Details liefern? Er hat einen bestimmten Code und ein ganz konkretes Problem. Das hat er so gut beschrieben, dass ihm direkt eine Lösung angeboten werden konnte und diese Lösung wurde von TE auch direkt bestätigt. Daher sehe ich hier erst einmal keinerlei Grund, da irgend etwas schlecht zu bewerten. Und ein "5, setzen" kann ich da auch in keiner Weise erkennen.

Wie Du da auf diese komische Wertung oder Sichtweise kommst, entzieht sich mir gerade komplett. Ich finde es ja toll, dass Du so Problemstellungen für Dich als Anreiz siehst, da Deinen eigenen Code zu schreiben. Aber evtl. willst Du Dir überlegen, dafür dann eigene Threads zu erstellen? Denn das Thema war mit #4 eigentlich erledigt. #5 war noch ein Verbesserungsvorschlag an den TE um den TE noch mit etwas mehr Rückmeldung generell weiter zu helfen. Aber ab da sehe ich keine wirkliche Relevanz zu der Fragestellung / des Problems des TE, so dass eben ein eigener Thread bezüglich Rückmeldungen sinnvoll wäre.

Ihr dürft natürlich Kritik äußern.
Ich denke, da verzichte ich lieber ... Deine Umgangsformen hier zeugen nicht wirklich von Sachlichkeit. Daher werde ich mich hüten, weitere Aussagen zu Deinem Code zu machen. Aber es gibt paar Auffälligkeiten bei denen man auch ohne große Diskussion einfache Hinweise auf Kapitel in Joshua Blochs "Effective Java" Buch geben könnte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Files Java Basics - Anfänger-Themen 7
B jar files libraries Java Basics - Anfänger-Themen 2
A Files aufteilen Java Basics - Anfänger-Themen 4
A Java, verarbeitung eines xml-files Java Basics - Anfänger-Themen 2
Rakshan Running jar files, resulting in failure Java Basics - Anfänger-Themen 11
C Wo speichere ich die Jar-Files zu JGoodies FormLayout? Java Basics - Anfänger-Themen 4
F Input/Output Files von A nach B kopieren Java Basics - Anfänger-Themen 11
B Name von Verzeichnis bekommen - Files von einem Ordner auslesen Java Basics - Anfänger-Themen 4
J Kann man files in einer Klasse speichern. Java Basics - Anfänger-Themen 2
L Files verschieben in einen Ordner Java Basics - Anfänger-Themen 87
N Best Practice files[i].getAbsoluteFile() mit Sondezeichen im Vezeichnisnamen Java Basics - Anfänger-Themen 2
F ActionListener mit Files etc Java Basics - Anfänger-Themen 12
H Pfad Program Files\Common Files\Oracle\Java\javapath Java Basics - Anfänger-Themen 3
X Variablen Problem bei Aufteilung in verschiedene Class-Files Java Basics - Anfänger-Themen 4
T Input/Output Einlesen eines .txt Files nur bei gesetztem Breakpoint möglich Java Basics - Anfänger-Themen 1
M DBF-Files und Encoding Java Basics - Anfänger-Themen 4
X Finde die Files über FTP nicht Java Basics - Anfänger-Themen 4
U Properties außerhalb des war-Files Java Basics - Anfänger-Themen 1
N Lesen eines files mit FILES.lines Java Basics - Anfänger-Themen 11
D CSV Files richtig zusammenführen Java Basics - Anfänger-Themen 3
U Java logging generiert unerwünschten files Java Basics - Anfänger-Themen 1
C Klassen Class Files nachladen (mehrer .jar Dateien) Java Basics - Anfänger-Themen 2
S Ordnerstrukturen durchsuchen und Files bearbeiten Java Basics - Anfänger-Themen 6
G Existenz eines Files Java Basics - Anfänger-Themen 1
N Files außerhalb eines des jar-files einlesen mac Java Basics - Anfänger-Themen 10
O Files eines Directories innerhalb eines JAR-Files auflisten Java Basics - Anfänger-Themen 0
S Input/Output .txt-Files NEBEN .jar Java Basics - Anfänger-Themen 3
B Relativer Pfad zwischen zwei Files Java Basics - Anfänger-Themen 2
F Speicherlast mehrere GB durch kleine png files? Java Basics - Anfänger-Themen 1
C xsd validation with xsd files with dependencies ("schemalocation") Java Basics - Anfänger-Themen 1
B Fehlerhafte XML-Files verschieben Java Basics - Anfänger-Themen 6
R Rekursive Methode, Files finden Java Basics - Anfänger-Themen 2
Kenan89 XML-Files erstellen wirft File not found Exception Java Basics - Anfänger-Themen 9
B Files.copy wirft Exeption Java Basics - Anfänger-Themen 2
V java nio Files.copy Java Basics - Anfänger-Themen 10
C Automatisches Ausfuehren einer Funktion beim Laden eines Jar files Java Basics - Anfänger-Themen 3
A JDK installieren jar-Files ausführen Java Basics - Anfänger-Themen 12
A Datei relativ zur Lage des jar-files lesen Java Basics - Anfänger-Themen 16
L Methoden Files.walkFileTree implementation Java Basics - Anfänger-Themen 3
6 JDK installieren Runnable Jar Files ausführen?! Java Basics - Anfänger-Themen 8
G NetBeans Contains files with errors Java Basics - Anfänger-Themen 14
M Input/Output Namen der Files aus einem Ordner MIT bestimmten Encoding auslesen? Java Basics - Anfänger-Themen 3
H Jar Files verwenden Java Basics - Anfänger-Themen 9
J Wie auf eine Datei innerhalb des JAR-Files zugreifen Java Basics - Anfänger-Themen 2
N Files mit Byte an Socket versenden Java Basics - Anfänger-Themen 2
G Inhalt Jar-Files anzeigen, incl. Methoden Java Basics - Anfänger-Themen 2
S Exception: Too many open files Java Basics - Anfänger-Themen 6
apple987123 JAR Files Funktionieren nicht Java Basics - Anfänger-Themen 6
B Files aus Verzeichnis zählen Java Basics - Anfänger-Themen 9
M Online-Java-Games offline spielen? / Jar-Files zum laufen bringen? Java Basics - Anfänger-Themen 6
E ResourceBundles in Jar-Files Java Basics - Anfänger-Themen 5
M Sha256-Wert eines Files bestimmen Java Basics - Anfänger-Themen 13
S Hilfe es werden keine class files erstellt Java Basics - Anfänger-Themen 5
Y Applet lokal executable machen, externe Files inkludieren Java Basics - Anfänger-Themen 8
S String repräsentation eines XML-Files für Textarea formatieren. Java Basics - Anfänger-Themen 2
J Anfänger-Frage zu jar-Files / Manifest.mf / Classpath Java Basics - Anfänger-Themen 16
B Verzeichnisse und Dateien in JAR Files Java Basics - Anfänger-Themen 7
S Kein Zugriff auf Files in Jar-Datei Java Basics - Anfänger-Themen 4
G Zusammenfassung mehrerer jar-Files Java Basics - Anfänger-Themen 3
B Erstellen von tar Files Java Basics - Anfänger-Themen 2
G Teil eines Files einlesen und vergleichen Java Basics - Anfänger-Themen 4
U Habe meine .class files gelöscht. Java Basics - Anfänger-Themen 3
T Jar: Zugriff auf Dateien inner- unter außerhalb d. jar-Files Java Basics - Anfänger-Themen 3
M java mehrere jar files uebergeben Java Basics - Anfänger-Themen 5
L Alle Files eines Directories einlesen Java Basics - Anfänger-Themen 6
T Png files nach auslesen von BMP ohne Inhalt Java Basics - Anfänger-Themen 2
V Sprache umschalten mit properties-files mit KSKB Java Basics - Anfänger-Themen 3
G Pfad des Jar-Files ermitteln bzw. wo Datenbank speichern Java Basics - Anfänger-Themen 4
D Files aus Directory lesen Java Basics - Anfänger-Themen 2
roflomfg Parameterübergabe in in "*.jar" files möglich? Java Basics - Anfänger-Themen 8
P Import jar files: Wohin? Java Basics - Anfänger-Themen 2
J Mit JDOM HTML Files erzeugen? Java Basics - Anfänger-Themen 7
M Path eines Files Java Basics - Anfänger-Themen 24
G tomcat und class files Java Basics - Anfänger-Themen 5
G class Files zu exe ---> decompilieren? Java Basics - Anfänger-Themen 2
M Files löschen - alle, ausser das größte! Java Basics - Anfänger-Themen 3
J Werte eines XML Files überschreiben Java Basics - Anfänger-Themen 7
B erweiterte jar files - verbinden Java Basics - Anfänger-Themen 4
P JFileChooser soll nur .txt files anzeigen Java Basics - Anfänger-Themen 5
D Files Readen und Substring Java Basics - Anfänger-Themen 5
M Properties ausserhalb von jar files Java Basics - Anfänger-Themen 3
J Drucken von files Java Basics - Anfänger-Themen 4
F Java-Programm in mehreren files Java Basics - Anfänger-Themen 6
B JFileChooser für Files and Directories Java Basics - Anfänger-Themen 3
M Audio Files mit Base64 De-/Endcodieren Java Basics - Anfänger-Themen 5
C letzte Zeilen eines Files auslesen Java Basics - Anfänger-Themen 3
A Einbindung von .wav files. Java Basics - Anfänger-Themen 8
F Hilfe beim erstellen von Jar files! Java Basics - Anfänger-Themen 2
M alle Files aus einem Verzeichnis finden Java Basics - Anfänger-Themen 15
A Existenz eines Files abfragen Java Basics - Anfänger-Themen 13
G speichern von files Java Basics - Anfänger-Themen 2
A Einige Fragen zu Files Java Basics - Anfänger-Themen 2
D JAR-Files ausführbar machen Java Basics - Anfänger-Themen 28
Z prob beim erstellen eines jar files mit eclipse Java Basics - Anfänger-Themen 4
G jar file lässt sich nicht öffnen Java Basics - Anfänger-Themen 1
J selbst erstellte Datei mit Programm öffnen Java Basics - Anfänger-Themen 10
I Probleme mit OutputStream - Datei lässt sich nicht öffnen Java Basics - Anfänger-Themen 4
J Klassen .class Datei öffnen Java Basics - Anfänger-Themen 31
C Projekt öffnen BlueJ Java Basics - Anfänger-Themen 1
B File öffnen in src/main/webapp Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben