View Full Version : Java: errore in scrittura su disco.
cyberziz
25-11-2006, 11:03
Ciao a tutti, ho un problema piuttosto curioso. Questo è il mio codice:
public static void main(String[] args) {
String content = "contenuto del file";
String path = "C:\\prova.txt";
File file = new File(path);
try {
FileWriter writer = new FileWriter(file);
writer.write(content);
writer.close();
}
catch (IOException ex) {
ex.printStackTrace();
}
}
Presupponendo che esista il drive C: :D, non riesco a capire come possa essere possibile che esca il seguente output:
java.io.FileNotFoundException: C:\prova.txt (Impossibile trovare il percorso specificato)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
at java.io.FileWriter.<init>(FileWriter.java:73)
at memory.Untitled1.main(Untitled1.java:21)
Qualcuno ha qualche idea, o si è mai trovato ad affrontare un problema analogo? Grazie in anticipo dell'aiuto!
Andrea16v
25-11-2006, 11:07
Il file prova.txt non esiste, prima di scriverci sopra penso tu debba crearlo.. :)
Presupponendo che esista il drive C: :D, non riesco a capire come possa essere possibile che esca il seguente output:
[COLOR=DarkRed][SIZE=2][FONT=Courier New]java.io.FileNotFoundException: C:\prova.txt (Impossibile trovare il percorso specificato)Uhm .. strano. Il codice è corretto. Qui da me (Win2000) ho provato e funziona senza problemi, garantisco! Hai provato a scrivere in qualche altro path?? Prova a vedere se ci sono dei permessi particolari per scrivere in C:\. Prova ad esempio con notepad a scrivere lì un file di testo.
cyberziz
25-11-2006, 11:21
@ Andrea: ho provato a creare prima il file, utilizzando il metodo createNewFile, ma tutto quello che ottengo è un'altra IOException dello stesso tipo! Incredibile...
@ andbin: grazie per aver provato, prima di tutto; poi, ho pensato anch'io alla possibilità di permessi negati...però è il mio pc di casa, con il mio solo utente a livello amministratore, quindi ho permessi per scrivere dappertutto. Ah, il codice lo eseguo da JBuilder, forse che la jvm abbia qualche impostazione che vieta la scrittura??
createNewFile genera un'eccezione nel caso in cui si verifichi un errore durante il tentativo di creazione e dovrebbe produrre la stessa eccezione derivante da un tentativo di scrittura su un file che non può essere creato.
FileWriter tenta di creare il file nel caso in cui non ci sia.
Se il problema fosse dovuto a dei permessi di scrittura mancanti, l'eccezione restituita non dovrebbe dire "The system cannot find the path specified" ma "Access denied".
Il problema che riscontri è dovuto al fatto che la piattaforma non riconosce "c" come una radice del filesystem. Non vuol dire che "c" non ci sia: solo la piattaforma java non lo vede.
Prova a stampare un elenco delle radici del filesystem e vedi un po' cosa "vede" la tua tazza di caffè.
import java.io.*;
public class Main {
public static void main(String[] args) {
File[] roots = File.listRoots();
for(File f : roots) {
System.out.println(f);
}
}
}
C'è c:\ ?
cyberziz
25-11-2006, 15:05
@ PGI-Bis: il tuo ragionamento non fa una piega, effettivamente. L'eccezione genera il messaggio "Impossibile trovare il percorso specificato", il che dovrebbe essere inequivocabile...però eseguendo il tuo programmino, l'output prodotto è il seguente:
C:\
D:\
E:\
F:\
G:\
J:\
...ma la cosa ancora più allucinante, è che provando ad eseguire queste sole linee...
String path = "c:/prova";
File folder = new File(path);
folder.mkdir();
la cartella "prova" viene correttamente creata in c:\!! Il mistero si infittisce...
Sforiamo nella magia nera qui :D.
Adesso dico una cosa che non sta nè in cielo nè in terra, ma visto che siamo alle strette...
Nel codice che hai incollato inizialmente il percorso era:
"C:\\prova.txt"
con la C maiuscola.
Il tuo test successivo dice che trova la cartella:
"c:/prova"
con la c minuscola. Se cambi il nome del file da:
"C:\\prova.txt"
a
"c:\\prova.txt"
che succede?
Potrebbe essere un problema di codifica del codice sorgente? Una cosa bizzarrissima: la lettera "c" che appare come una c nel sorgente e appare come una c nell'output su console (prova con un System.out.println(file.getPath()) in realtà non è una C! :D
Avrebbe un senso: se provate a scrivere un file usando una root inesistente capiterà proprio l'eccezione "Impossibile trovare il file specificato".
Certo è una cosa inquietante :eek:
Resta il fatto che da me il codice di cyberziz funziona benissimo.
@cyberziz: hai provato a scrivere in un altro path es. "C:\\TEMP\\prova.txt" (ovviamente la cartella ci deve essere)?? Quale versione di java usi (fai java -version)?? Hai provato a compilare/avviare il programmino al di fuori di JBuilder?
Resta il fatto che da me il codice di cyberziz funziona benissimo.
Anche a me. D'altronde il codice che ha scritto mi pare ineccepibile. Non dovrebbe esserci differenza tra c e C perchè in windows i percorsi non sono sensibili alla capitalizzazione (credo).
cyberziz
25-11-2006, 17:37
...ora funziona anche a me! :doh:
Dunque il mio problema partiva da tutt'altro punto: una servlet doveva salvare dei file uploadati con una richiesta http. Provando a creare un percorso attualmente inesistente, si generava l'eccezione. Così ho creato quel piccolo programma di cui sopra per capire il motivo dell'errore. Quando ho postato il codice, non ho badato se il percorso contenesse o meno cartelle, non lo consideravo un problema...in pratica non avevo provato mai con C:\file, finché non ho provato i vostri suggerimenti esattamente come li avete postati!! Avevo sempre una cartella di mezzo, che era inesistente: pensavo che FileOutputStream o FileWriter facessero tutti i controlli del caso, e creassero il percorso fino al file, se inesistente...invece l'operazione deve essere eseguita a mano con mkdirs()...ad ogni modo senza i vostri suggerimenti non ci avrei mai pensato! Quindi vi ringrazio e mi scuso per il tempo che vi ho fatto perdere...:cry:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.