2013-08-08 42 views
6

Ricevo un'eccezione che dice "il sistema non riesce a trovare il percorso specificato" durante la chiamata alla funzione java createTempFile("test", "test"). Provato su google, ma senza fortuna. Qualcuno sa da dove java ottiene il suo percorso temporaneo predefinito e come può non essere trovato? Le variabili di Windows sembrano corrette e la loro modifica non ha effetto su java.Il sistema non riesce a trovare il percorso mentre createTempFile

+3

Codici prega ... –

+2

controllo che cosa è in String dirName = System.getProperty ("java.io.tmpdir"); E forse prova anche a definire tempDir direttamente con: File.createTempFile (String prefisso, String suffisso, Directory file) – Horuss

+0

File.CreateTempFile ("test", "test") è prettymuch il codice while :) – user1985273

risposta

13

Qualcuno sa da dove java prende il suo percorso temporaneo predefinito

Viene letto dalla proprietà java.io.tmpdir.

Files.createTempFile("test", "test"); 

chiede essenzialmente java.nio.file.TempFileHelper.createTempFile(null, prefix, suffix, attrs); che chiama nuovamente java.nio.file.TempFileHelper.create(dir, prefix, suffix, false, attrs);. Lì, se dir è nullo, è impostato su tmpdir che viene dichiarato come segue:

private static final Path tmpdir = 
    Paths.get(doPrivileged(new GetPropertyAction("java.io.tmpdir"))); 

È possibile impostare la proprietà in modo esplicito, come indicato nella risposta da @Joni. Se non si imposta in modo esplicito, la JVM inizializza a uno specifico valore di default della piattaforma in fase di avvio - vedi anche Environment variable to control java.io.tmpdir?

e come può non essere trovato?

se la proprietà java.io.tmpdir punta a una directory non valida, il file temporaneo non possono essere creati.

7

Indipendentemente da come si ottiene il valore di default, è possibile impostare la directory dei file temporanei impostando la proprietà di sistema java.io.tmpdir quando si avvia la JVM:

java -Djava.io.tmpdir=/path/to/where/ever/you/like YourClass 

Se volete sapere dove il valore di default da cui proviene, dovrai leggere il codice sorgente per la tua JVM. Ad esempio, OpenJDK su Windows chiama la funzione API GetTempPathW (cercare il file java_props_md.c nel codice sorgente JDK), che cerca il percorso in variabili di ambiente e di registro nel seguente modo:

I GetTempPath controlli funzionali per l'esistenza di variabili di ambiente nel seguente ordine e utilizza il primo percorso trovato:

  1. Il percorso specificato dalla variabile di ambiente TMP.
  2. Il percorso specificato dalla variabile di ambiente TEMP.
  3. Il percorso specificato dalla variabile di ambiente USERPROFILE.
  4. La directory di Windows.

Si noti che la funzione non verifica che il percorso esista, né verifica se il processo corrente ha alcun tipo di diritti di accesso al percorso.

+0

Ma se cambio le variabili env di TMP allora java.io.tmpdir stampa ancora in oodatuim pervious? – user1985273

+0

Supponendo "oodatuim" significa directory: forse il tuo programma viene avviato con uno script che ripristina TMP, forse è necessario riavviare il sistema affinché la modifica abbia effetto, forse la tua JVM non usa la funzione GetTempPath, è impossibile sapere con i dati forniti. – Joni

3

Prova:

String path = System.getProperty("java.io.tmpdir"); 

See: get property method

E per aggiungerlo qui per completezza, ci sono anche i metodi createTempFile(String prefix,String suffix) e createTempFile(String prefix, String suffix, File directory) metodi da Java di file classe.

Ecco il mio codice al percorso fin del file temporaneo e trovare il percorso temp:

public class GetTempFilePathExample 
{ 
    public static void main(String[] args) 
    { 

     try{ 

      //create a temp file 
      File temp = File.createTempFile("temp-file-name", ".tmp"); 

      System.out.println("Temp file : " + temp.getAbsolutePath()); 

     //Get tempropary file path 
      String absolutePath = temp.getAbsolutePath(); 
      String tempFilePath = absolutePath. 
       substring(0,absolutePath.lastIndexOf(File.separator)); 

      System.out.println("Temp file path : " + tempFilePath); 

     }catch(IOException e){ 

      e.printStackTrace(); 

     } 

    } 
} 

uscita di questo codice è:

Temp file : /tmp/temp-file-name3697762749201044262.tmp 
Temp file path : /tmp 
Problemi correlati