java.io.FileNotFoundException убивает поток
Ловлю java.io.FileNotFoundException: /sys/kernel/security/apparmor/.null (Отказано в доступе) под Debian. Вот код:
FileInputStream stream;
try
{
stream = new FileInputStream(file);
}
catch
{
System.out.println(e);
}
Причем если проверить file.exists() то файл существует. Если проверить file.canRead() то тоже все ок. Может кто сталкивался и может помочь? Ладно бы исключение обработалось и программа продолжила бы работать, но после него программа "ложится" и вставать уже не собирается почему то. Да, сообщение выводится, но потом происходит что-то странное. Этот код вертится в отдельном потоке который перебирает файлы в заданной папке и пытается их прочитать. После одного такого файла поток уходит в оффлайн, перед этим сообщив ошибку. Символические ссылки поток пропускает.
Вот весь код:
@Override
public void run()
{
super.run();
brute(dir);
System.out.println("find thread finished");
}
private void brute(File f)
{
if (Files.isSymbolicLink(f.toPath()))
return;
if (f.isDirectory())
dir_brute(f);
else
file_check(f);
}
private void dir_brute(File f)
{
if (Files.isSymbolicLink(f.toPath()))
return;
if (f.listFiles() == null)
return;
for (File i : f.listFiles())
brute(i);
}
private void file_check(File f)
{
if (Files.isSymbolicLink(f.toPath()))
return;
if(!Files.isReadable(f.toPath()))
{
System.out.println("unreadable " + canonical_path(f));
return;
}
Map m = meta(f);
if(m==null)
{
System.out.println("null meta " + canonical_path(f));
return;
}
if (check(m, vector))
{
System.out.println("good " + canonical_path(f));
for (int i = 0; i < 1; i++)
{
writer.print(canonical_path(f) + '\r' + '\n');
writer.flush();
}
}
else
System.out.println(" bad " + canonical_path(f));
}
В функции meta вот что:
Metadata metadata = new Metadata();
AutoDetectParser parser = new AutoDetectParser();
BodyContentHandler handler = new BodyContentHandler();
ParseContext context = new ParseContext();
FileInputStream stream;
if(!file.exists())
return null;
try
{
stream = new FileInputStream(file);
}
catch (java.io.FileNotFoundException e)
{
System.out.println(e);
return null;
}
try
{
parser.parse(stream, handler, metadata, context);
}
catch (Exception e)
{
System.out.println(e);
return null;
}
String content_type = metadata.get(Metadata.CONTENT_TYPE);
//проверено, content_type может быть null!
if (content_type == null)
return null;
else
metadata.add("Тип содержимого", content_type);
metadata.remove(Metadata.CONTENT_TYPE);
metadata.add("Расширения", ext_from_repo(content_type));
Map result = new TreeMap();
for (String dirty_name : metadata.names())
{
Object name = Core.getNames().get(dirty_name);
String values[] = metadata.getValues(dirty_name);
if (values.length == 1)
result.put(name == null ? dirty_name : name, values[0]);
if (values.length > 1 && !dirty_name.equals("X-Parsed-By"))
{
get_main_writer().println("ALERT: more than 2 for non-parser meta field:" + dirty_name);
get_main_writer().flush();
}
}
return result;
Ответы (1 шт):
Когда у Вас в ф-ии meta выполняется вот это
catch (java.io.FileNotFoundException e)
{
System.out.println(e);
return null;
}
Строчка return null возвращает вас обратно по стеку вызова со значением null, где затем происходит вот это:
if(m==null)
{
System.out.println("null meta " + canonical_path(f));
return;
}
Что опять же нас возвращает еще на шаг назад сюда:
private void brute(File f)
{
if (Files.isSymbolicLink(f.toPath()))
return;
if (f.isDirectory())
dir_brute(f);
else
file_check(f);
}
где file_check(f) (место, откуда мы вернулись) - последняя инструкция текущего метода brute(File f).
Соотв-но мы возвращаемся обратно в run() где всё и завершается. Вам надо переработать механизм обхода дерева файловой системы.