2014-12-06 14 views
9

UWAGA: Proszę podać dokładny kod poniżej; żadne adaptacje to, w szczególności, nie należy używać File, jak ten błąd jest związany z nowym java.nio.file APIFiles.newInputStream() nieistotne zachowanie, gdy docelowa ścieżka jest katalogiem?

Ok, to nie jest to „kwestia, która jest w potrzebie odpowiedź”, lecz raczej wezwanie do świadków ...

Scenariusz:

  • mieć katalog na OS, cokolwiek to jest, co wiesz, że masz uprawnienia do dostępu - w żargonie Unix, trzeba przeczytać przynajmniej dostęp do niego (co oznacza, że ​​możesz wyświetlić listę wpisów w nim); w poniższym kodzie zakłada się, że ścieżka reprezentowana przez System.getProperty("java.io.tmpdir") pasuje do rachunku;
  • mają Oracle JDK lub OpenJDK, 7+ zainstalowane; abyś miał do swojej dyspozycji java.nio.file.

Teraz poniższy kod jest dość prosty: próbuje uzyskać open a new InputStream on this directory using Files.newInputStream(). Kod (dostępne także here; dodawane komentarze moje):

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, teraz po uruchomieniu tego kodu, to co dzieje się w następujących kombinacjach JRE/OS:

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

Szczerze mówiąc, nie wiem, co zrobić z tym kodem. Jak już powiedziałem we wstępie, szukam tutaj świadków. Z pewnością otworzę błąd dotyczący OpenJDK na ten temat, wydaje się dość poważny. Wysłałem również listę mailingową nio-dev o tym problemie.

Cóż, jeśli chodzi o pytanie, które będę mieć: co z IsDirectoryException w JDK (dziedziczenie FileSystemException)? Tak naprawdę zdefiniowałem to w one of my projects, aby uwzględnić taki problem. Nie jestem pewien, dlaczego ten problem nie został uznany przez „Java” facetów ...

+0

Tworzenie nowego 'FileInputStream' wydaje się bezpośrednio (próbowałem tylko na mac), aby złapać fakt, że jest to katalog od razu. –

+0

@SotiriosDelimanoljest to sprzeczne z innym świadectwem, które mam na temat Mac OS X; czy chcesz udostępnić dokładny ślad źródła i stosu (w szczególności wiersz, w którym jest napisane, że ścieżka "jest katalogiem")? – fge

+0

Po prostu 'final InputStream in = new FileInputStream (path.toFile())' tworzy 'wyjątek w wątku" main "java.io.FileNotFoundException:/var/folders/7z/ndxp48z14636frp1_rrr8x_8002l2v/T (jest katalogiem) '. Przepraszamy za kod w komentarzach. –

Odpowiedz

1

moich obserwacji (przepraszam, nie ma innych systemów tu bankomat, później dodam ARM):

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

Zgadzam się, że to zachowanie jest nieoczekiwane, nie powinno być możliwe utworzenie InputStream z katalogu w pierwszej kolejności. Proponuję, aby zgłosić to jako błąd. Nawet jeśli Files.newInputStream nie określa go jawnie, zachowanie jest niespójne z resztą interfejsu API.

+0

"Sugeruję, abyś zgłosił to jako błąd" <- cóż, jestem na liście dyskusyjnej nio-dev OpenJDK i tam to zgłosiłem; istnieje zestaw poprawek, który jest gotowy do użycia, ale nie wiem, kiedy to się uda. – fge