Przekierowanie InputStream na OutputStream

0

Witam,
Mam pytanie:
chciałbym przekierować InputStream(strumień wejściowy jaki dostaję z kodu:

URL www = new URL("http://www.interia.pl");
    URLConnection connection = www.openConnection (); 
 InputStream in = connection.getInputStream(); 
 	BufferedReader br;  
   br = new BufferedReader( new InputStreamReader(in) );

) do OutputStream,który wysyłam do przeglądarki na określonym porcie(w moim przypadku

OutputStream out = socket.getOutputStream();
out.write();

).

Jak to zrobić? Bo chciałbym zrobić serwer pośredniczący,który będzie działał na określonym porcie(jakby proxy serwer).Serwer będzie miał za zadanie pobrać adres strony z przeglądarki,wczytać do bufora zawartość strony,sprawdzić - po konwersji do Stringa - czy występuje na tej stronie określony ciąg znaków, jeśli nie ma takich ciągów-przesłać strumień na wyjście na socket, czyli na przeglądarkę ) . Na razie skupiam się na przesłaniu strumienia wejściowego z URL na socket. Czyli na razie serwer pośredniczący,bez żadnych modyfikacji. Z tego ,co rozumiem, w InputStream in = connection.getInputStream(); mam zapisany/przechowywany cały strumień/zawartość odpowiedzi z serwera. Jeśli się mylę,to chętnie wysłucham rad i propozycji. Dzięki :-) Na razie mam [glowa] zastój umysłowy i nie wiem jak to przeskoczyć,czy w ogóle jest jakaś metoda

0

Jak chcesz odczytać co na tej stronie jest, to nie możesz po tym przekierować inputu na output, bo właśnie wyczerpałeś input - czytając go...
To co przeczytasz jako bajty musisz wysłać do outputu później...

0

A czy mam go w tym buforze(zawartość strony)?

BufferedReader br; 
   br = new BufferedReader( new InputStreamReader(in));

A jeśli nie,to jak to zrobić,żeby wysłać jako bajty do outputu?

0

W Javie są dwa podejścia do czytania/pisania:
-oparte na bajtach - do tego służą klasy Input/Output Stream
-oparte na napisach - do tego służą klasy Reader/Writer

Ty mieszasz te dwa rozwiązania.

Jeżeli chcesz przetwarzać dane jako ciąg bajtów, to nie używaj InputStreamReader'a. Bezpośrednio z InputStream wczytuj dane za pomocą read(). Tak wczytane bajty (trzeba zrzutować int na bajt) możesz przekazywać do OutputStream za pomocą metody write. Możesz dodatkowo użyć klas BufferedInputStream i BufferedOutputStream.

W drugim rozwiązaniu użyj InputStreamReader i BufferedReader, wczytuj po linii za pomocą readLine() i wpisuj do wyjścia opakowanego w klasę OutputStreamWriter (możesz dodatkowo użyć BufferedWriter).

0

#_krzysiek85 Czy możesz to rozwinąć,bo boję się,że się zamotam w strumieniach i sam nie będę wiedział,który do którego przepisać. W wersji z InputstreamReader i BufferedReader`em?
Wielkie Dzięki za pomoc.:)

0

Jeżeli chcesz przetwarzać jako tekst, to możesz zrobić coś takiego: pisane bez kompilatora, więc może mieć błędy)

URL www = new URL("http://www.interia.pl");
URLConnection connection = www.openConnection ();
BufferedReader br  = new BufferedReader( new InputStreamReader(connection.getInputStream()) );
Writer writer = OutputStreamWriter(connection.getOutputStream());

String line;
while ((line = br.readLine()) != null){
    //tu coś robisz z line
   writer.write(line);
}
0
__krzysiek85 napisał(a)

Jeżeli chcesz przetwarzać jako tekst, to możesz zrobić coś takiego: pisane bez kompilatora, więc może mieć błędy)

URL www = new URL("http://www.interia.pl");
URLConnection connection = www.openConnection ();
BufferedReader br  = new BufferedReader( new InputStreamReader(connection.getInputStream()) );
Writer writer = OutputStreamWriter(connection.getOutputStream());

String line;
while ((line = br.readLine()) != null){
    //tu coś robisz z line
   writer.write(line);
}

Ok, a jak jeśli chciałbym tylko "żonglować " strumieniami?Czyli bez obróbki tekstu.

_krzysiek85 napisał(a)

Tak wczytane bajty (trzeba zrzutować int na bajt) możesz przekazywać do OutputStream za pomocą metody write. Możesz dodatkowo użyć klas BufferedInputStream i BufferedOutputStream.

1 użytkowników online, w tym zalogowanych: 0, gości: 1