【问题标题】:Java PrintWriter exceptionJava PrintWriter 异常
【发布时间】:2016-02-03 13:24:18
【问题描述】:

我正在尝试解析一些链接,然后将信息存储在文本文件中,我将所有应该解析的链接放在一个列表中,但是在解析和存储有关 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");

【问题讨论】:

    标签: java html parsing printwriter


    【解决方案1】:

    您正在将 authorName 翻译成没有任何引用的文件名。当 authorName 包含斜线时会发生什么? => 你的结构中有一个额外的目录。

    请注意,Java 接受斜杠和反斜杠作为目录分隔符,因此您必须同时替换两者。

    这基本上就是您的异常中发生的情况:authorName = "MarcusSchmidt/JohannaDrott",这会导致一个新的子目录“MarcusSchmidt”,它不存在。

    另一个问题是如果两个页面具有相同的作者姓名,那么文件将被覆盖。

    一般而言,将来自不受控制的来源(例如 Internet)的值转换为系统资源时应该小心,因为这会使您的代码容易受到攻击。

    【讨论】:

    • 你的代码还有一个问题:如果两个页面的authorName相同,文件会被覆盖。
    • 那是错误的原因,谢谢兄弟!
    • 啊哈,好吧,我也会考虑这个的!
    【解决方案2】:

    您需要先创建文件(和目录):

    final File file = new File("/home/taner/Test/" + fileName + ".txt");
    file.mkdirs();
    file.createNewFile();
    

    【讨论】:

    • 那个,或者清除文件名中的非法文件系统字符
    【解决方案3】:

    检查您是否有此目录结构:/home/taner/Test/MarcusSchmidt/。似乎您的 fileName 字符串是 MarcusSchmidt/JohannaDrott.txt 而不仅仅是 JohannaDrott.txt

    【讨论】:

      猜你喜欢
      • 2019-08-19
      • 2016-10-15
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多