unverständliche exception

Status
Nicht offen für weitere Antworten.

darkeye2

Bekanntes Mitglied
Tach, arbeite an einem prog, dass in einen komplexen ordnersystem nach bestimmten files suchen soll, und nun krige ich gleich mehrere fehler, die ich in dem zusammenhang nicht verstehe, hier der Queltext:

Java:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.StringTokenizer;

import javax.swing.*;

public class TestSuFu extends JFrame{
	
	String[] rootDirectories;
	JTextField LB = new JTextField(4);
	JTextArea tabel = new JTextArea();
	JTextField searcher = new JTextField(20);
	String[] suwords;
	File driveC;
	
	TestSuFu(){
		super();
		this.setLayout(new FlowLayout());
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setTitle("Wuala SuFu");
		this.setResizable(false);
		
		JPanel setings = new JPanel();
		JPanel tabelle = new JPanel();
		JButton setter = new JButton("Set");
		JButton search = new JButton("Suchen");
		search.addActionListener(new SearchEvent());
		JLabel such = new JLabel("Suchbegriff:");
		JScrollPane scrolls = new JScrollPane(tabel);
		
		setter.addActionListener(new SetEvent());

		setings.setSize(380, 50);
		setings.add(new JLabel("Wuala Laufwerksbuchstabe:"));
		setings.add(LB);
		setings.add(setter);
		
		tabelle.add(such);
		tabelle.add(searcher);
		tabelle.add(search);
		tabelle.add(scrolls);
		
		this.add(setings);
		this.add(tabelle);
		this.pack();
		this.setSize(400, 300);
		searcher.setSize(300, 45);
		LB.setSize(100, 45);
		tabelle.setSize(350, 200);
		tabel.setPreferredSize(new Dimension(200, 150));
		scrolls.setSize(390, 200);
		this.setVisible(true);
		
		
		
	}
	
	class SearchEvent implements ActionListener{

		public void actionPerformed(ActionEvent n){
			StringTokenizer st = new  StringTokenizer(searcher.getText());
			suwords = new String[st.countTokens()];
			for(int nt = 0; nt < rootDirectories.length; nt++){
				new suchTh(rootDirectories[nt]);
			}

		  }
			
		}
	
	void treeWalk(File file) {
 		if (file.isDirectory()) {
 			File[] children = file.listFiles();
 			for (int i = 0; i < children.length; i++) {
 				treeWalk(children[i]);
 			}
 		} else {
 			for(int t = 0; t < suwords.length; t++){
 				System.out.println(file.getName());
 			if(file.getName().contains(suwords[t])){
 				tabel.setText(tabel.getText() + file.getAbsolutePath());
 				
 			}
 			}
 		}
 	}
	
	
	class suchTh extends Thread {
		public String wort;
		
		public suchTh(String worter){
			this.wort = worter;
			this.start();
		}
		
		public void run()
		  {
			File newfile = new File(driveC + "\\" + wort + "\\");
			treeWalk(newfile);
		  }
		}
		
	
	
	class SetEvent implements ActionListener{

		public void actionPerformed(ActionEvent c){
			driveC = new File(LB.getText() + ":\\mygroups\\");
			rootDirectories = driveC.list();
		  }
			
		}
	

	
	public static void main(String[] args) throws Exception {
		new TestSuFu();

 
 	}
 
 	
 }

da teilweise viele daten drin sind, und es ewig daurn würde, mit einem thread alles zu durchsuchen, wird für jeden großen überordner (sind etwa 30 - 40) ein thread erstellt, der suchen soll.

so sieht der fehler für jeden thread aus, der erstellt wird:
Java:
Exception in thread "Thread-6" Exception in thread "Thread-18" java.lang.NullPointerException
	at java.lang.String.contains(Unknown Source)
	at de.spsb.irc.v1_0.TestSuFu.treeWalk(TestSuFu.java:85)
	at de.spsb.irc.v1_0.TestSuFu.treeWalk(TestSuFu.java:80)
	at de.spsb.irc.v1_0.TestSuFu.treeWalk(TestSuFu.java:80)
	at de.spsb.irc.v1_0.TestSuFu$suchTh.run(TestSuFu.java:105)
 
danke für die hilfe, hattest recht, aber scheinbar stimmt noch irgendwas nicht, es wird zwar kein fehler mehr angezeigt, aber es werden bei weitem nicht alle dateien angezeigt, die eigentlich angezeigt werden sollten.

Kann es sein, das bei der contains methode die groß-/ kleinschreibung eine rolle spilet?
 
Natürlich, "JAVA" ist ja etwas anderes als "Java" oder "java".
 
wie würde sich das hier am besten verhindern lassen? finde bei der contains methode sowas wie ignorecase nicht.
 
wie würde sich das hier am besten verhindern lassen? finde bei der contains methode sowas wie ignorecase nicht.
Vllt. hilft ja "<String>.matches()" weiter. Aus den Suchbegriffen müssten dann aber reguläre Ausdrücke (bzw. ein regulärer Ausdruck) werden. Ich selbst hab' mich aber noch nicht mit befasst. Das ist deswegen nur so 'ne Idee.
 
Java:
if(file.getName().toLowerCase().contains(suwords[t].toLowerCase())){
      tabel.setText(tabel.getText() + file.getAbsolutePath());
                
}
 
danke, habs jetzt mit toLowerCase gemacht, aber nach den 7 stunden arbeit denke ich langsamm, ich gehe die sache völlig falsch an...

Problem:
in etwa 30 - maximal 70 überordnern befinden sich sehr viele weitere unterordner und daten (ca. 300tb daten in vielen tausenden ordnern untergebracht. nun will ich da schnell etwas finden können, schnell heißt innerhalb von 3-4 min, schneller wäre optimal.

Idee:
ich erstelle für jeden der überordner einen eigenen thread der eben für seine unterordner verantwortlich ist. es soll immer der vollständige pfad zu einem ordner oder einer datei ausgegeben werden, die im namen den suchbegriff enthält, oder einen teil des suchbegriffs.

Queltext:
Gui:
Java:
TestSuFu(){
		super();
		this.setLayout(new FlowLayout());
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setTitle("Wuala SuFu");
		this.setResizable(false);
		
		JPanel setings = new JPanel();
		JPanel tabelle = new JPanel();
		JButton setter = new JButton("Set");
		JButton search = new JButton("Suchen");
		search.addActionListener(new SearchEvent());
		JLabel such = new JLabel("Suchbegriff:");
		JScrollPane scrolls = new JScrollPane(tabel);
		
		setter.addActionListener(new SetEvent());

		setings.setSize(380, 50);
		setings.add(new JLabel("Laufwerksbuchstabe:"));
		setings.add(LB);
		setings.add(setter);
		
		tabelle.add(such);
		tabelle.add(searcher);
		tabelle.add(search);
		tabelle.add(scrolls);
		
		this.add(setings);
		this.add(tabelle);
		this.pack();
		this.setSize(400, 300);
		searcher.setSize(300, 45);
		LB.setSize(100, 45);
		tabelle.setSize(350, 200);
		tabel.setPreferredSize(new Dimension(200, 150));
		scrolls.setSize(390, 200);
		this.setVisible(true);
Set Button (laufwerksbezeichner und datenpfad in variablen speichern):
Java:
class SetEvent implements ActionListener{

		public void actionPerformed(ActionEvent c){
			driveC = new File(LB.getText() + ":\\mygroups\\");
			rootDirectories = driveC.list();
		  }
			
		}
klick auf button suchen (suchbegriff in einzelne wörter zerlegen und für jeden überordner einen suchthread starten):
Java:
class SearchEvent implements ActionListener{

		public void actionPerformed(ActionEvent n){
			StringTokenizer st = new  StringTokenizer(searcher.getText());
			suwords = new String[st.countTokens()];
			int m = 0;
			while(st.hasMoreElements()){
				suwords[m] = (String) st.nextElement();
				m++;
				
			}
			for(int nt = 0; nt < rootDirectories.length; nt++){
				new suchTh(driveC + "\\" + rootDirectories[nt] + "\\");
			}

		  }
			
		}
Der Suchthread (starten der suchfunktion für diesen thread , für den jeweiligen überordner):
Java:
class suchTh extends Thread {
		public String wort;
		
		public suchTh(String worter){
			this.wort = worter;
			this.start();
		}
		
		public void run()
		  {
			File newfile = new File(wort);
			treeWalk(newfile);
		  }
		}
Suchfunktion:
Java:
void treeWalk(File file) {
 		if (file.isDirectory()) {
 			
 			for(int st = 0; st < suwords.length; st++){
 	 			if(file.getName().toLowerCase().contains(suwords[st].toLowerCase())){
 	 				tabel.setText(tabel.getText() + file.getAbsolutePath());
 	 			}
 			}
 			
 			String  abpf = new String(file.getAbsolutePath());
 			File[] children = file.listFiles();
 			for (int i = 0; i < children.length; i++) {
 				treeWalk(children[i]);
 			}
 		} else {
 			for(int t = 0; t < suwords.length; t++){
 			if(file.getName().toLowerCase().contains(suwords[t].toLowerCase())){
 				tabel.setText(tabel.getText() + file.getAbsolutePath());
 				
 			}
 			}
 		}
 	}

Was könnte ich falsch gemacht haben, oder was könnte / sollte ich anders machen (inzwischen kriege ich kein einziges suchergebniss)
 
Ich vermute, dass mehrere Threads die Sache nicht beschleunigen werden und nur dein Programm komplexer machen.
Grund: der limitierende Faktor wird nicht die Prozessorauslastung sein sondern der Zugriff auf die Festplatte. Die wird schon mit einem Thread zu 100% ausgelastet.

Wenn du regelmäßig etwas in 300 TB suchen willst, solltest du evtl. die Daten indizieren lassen. Unter Linux/Unix mittels updatedb/locate oder unter Java: Apache Lucene - Overview

EDIT: irgendwie hab ich da was durcheinander gebracht. Du willst ja keine Dateien indizieren sondern danach suchen und dein Vorhaben sieht auch nach Windows aus 🙂
 
Zuletzt bearbeitet:
im grunde hab ich zwar windows grad auf meinen rechner, aber das prog sollte nach möglichkeit auch unter linux laufen. die festplatte, ist eigentlich ein server, der über eine virtuelle festplatte mit meinem rechner verknüpft ist, das heißt die daten sind nicht auf meinen rechner, sondern auf einen server außerhalb, (linuxserver) doch der einzigste zugriff, denn ich auf dem server habe, ist eben der über die virtuelle festplatte.

ich habe durchaus schon mal drüber nachgedacht, ob ich mir ein prog erstelle, dass mir dateinamen und absoluten pfad in einer mysql db abspeichert (auf einen anderen server) aber dachte mir, da ständig ordner und daten dazukommen, müsste man das ständig aktualisieren und ich vermute mal, wenn suchen so lange dauert, würde auch das eintragen genau so lang daueren.

Noch eine frage, wie kriege ich es hin, das nach jedem eintrg, in mein jtextarea automatisch ein zeilenumbruch gemacht wird? hab gehört man soll einfach sowas in den text einfügen: /n , aber scheint net zu klappen, dann hab ich sowas als ausgabe:
eingabe1 = "a";
eingabe2 = "b";
area.setText (eingabe1 + "/n" + eingabe2);
ausgabe: a/nb
 
Zuletzt bearbeitet:
achso, danke jetzt klappts, gibts eigentlich eine möglichkeit, alle vom programm gestarteten threads zu beenden? mein prog startet ja für jeden überordner einen thread, und ich kenne somit die namen der threads net.
Nun wurde vielleicht schon gefunden, wonach ich suche, und ich würde gern die restliche suche abbrechen also alle sucht threads killen, ist sowas möglich?
 
Selber implementieren könnte bei derartigen Sachen schon viel zu umständlich sein. Schau dir mal das "java.util.concurrent"-API an.
 
hmm, bin grad net ganz sicher, ob es das richtige ist, hab die classe ThreadPoolExecutor gefunden, klingt interessant, aber verstehe net ganz, wie genau das funktioniert.

Hab jetzt noch eine möglichkeit gefunden, ich speichere beim aufrufen der threads die namen in einem string array, wie kann ich danach mit dem namen den thread aufrufen um den befehl stop(); zu übergeben?
 
Zuletzt bearbeitet:
Vllt. reicht es ja, die einzelnen Threads, einer Liste ("List<Thread>") (besser einem Set "Set<Thread>") hinzuzufügen. Falls ein Thread den status "gefunden" meldet, muss nur noch über diese Liste iteriert werden um die restlichen Threads zu stoppen.
 
so, habs jetzt so gelöst, dass ich ein thread array anlege, und über dieses dann alle threads beende, noch eine frage habe ich allerdings, ich möchte abfragen, ob noch threads laufen (oder bereits von alleine beendet wurden) deswegen will ich per schleife zählen lassen, wie viele threads noch bei getState() runnable ausgeben und die anzahl dann ausgeben. Allerdings kann man scheinbar nicht einfach so vergleichen:
if (threadS.getState() == "RUNNABLE"){}
Wie kann ich das abfragen, ob state noch runable ist?
 
danke für deine hilfe, werde erstmal bei meinem selbstgebastelten bleiben, aber schaue mir die links auch mal an. Funktioniert jetz soweit, mal schauen, wie lange es dauert, bis ich wieder eure hilfe brauche^^
 
Hallo, hab jetzt wieder ne frage^^

also es funktioniert alles soweit, nicht perfekt aber es geht, nun möcht ich es allerdings so machen, dass man beim markieren der ausgegebenen links, die etwa so aussehen :
X:\\Start\linksammlung\php\php5.pdf
oder einfach so:
X:\\Start\linksammlung\php
und klicken auf nem butten der link in einen speziellen prog geöffnet wird, das heißt, mir reicht es nicht, den standartbrowser mit link aufzurufen, sondern ich möchte ein prog wählen, mit dem der link geöffnet werden soll... ist etwas kompliziert das zu erklären, so wie ich bei textdateien den editor auswählen kann, will ich hier den link mit einem spezielen prog öffnen, wie könnte ich das umsetzen?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben