2015-06-09 2 views
2

Я пытаюсь создать новый файл с помощью java nio, и я запускаю ошибку createFile. Ошибка выглядит следующим образом:NoSuchFileException при создании файла с помощью nio

createFile error: java.nio.file.NoSuchFileException: /Users/jchang/result_apache_log_parser_2015/06/09_10:53:49 

сегмент кода выглядит следующим образом:

String filename = "/Users/jchang/result_apache_log_parser_" + filename_date; 
     Path file = Paths.get(filename); 
     try { 
      Files.createFile(file); 
     } catch (FileAlreadyExistsException x) { 
      System.err.format("file named %s" + 
        " already exists%n", file); 
     } catch (IOException x) { 
      System.err.format("createFile error: %s%n", x); 
     } 

Кто-нибудь есть какие-либо идеи, как это исправить? Спасибо за вашу помощь!

+2

'Files.create (...)' создает только файл, а не папку. Может ли это быть вашей эмблемой или существует ли папка? – Turing85

+0

О, ну что ж, мне нужен тип файла в конце? например .текст? – jstnchng

+1

Нет, нет. Но должен присутствовать путь к файлу (т. Е. Папка, в которой находится файл). – Turing85

ответ

5

Я бы сказал, что Turing85 был верным. В вашей переменной filename_date есть косые черты. Итак, /Users/jchang/result_apache_log_parser_2015 должен существовать как каталог. Это является причиной NoSuchFileException, отсутствующего каталога.

+0

Oh !!!!! Вероятно, поэтому !!! – jstnchng

+1

Но есть еще одна проблема (по крайней мере, под окнами): двоеточия являются незаконными символами. Я работаю над решением – Turing85

+1

Точно, я бы также рекомендовал заменить некоторые символы в файле 'filename_date' на допустимые символы. Например, 'filename_data = filename_date.replace ("/"," _ "). Replace (": "," _ ");' –

1

Ваш код имеет как минимум две проблемы. Во-первых: у вас есть разделители путей в вашем имени файла (/). Второе: по крайней мере под Windows ваше решение имеет недопустимые символы в имени файла (:).

Чтобы избавиться от первой проблемы, вы можете пойти по двум маршрутам: a) создать все нужные вам папки или b) изменить разделители на что-то другое. Я объясню и то, и другое.

Чтобы создать все папки на пути, вы можете просто позвонить

Files.createDirectories(path.getParent()); 

где path является файл (важно!). Вызывая getParent() в файле, мы получаем папку, в которой находится path. Files.createDirectories(...) заботится обо всем остальном.

б) Измените разделители: Нет ничего проще, чем это:

String filename = "/Users/jchang/result_apache_log_parser_" 
       + filename_date.replace("/", "_") 
           .replace(":", "_"); 

Это должно дать что-то вроде /User/jchang/result_apache_parser_2015_06_09_10_53_29

С б) мы позаботились о второй проблеме, а также.

Теперь давайте установить все это вместе и применить некоторые незначительные трюки из nio:

String filename = "/Users/jchang/result_apache_log_parser_" 
       + filename_date.replace('/', '_') 
           .replace(':', '_'); 

Path file = Paths.get(filename); 
try { 
    // Create sub-directories, if needed. 
    Files.createDirectories(file.getParent()); 
    // Create the file content. 
    byte[] fileContent = ...; 
    // We do not need to create the file manually, let NIO handle it. 
    Files.write(file 
       , fileContent 
       // Request permission to write the file 
       , StandardOpenOption.WRITE 
       // If the file exists, append new content 
       , StandardOpenOption.APPEND 
       // If the file does not exist, create it 
       , StandardOpenOption.CREATE); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Для получения дополнительной информации о nio клик here.

1

Как многие говорили, что вам нужно, чтобы создать промежуточные каталоги, как ../06/ ..

Так что используйте это, прежде чем создавать файл, чтобы создать каталоги, которые не существуют,

Files.createDirectories(mPath.getParent()); 

Итак, ваш код должен быть:

Path file = Paths.get(filename); 
    try { 
     Files.createDirectories(file.getParent()); 
     Files.createFile(file); 
    } catch (FileAlreadyExistsException x) { 
     System.err.format("file named %s" + 
       " already exists%n", file); 
    } catch (IOException x) { 
     System.err.format("createFile error: %s%n", x); 
    } 
Смежные вопросы