2014-12-06 9 views
9

NOTA: eseguire il codice esatto di seguito; nessun adattamenti di esso, in particolare, non usare File, come questo bug è legato alla nuova java.nio.file APIFiles.newInputStream() comportamento irrilevante quando il percorso di destinazione è una directory?

OK, questo non è davvero una "questione che ha bisogno di una risposta", ma piuttosto un invito a presentare testimoni ...

Scenario:

  • hanno una directory sul sistema operativo, qualunque essa sia, che sai di avere i privilegi di accesso - nel gergo Unix, di avere almeno l'accesso in lettura ad esso (il che significa che puoi elencare le voci in esso); nel codice qui sotto, si suppone che il percorso rappresentato da System.getProperty("java.io.tmpdir") corrisponda al conto;
  • hanno un Oracle JDK o OpenJDK, 7+ installato; in modo da avere a disposizione java.nio.file.

Ora, il codice riportato di seguito è piuttosto semplice: prova a open a new InputStream on this directory using Files.newInputStream(). Codice (disponibile anche here; aggiunto commenti mio):

import java.io.IOException; 
import java.io.InputStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

public final class Main 
{ 
    public static void main(final String... args) 
     throws IOException 
    { 
     final Path path = Paths.get(System.getProperty("java.io.tmpdir")); 
     try (
      final InputStream in = Files.newInputStream(path); // FAIL_OPEN 
     ) { 
      final byte[] buf = new byte[1024]; 
      int bytesRead; 
      while ((bytesRead = in.read(buf)) != -1) // FAIL_READ 
       System.out.printf("%d bytes read\n", bytesRead); 
     } 
    } 
} 

OK, ora quando si esegue il codice, questo è ciò che accade per le seguenti combinazioni di JRE/OS:

  • Linux x86_64, Oracle JDK 1.8.0_25: IOException (is a directory) allo FAIL_READ;
  • Linux x86_64, Oracle JDK 1.7.0_72: IOException (is a directory) allo FAIL_READ;
  • Mac OS X x86_64, Oracle JDK 1.8.0_25: IOException (is a directory) allo FAIL_READ;
  • Windows 7, Oracle JDK 1.8.0_25: AccessDeniedException allo FAIL_OPEN (!!).

Onestamente, non so cosa fare con quel pezzo di codice. Come ho detto nell'introduzione, sto cercando testimoni qui. Sicuramente aprirò un bug a OpenJDK a riguardo, sembra abbastanza serio. Ho anche inviato la mailing list di nio-dev su questo problema.

Beh, per una domanda ne avrei una: che ne è di un IsDirectoryException nel JDK (che eredita FileSystemException)? L'ho effettivamente definito in one of my projects per tenere conto di questo problema. Non sono sicuro perché questo problema non è stato considerato dai "ragazzi Java" ...

+0

Creazione di un nuovo 'FileInputStream' sembra direttamente (ho solo provato su mac) per prendere atto del fatto che si tratta di una directory subito. –

+0

@SotiriosDelimanolis questo sembra contraddire l'altra testimonianza che ho su Mac OS X; cura di condividere l'esatta origine e la traccia dello stack (in particolare, la linea in cui si dice che il percorso "è una directory")? – fge

+0

Just 'Final InputStream in = new FileInputStream (path.toFile())' produce 'Exception in thread" main "java.io.FileNotFoundException:/var/folders/7z/ndxp48z14636frp1_rrr8x_8002l2v/T (È una directory) '. Ci scusiamo per il codice nei commenti. –

risposta

1

Le mie osservazioni (sorry, no altri sistemi in tutto qui atm, in seguito mi permetto di aggiungere ARM):

  • JDK 1.8 .0_25, Linux x86_64: java.io.IOException: Is a directory allo // FAIL_READ.

Sono d'accordo che questo comportamento è inaspettato, non dovrebbe essere possibile creare un InputStream da una directory in primo luogo. Ti suggerisco di archiviarlo come un bug. Anche se Files.newInputStream non lo indica esplicitamente, il comportamento è incoerente con il resto dell'API.

+0

" Ti suggerisco di archiviare questo come un bug "<- beh, sono nella mailing list di nio-dev OpenJDK e ho riportato questo messaggio; c'è un patchset che è pronto per andare ma non so quando lo farà comunque. – fge