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)
alloFAIL_READ
; - Linux x86_64, Oracle JDK 1.7.0_72:
IOException (is a directory)
alloFAIL_READ
; - Mac OS X x86_64, Oracle JDK 1.8.0_25:
IOException (is a directory)
alloFAIL_READ
; - Windows 7, Oracle JDK 1.8.0_25:
AccessDeniedException
alloFAIL_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" ...
Creazione di un nuovo 'FileInputStream' sembra direttamente (ho solo provato su mac) per prendere atto del fatto che si tratta di una directory subito. –
@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
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. –