Hallo,
leider tritt bei meinem Java-Programm, welches alle Links einer Website besuchen soll, und dann ein Textfile mit dem Graphen der Verlinkung speichern soll, manchmal die Exception: "Too many open files" auf, wenn am Ende das File geschrieben werden soll (es speichert eine Adjazenzmatrix).
Gefühlsmäßig tritt der Fehler nur dann auf, wenn die jeweilige Webseite besonders viele tote Links, also nicht erreichbare Unterseiten hatte. Kann es aber nicht sicher sagen. Ich habe mich schon verrückt gesucht, und finde den Fehler nicht, wo etwas offen gelassen wird. Ich poste hier einmal die eventuell relevanten Codeteile (teilweise sind die Try-Catch-Blöcke bereits etwas komisch usw., das ist, weil ich schon so viel herumprobiert habe, um den Fehler zu beheben).
Das Ganze startet in einem neuen Thread, da ansonsten leider die Parameter für die Angabe der Stacksize als Parameter für die Virtual Machine (-Xss) beim Starten nicht greifen. Ansonsten wäre der Thread eigentlich nicht nötig, aber ich glaube auch nicht, dass er damit etwas zu tun hat.
Das Programm läuft auf einem Großrechner mit Linux (64bit-Architektur) und unter Java 5, da es unter Java 6 grobe Probleme gab (siehe auch mein anderer Forums-Thread).
Der Fehler tritt wie gesagt nicht immer auf ... und ich habe einfach keine Idee mehr, was ich zu schließen übersehen habe.
Sieht irgendjemand meinen Fehler?
Lg
sunny
leider tritt bei meinem Java-Programm, welches alle Links einer Website besuchen soll, und dann ein Textfile mit dem Graphen der Verlinkung speichern soll, manchmal die Exception: "Too many open files" auf, wenn am Ende das File geschrieben werden soll (es speichert eine Adjazenzmatrix).
Gefühlsmäßig tritt der Fehler nur dann auf, wenn die jeweilige Webseite besonders viele tote Links, also nicht erreichbare Unterseiten hatte. Kann es aber nicht sicher sagen. Ich habe mich schon verrückt gesucht, und finde den Fehler nicht, wo etwas offen gelassen wird. Ich poste hier einmal die eventuell relevanten Codeteile (teilweise sind die Try-Catch-Blöcke bereits etwas komisch usw., das ist, weil ich schon so viel herumprobiert habe, um den Fehler zu beheben).
Code:
public class HTT2 implements Runnable {
[...]
public static void main(String[] args) throws Exception {
try {
(new Thread(new HTT2())).start();
}
catch (StackOverflowError e) {
System.out.println("Exception: StackOverFlowError");
}
catch (Throwable t) {
System.out.println("Error t: " + t);
}
}
public void run() {
startCrawling();
}
public void startCrawling() {
try {
[...]
FileReader file = new FileReader(path + "data/links" + nr + ".txt");
BufferedReader in = new BufferedReader(file);
String line = null;
while ((line = in.readLine()) != null) {
urlList.add(line.toString());
}
in.close();
in = null;
file.close();
file = null;
while (!urlList.isEmpty()) {
[...]
getLinks(actUrl);
}
}
catch (Exception e) {
System.err.println("Exception: File with input links not found.");
}
}
public void getLinks(URL url) {
URLConnection con = null;
InputStream stream = null;
InputStreamReader input = null;
BufferedReader br = null;
HTMLEditorKit editorKit = null;
HTMLDocument htmlDoc = null;
[...]
try {
con = url.openConnection();
con.setReadTimeout(10000);
if (con.getContentType().contains("text/html")) {
stream = con.getInputStream();
try {
input = new InputStreamReader(stream);
try {
br = new BufferedReader(input);
try {
editorKit = new HTMLEditorKit();
htmlDoc = new HTMLDocument();
htmlDoc.putProperty("IgnoreCharsetDirective", Boolean.TRUE);
editorKit.read(br, htmlDoc, 0);
}
finally {
br.close();
}
}
finally {
br.close();
input.close();
}
}
finally {
br.close();
input.close();
stream.close();
}
HTMLDocument.Iterator iter = htmlDoc.getIterator(HTML.Tag.A);
[...]
while (iter.isValid()) { //Iterate through all links of webpage
[...]
iter.next();
}
}
con = null;
htmlDoc = null;
editorKit = null;
br = null;
input = null;
stream = null;
}
catch (Exception e) {
System.err.println("Exception: Site doesn't exist - " + e);
con = null;
htmlDoc = null;
editorKit = null;
try {
stream.close();
}
catch (Exception e1) {
System.err.println("Exception closing: " + e1);
}
finally {
stream = null;
try {
input.close();
}
catch (Exception e2) {
System.err.println("Exception closing: " + e2);
}
finally {
input = null;
try {
br.close();
}
catch (Exception e3) {
System.err.println("Exception closing: " + e3);
}
finally {
br = null;
}
}
}
}
finally {
getNextUrl();
}
}
public void getNextUrl() {
if (linksNotYetVisited.size() > 0) {
[...]
getLinks(newUrl);
}
else {
[...]
writeTextFile(str, pth);
}
}
public void writeTextFile(String string, String path) {
try {
FileWriter file = new FileWriter(path);
BufferedWriter out = new BufferedWriter(file);
out.write(string);
out.close();
out = null;
file.close();
file = null;
}
catch (Exception e) {
System.err.println("Exception: Error writing textfile.");
System.err.println(e);
}
}
}
Das Ganze startet in einem neuen Thread, da ansonsten leider die Parameter für die Angabe der Stacksize als Parameter für die Virtual Machine (-Xss) beim Starten nicht greifen. Ansonsten wäre der Thread eigentlich nicht nötig, aber ich glaube auch nicht, dass er damit etwas zu tun hat.
Das Programm läuft auf einem Großrechner mit Linux (64bit-Architektur) und unter Java 5, da es unter Java 6 grobe Probleme gab (siehe auch mein anderer Forums-Thread).
Der Fehler tritt wie gesagt nicht immer auf ... und ich habe einfach keine Idee mehr, was ich zu schließen übersehen habe.
Sieht irgendjemand meinen Fehler?
Lg
sunny
Zuletzt bearbeitet: