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)的值转换为系统资源时应该小心,因为这会使您的代码容易受到攻击。