2011-01-21 15 views
15

Używam następujący kod do ustanowienia połączenia HTTP i odczytu danych:powrotu karetki i nowa linia z Java i readline()

con = (HttpURLConnection) new URL("http://stream.twitter.com/1/statuses/sample.json").openConnection(); 
... 
con.connect(); 
while (line = rd.readLine()) { 
    if (line.contains("\r\n")) { 
     System.out.println("Carriage return + new line"); 
    } 
} 

Jednak wydaje się, że „\ r \ n” nie jest częścią ciągu (line), mimo że serwer zwraca je. Jak mogę odczytać dane i wykryć "\ r \ n"?

Dzięki,

Joel

+3

'while (line = rd.readLine())' nawet nie skompiluje. Co to jest typ 'rd' i jak go zdobyć? – aioobe

+1

Zakładam, że używasz 'BufferedReader' z' rd', gdy czytasz z 'readLine()', '\ n' i' \ r' znaki zostaną obcięte z wyniku, nie zobaczysz ich jeśli użyjesz tego metoda. Powinieneś rozważyć użycie 'read()'. –

Odpowiedz

29

Jeśli rd jest typu BufferedReader nie ma sposobu, aby dowiedzieć się, czy readLine() powrócił coś który zakończył się \n, \r lub \r\n ... The end-of-line znaków są odrzucane i nie stanowią części zwracanego ciągu.

Jeśli naprawdę zależy Ci na tych postaciach, nie możesz przejść przez readLine(). Będziesz musiał na przykład odczytać znaki jedna po drugiej do read().

+1

Nie powinien się przejmować. Powinien tam być, ale lepiej działa z dowolnym zakończeniem linii. Tak więc biorąc pod uwagę wszystko, co zwrócone przez bufferedReader.readLine jako linia, jest drogą do wykonania, IMHO. – maaartinus

+33

Nie lubię pytań/komentarzy zaczynających się od "nie powinienem tego przejmować" ... mógł on na przykład siedzieć ze specyfikacją testową, która mówi "poszukaj \ r \ n używa". Jest to mało prawdopodobne, ale chodzi o to, że: * nie wiesz *! – aioobe

+3

Nie ma nic złego w korzystaniu z BufferedReader. Wystarczy użyć metod opartych na znakach zamiast readLine(). –

10

Z javadocs:

public String readLine() throws IOException 

Czytaj wiersz tekstu. Linia jest uważana za zakończoną przez dowolne z linii ("\ n"), powrót karetki ("\ r") lub powrót karetki, po którym następuje natychmiast wiersz.
Powroty:
łańcuch zawierający treść wiersza, nie w tym wszelkich znaków line-zakańczanie lub null, jeśli koniec strumienia został osiągnięty
Zgłasza:
IOException - jeśli błąd I/O występuje

+2

Nic jak kilka sekund w dokumentacji JDK. Które zajęłoby mniej czasu niż op. –

+4

Ale to nie rozwiązuje problemu, w jaki sposób można uzyskać znak kończący znaki w ciągu znaków? – zehelvion

+1

@JaredBeekman Dokumentacja JDK jest dobra, ale nie zawiera wszystkiego. Na przykład z tego opisu nie jest jasne, czy ostatnia pusta linia (jak często widuje się w edytorze tekstu) jest zwracana jako pusty ciąg znaków lub w ogóle nie jest uważana za linię. – industryworker3595112