2011-02-07 12 views
25
FileInputStream in = new FileInputStream(myFile); 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 

Pytanie: Jak mogę odczytać wszystko z in na out w sposób, który nie jest ręcznie robioną pętlą z własnym buforem bajtowym?Jak odczytać jeden strumień do drugiego?

+0

możliwe duplikat [łatwy sposób napisać zawartość Java InputStream do OutputStream] (http://stackoverflow.com/questions/43157/easy-way-to-write-contents-of-a-java-inputstream-to-an-outputstream) – rds

Odpowiedz

30

Napisz jedną z metod, aby to zrobić, i wywołaj ją z każdego miejsca, które potrzebuje funkcjonalności. Guava ma już kod do tego, w ByteStreams.copy. Jestem pewny, że każda inna biblioteka z "ogólną" funkcjonalnością IO również to ma, ale Guava to moja pierwsza "do-go" biblioteka, gdzie to możliwe. Skały :)

+0

"ByteStreams" jest opisane jako "@ Beta" to nie problem? – gabuzo

+2

@guabo: To zależy od tego, jak bardzo jesteś przeciwny ryzyku. Podejrzewam, że jest bardzo mało prawdopodobne, aby ta metoda zmieniła się i jestem pewien, że wdrożenie jest w porządku. –

+1

Nawet jeśli ulegnie zmianie lub zniknie, istnieje ryzyko, że będziesz musiał go naprawić w przypadku aktualizacji. Metoda jest prosta, a kod źródłowy dostępny (nawet jako repozytorium subversion). – maaartinus

2

Alternatywnie do Guava można użyć Apache Commons IO (stary) i Apache Commons IOUtils (nowy, jak zalecono w komentarzu).

+2

* Przestarzałe. Użyj IOUtils. Zostaną usunięte w wersji 2.0. Metody zmienione na IOUtils.write() lub IOUtils.copy() * –

+0

@Sean Patrick Floyd Thanx - zaktualizowały odpowiedź. – 01es

0

użyję pętlę, zamiast importować nowy klasy lub dodawanie bibliotek do mojego projektu. Funkcja biblioteczna prawdopodobnie jest również zaimplementowana z pętlą. Ale to tylko mój osobisty gust.

Jednakże, moje pytanie: co próbujesz zrobić? Pomyśl o "dużym obrazie", jeśli chcesz umieścić całą zawartość pliku w tablicy bajtów, dlaczego nie po prostu to zrobić? Rozmiar tablicy to file.length(), a nie potrzebujesz jej dynamicznie rosnąć, ukryty za ByteArrayOutputStream (chyba że twój plik jest udostępniony, a jego zawartość może się zmieniać podczas czytania).

Inna alternatywa: czy można użyć FileChannel i ByteBuffer (java.nio)?

11

Więc co guawy za ByteStreams.copy (in, out) robi:

private static final int BUF_SIZE = 0x1000; // 4K 

    public static long copy(InputStream from, OutputStream to) 
     throws IOException { 
    checkNotNull(from); 
    checkNotNull(to); 
    byte[] buf = new byte[BUF_SIZE]; 
    long total = 0; 
    while (true) { 
     int r = from.read(buf); 
     if (r == -1) { 
     break; 
     } 
     to.write(buf, 0, r); 
     total += r; 
    } 
    return total; 
    } 
+0

zobacz także http://stackoverflow.com/a/22646404/1497139 –

2

W moim projekcie użyłem tej metody:

private static void copyData(InputStream in, OutputStream out) throws Exception { 
    byte[] buffer = new byte[8 * 1024]; 
    int len; 
    while ((len = in.read(buffer)) > 0) { 
     out.write(buffer, 0, len); 
    } 
} 
+1

Może to być pomocne dla innych, jeśli wyjaśnisz, dlaczego Twój kod jest inny i jak naprawia problem. –

+0

Masz rację. Edytowałem swoją odpowiedź. – Sergey

+0

Zwięzły kod i nieużywanie bibliotek. –

Powiązane problemy