2013-01-10 13 views
23

Files.write() yöntemini kullanarak bir dosyaya metin yazmayı deniyorum.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; 
} 

API'ye göre, dosya yoksa, oluşturulacak ve yazılacak. Kaçırdığım bir şey

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) 

Am:

Ancak, bu olsun?

+7

"C: \ Users \ Administrator \ Desktop \ work" dizini var mı? (ve neden yönetici olarak geliştiriyorsunuz?) – fge

+5

Klasör eksik mi? –

+1

file.getParentFile(). Mkdirs() öğesini kullanın; –

cevap

35

Dosya oluşturabilmeniz gerekir, ancak bir dizin oluşturamazsınız. İlk önce C:\Users\Administrator\Desktop\work dizini kontrol etmeniz gerekebilir.

Varsayılan OpenOptions parametresi kullanılırsa

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

Neden zaten varsa, kontrol edin? –

+0

@ AlikElzin-kilaka yoksa, bir 'FileAlreadyExistsException 'alabilirsiniz –

+1

' getParent() 'kullanılırsa,' FileAlreadyExistsException' asla atılmaz. Ebeveyn her zaman bir dizindir. Belgelerden: "FileAlreadyExistsException - dir varsa ancak bir dizin değil" –

1

dosya yazılır yapabilirsiniz. CREATE değerini belirtirseniz, varsayılan parametreler kullanılmayacaktır, ancak yalnızca CREATE kullanılır. CREATE ek olarak WRITE eklemeye çalışın ya da sadece bu parametre boş bırakın

+4

yanlış. 'Files.write' verilen seçeneklerden bağımsız olarak 'WRITE 'ekleyecektir. java.nio.file.spi.FileSystemProvider.newOutputStream' kaynağına bakın – lyomi

+1

Benim için çalıştı! Sana bir eksi verdiğim için üzgünüm. – Desik