2016-11-21 2 views
2

Я пытаюсь открыть файл для чтения или создания файла, если его там не было. Я использую этот код:NoSuchFileException в Files.newInputStream с StandardOpenOption.CREATE

String location = "/test1/test2/test3/"; 
new File(location).mkdirs(); 
location += "fileName.properties"; 
Path confDir = Paths.get(location); 
InputStream in = Files.newInputStream(confDir, StandardOpenOption.CREATE); 
in.close(); 

И я получаю java.nio.file.NoSuchFileException

Учитывая, что я использую StandardOpenOption.CREATE вариант, файл должен быть создан, если он не существует.

Любая идея, почему я получаю это исключение?

+1

Не имеет смысла создавать пустой файл только для чтения. – EJP

+1

Другими словами, параметр 'CREATE' игнорируется - javadoc должен учитываться только параметр' READ' (и по умолчанию), другие опции МОГУТ поддерживаться (специфично для реализации) –

ответ

1

Кажется, что вам нужна одна из двух совершенно разных вещей:

  1. Если файл существует, прочитайте его; или
  2. Если файл не существует, создайте его.

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

Path confDir = Paths.get("/test1/test2/test3"); 
    Files.createDirectories(confDir); 
    Path confFile = confDir.resolve("filename.properties"); 

    if (Files.exists(confFile)) 
     try (InputStream in = Files.newInputStream(confFile)) { 
      // Use the InputStream... 
     } 
    else 
     Files.createFile(confFile); 

Обратите также внимание, что лучше использовать «примерочных с-ресурсов» вместо того, чтобы вручную закрыть InputStream.

+0

Мне нравится ваше решение. Я просто не понимаю вашего последнего уведомления: «Лучше использовать« try-with-resources »вместо ручного закрытия InputStream». Не могли бы вы объяснить это? – Arashsoft

+0

Я искал в Интернете, и я получил его. Хорошая функция Java 7. Спасибо – Arashsoft

+0

Этот ответ не отвечает на ваш вопрос, но помогает вам улучшить код вместо этого, игнорируя причины проблемы, с которой вы столкнулись[email protected] – another

0

Соответственно к JavaDocs вы должны были использовать newOutputStream() метод вместо этого, и тогда вы будете создавать файл:

OutputStream out = Files.newOutputStream(confDir, StandardOpenOption.CREATE); 
out.close(); 

JavaDocs:

// Opens a file, returning an input stream to read from the file. 
static InputStream newInputStream(Path path, OpenOption... options) 

// Opens or creates a file, returning an output stream that 
// may be used to write bytes to the file. 
static OutputStream newOutputStream(Path path, OpenOption... options) 

Объяснение в том, что использование OpenOption константы зависит от вы будете использовать его в потоке записи (вывода) или потоке чтения (ввода). Это объясняет, почему OpenOption.CREATE работает только с OutputStream, но не с InputStream.

ПРИМЕЧАНИЕ: Я согласен с @EJP, вы должны взглянуть на Oracle's tutorials для правильного создания файлов.

0

Я думаю, что вы намеревались создать OutputStream (для записи) вместо InputStream (который для чтения)

Другой удобный способ создания пустого файла используется apache-commonsFileUtils как этот

FileUtils.touch(new File("/test1/test2/test3/fileName.properties")); 
+1

Почему бы не использовать стандартные файлы Java 7 '. CreateFile (Путь) '? –