Mam następujący kod:
BlobDomain blobDomain = null;
OutputStream out = null;
try {
blobDomain = new BlobDomain();
out = blobDomain.getBinaryOutputStream();
byte[] buffer = new byte[8192];
int bytesRead = 0;
while ((bytesRead = in.read(buffer, 0, 8192)) != -1) {
out.write(buffer, 0, bytesRead);
String line = (new String(buffer));
fullText += line;
}
} catch (Exception e) {}finally{ if (out != null)
try {
out.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}}
kiedy drukuję pełny tekst, widzę większyoznacza, że końcowa część tekstu jest ponownie dodawana do pełnego tekstu. Tak więc pełny tekst ma kilka linii powtórzonych na końcu. jakieś sugestie na temat tego, co jest tutaj nie tak?
Odpowiedzi:
1 dla odpowiedzi № 1Powodem tego jest to, że tyzapisują cały bufor za każdym razem do Twojego ciągu. Zatem po osiągnięciu końca pliku możesz nie odczytać dokładnie takiej liczby bajtów, o jakiej rozmiar ma bufor. Stare dane nadal znajdują się w buforze i zostaną również zapisane w łańcuchu.
Jedną z opcji rozwiązania tego może być zapisanie danych najpierw w ciągu znaków, a następnie w ciągu wyjściowym. Powinno to również być szybsze niż dodawanie do ciągu po każdym czytaniu.
Zapisz inputStream w String:
java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\A");
fullText = s.hasNext() ? s.next() : "";
Napisz ciąg do strumienia wyjściowego:
out.write(fullText.getBytes());
Jeśli chcesz zachować kod w obecnej postaci, wykonaj podciąg w buforze i pobierz tylko odczytaną liczbę bajtów. Na przykład:
String line = (new String(buffer.substring(0,bytesRead));