2016-11-21 61 views
2

我想打開一個文件來閱讀或創建文件,如果它不存在。 我用這個代碼:File.newInputStream中的NoSuchFileException與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'選項被忽略 - 只有'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

我喜歡你的解決方案。我只是不明白你的最終通知:「最好使用」試用資源「而不是手動關閉InputStream」。你能解釋一下嗎 – Arashsoft

+0

我在互聯網上搜索,我知道了。 Java 7的很好的功能。謝謝 – Arashsoft

+0

這個答案並不能回答你的問題,而是幫助你改善你的代碼,而忽略了你正在處理的問題的原因。@Arashsoft – another

0

因此到JavaDocs你應該使用newOutputStream()方法來代替,然後你就會創建該文件:

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

的JavaDoc:

// 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(路徑)'? –