2016-02-03 2 views
0

Я пытаюсь разобрать некоторые ссылки, а затем хранить информацию в текстовых файлах, у меня есть все ссылки, которые должны быть проанализированы в списке, но после разбора и хранения информации о 100 ссылках я получил ошибку, которую я действительно не мог понять, почему это происходит, вот мой код:Исключение Java PrintWriter

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"); линия

ответ

2

Вы переводите authorName в имя файла без кавычек. Что происходит, когда authorName содержит Slash? => У вас есть дополнительный каталог в вашей структуре.

Обратите внимание, что Java принимает слэш и обратную косую черту как разделитель каталогов, поэтому вам необходимо заменить оба.

В основном это происходит в вашем исключении: authorName = «MarcusSchmidt/JohannaDrott», что приводит к созданию нового подкаталога «MarcusSchmidt», которого не существует.

Другая проблема заключается в том, что две страницы имеют одинаковое имя authorName, после чего файл будет перезаписан.

В целом вы должны быть осторожны при переводе значений из неконтролируемого источника, такого как Интернет, в системные ресурсы, так как это открывает уязвимость вашего кода.

+0

У вашего кода есть другая проблема: если две страницы имеют одинаковое имя_имя, файл будет перезаписан. – penguineer

+0

Это было причиной ошибки, спасибо, брат! – Tano

+0

aha, ладно, я тоже подумаю об этом! – Tano

1

Вам нужно создать файл (и каталоги) первый:

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

Это или очистка имени файла для незаконных символов файловой системы. –

0

Проверьте, если у вас есть эта структура каталогов: /home/taner/Test/MarcusSchmidt/. Кажется, что ваша строка fileName составляет MarcusSchmidt/JohannaDrott.txt, а не только JohannaDrott.txt.

Смежные вопросы