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 adresemFAIL_READ
; - Linux x86_64, Oracle JDK 1.7.0_72:
IOException (is a directory)
oFAIL_READ
; - Mac OS X x86_64, Oracle JDK 1.8.0_25:
IOException (is a directory)
oFAIL_READ
; - Windows 7, Oracle JDK 1.8.0_25:
AccessDeniedException
pod numeremFAIL_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 ...
Tworzenie nowego 'FileInputStream' wydaje się bezpośrednio (próbowałem tylko na mac), aby złapać fakt, że jest to katalog od razu. –
@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
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. –