2013-01-10 8 views
23

Sto provando a scrivere del testo su un file usando il metodo Files.write().Java Files.write NoSuchFileException

byte[] contents = project.getCode().getBytes(StandardCharsets.UTF_8); 

try { 
    Files.write(project.getFilePath(), contents, StandardOpenOption.CREATE); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
    return; 
} 

Secondo l'API, se il file non esiste, verrà creato e poi scritti.

Tuttavia, ottengo questo:

java.nio.file.NoSuchFileException: C:\Users\Administrator\Desktop\work\Default.txt 
    at sun.nio.fs.WindowsException.translateToIOException(Unknown Source) 
    at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source) 
    at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source) 
    at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(Unknown Source) 
    at java.nio.file.spi.FileSystemProvider.newOutputStream(Unknown Source) 
    at java.nio.file.Files.newOutputStream(Unknown Source) 
    at java.nio.file.Files.write(Unknown Source) 

mi sto perdendo qualcosa?

+7

La directory 'C: \ Users \ Administrator \ Desktop \ work' esiste? (e perché sviluppi come amministratore?) – fge

+5

La cartella è mancante? –

+1

usa file.getParentFile(). Mkdirs(); –

risposta

35

Dovresti riuscire a creare un file, ma non puoi creare una directory. Potrebbe essere necessario controllare prima la directory C:\Users\Administrator\Desktop\work.

Si può fare

Path parentDir = project.getFilePath().getParent(); 
if (!Files.exists(parentDir)) 
    Files.createDirectories(parentDir); 
+1

Perché il controllo se esiste già? –

+0

@ AlikElzin-kilaka se non lo fai, puoi ottenere un 'FileAlreadyExistsException' –

+1

Se viene usato' getParent() ',' FileAlreadyExistsException' non verrà mai lanciato. Il genitore è sempre una directory. Dalla documentazione: "FileAlreadyExistsException - se dir esiste ma non è una directory" –

1

Il file sarà scritto se si utilizza il parametro OpenOptions predefinite. Se si specifica CREATE, i parametri predefiniti non verranno utilizzati, ma verranno utilizzati solo CREATE. Prova ad aggiungere WRITE oltre a CREATE, o lascia semplicemente quel parametro vuoto

+4

errato. 'Files.write' aggiungerà' WRITE' indipendentemente dalle opzioni fornite. si veda la fonte 'java.nio.file.spi.FileSystemProvider.newOutputStream' – lyomi

+1

Ha funzionato per me! Mi dispiace per averti dato un segno negativo. – Desik