Java PrintWriter 异常
Java PrintWriter exception
我正在尝试解析一些链接,然后将信息存储在文本文件中,我将所有应该解析的链接都放在一个列表中,但是在解析和存储大约 100 个链接的信息后,我得到了错误,我真的可以不明白为什么会发生,这是我的代码:
for(String link : links){
Document doc = Jsoup.connect(link).get();
Element e1 = doc.select("h1").first();
String authorName = e1.ownText();
String fileName = authorName.replaceAll("\s+","");
PrintWriter writer = new PrintWriter("/home/taner/Test/"+fileName+".txt", "UTF-8");
String description = doc.getElementsByClass("article__content").text();
writer.write(description);
writer.close();
}
这就是我得到的错误:
Exception in thread "main" java.io.FileNotFoundException: /home/taner/Test/MarcusSchmidt/JohannaDrott.txt (No such file or directory)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
at java.io.PrintWriter.<init>(PrintWriter.java:192)
at java.io.PrintWriter.<init>(PrintWriter.java:232)
at Test1.main(Test1.java:253)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
253行实际上是PrintWriter writer = new PrintWriter("/home/taner/Test/"+fileName+".txt", "UTF-8");
行
您需要先创建文件(和目录):
final File file = new File("/home/taner/Test/" + fileName + ".txt");
file.mkdirs();
file.createNewFile();
检查您是否具有此目录结构:/home/taner/Test/MarcusSchmidt/
。似乎您的 fileName
字符串是 MarcusSchmidt/JohannaDrott.txt
而不仅仅是 JohannaDrott.txt
.
您正在将 authorName 翻译成没有任何引号的文件名。当 authorName 包含斜杠时会发生什么? => 你的结构中有一个额外的目录。
请注意 Java 接受斜杠和反斜杠作为目录分隔符,因此您必须替换两者。
这基本上就是您的异常中发生的情况:authorName = "MarcusSchmidt/JohannaDrott",它导致一个新的子目录 "MarcusSchmidt",它不存在。
另一个问题是如果两个页面有相同的authorName,那么文件将被覆盖。
一般来说,将来自不受控制的来源(例如 Internet)的值转换为系统资源时应该小心,因为这会使您的代码容易受到攻击。
我正在尝试解析一些链接,然后将信息存储在文本文件中,我将所有应该解析的链接都放在一个列表中,但是在解析和存储大约 100 个链接的信息后,我得到了错误,我真的可以不明白为什么会发生,这是我的代码:
for(String link : links){
Document doc = Jsoup.connect(link).get();
Element e1 = doc.select("h1").first();
String authorName = e1.ownText();
String fileName = authorName.replaceAll("\s+","");
PrintWriter writer = new PrintWriter("/home/taner/Test/"+fileName+".txt", "UTF-8");
String description = doc.getElementsByClass("article__content").text();
writer.write(description);
writer.close();
}
这就是我得到的错误:
Exception in thread "main" java.io.FileNotFoundException: /home/taner/Test/MarcusSchmidt/JohannaDrott.txt (No such file or directory)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
at java.io.PrintWriter.<init>(PrintWriter.java:192)
at java.io.PrintWriter.<init>(PrintWriter.java:232)
at Test1.main(Test1.java:253)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
253行实际上是PrintWriter writer = new PrintWriter("/home/taner/Test/"+fileName+".txt", "UTF-8");
行
您需要先创建文件(和目录):
final File file = new File("/home/taner/Test/" + fileName + ".txt");
file.mkdirs();
file.createNewFile();
检查您是否具有此目录结构:/home/taner/Test/MarcusSchmidt/
。似乎您的 fileName
字符串是 MarcusSchmidt/JohannaDrott.txt
而不仅仅是 JohannaDrott.txt
.
您正在将 authorName 翻译成没有任何引号的文件名。当 authorName 包含斜杠时会发生什么? => 你的结构中有一个额外的目录。
请注意 Java 接受斜杠和反斜杠作为目录分隔符,因此您必须替换两者。
这基本上就是您的异常中发生的情况:authorName = "MarcusSchmidt/JohannaDrott",它导致一个新的子目录 "MarcusSchmidt",它不存在。
另一个问题是如果两个页面有相同的authorName,那么文件将被覆盖。
一般来说,将来自不受控制的来源(例如 Internet)的值转换为系统资源时应该小心,因为这会使您的代码容易受到攻击。