Przerwanie read() po naciśnięciu <Enter>

0

Witam!

Chciałbym napisać kod, który przy wykorzystaniu metody read() z klasy InputStreamReader
przeczyta mi wszystkie wpisane znaki i przerwie czytanie po kliknięciu Enter.

Jeżeli zrobie to bez pętli w taki sposób:

InputStreamReader inp = new InputStreamReader(System.in); 
  System.out.println("Podaj:");
  System.out.println((char)inp.read());
  System.out.println("Koniec");

To oczywiście przeczyta tylko pierwszy znak.

A jeżeli zrobię to w takiej pętli :

InputStreamReader inp = new InputStreamReader(System.in); 
  System.out.println("Podaj:");
  int znak=0;
  while((znak = inp.read()) != -1){
  System.out.println((char)znak);
}
  System.out.println("Koniec");

To faktycznie czyta wszystkie znaki, ale pętla się nie kończy.

Jak zrobić, żeby analizował tylko jedną linijkę i na tym kończył?

Mam z tym problem zarówno w InputStreamReader (read), BufferedReader (readLine), StreamTokenizer i Scanner. Nigdzie nie mogę stworzyć takiego warunku, by po klawiszu <Enter> kończyło się zczytywanie danych.

0

Nie ogarniam. Nie możesz zrobić jednego readLine a potem zakończyć? (bo właśnie na znaku nowej linii readLine się zatrzyma...)

0

No ale readLine przeczyta mi całą linie jako całość. A ja np. chce sobie znaki upchać do tablicy.

Podobny problem mam z Scanner'em. Chce np. żeby po wpisaniu ciągu znaków : "tekst 1 lol 2 4" do tablicy trafiły tylko liczby (czyli 1 2 4). Robię sobie:

  InputStreamReader inp = new InputStreamReader(System.in);
  BufferedReader br = new BufferedReader(inp);
  Scanner sc = new Scanner(br);
  while(!sc.hasNextInt()) {
      sc.next();
    }
  //Array lista jest już gdzieś tam stworzona
  lista.add(sc.nextInt()); 

To przy powyższym ciągu znaków do listy trafi tylko "1".

Jeżeli zrobię tak.

   InputStreamReader inp = new InputStreamReader(System.in);
  BufferedReader br = new BufferedReader(inp);
  Scanner sc = new Scanner(br);
  while(sc.hasNext()) {
  while(!sc.hasNextInt()) {
      sc.next();
    }
  //Array lista jest już gdzieś tam stworzona
  lista.add(sc.nextInt());
}

To pętla się nigdy nie zatrzyma.

Jak zrobić, żeby przeanalizował całą linijkę i koniec?

0

No ale readLine przeczyta mi całą linie jako całość. A ja np. chce sobie znaki upchać do tablicy.

Zamiast sprawdzić w jaki sposób zamienić string na tablicę charów to kombinujesz jak koń pod górę.

0

Rozumiem że twoja Java jest w wersji demo i nie ma metody toCharArray() w klasie String? o_O

0

Nie kombinuje, tylko uczę się na kolokwium :) . Myślałem, że istnieje jakiś banalny sposób przerwania pętli przy końcu linii i tyle.
Nie rozumiem w takim razie po co porównywać w StreamTokenizerze do wartości TT_EOL (End of line), skoro kiedy kończę linię Enterem to nie działa.
No i w ogóle po co w takim razie posługiwać się przy analizie ciągów znaków Tokenizerem i Scannerem, skoro prościej "zamienić string na tablicę charów"?

1
  1. To ty chciałeś tą tablicę znaków, nie wiadomo po co.
  2. Jeśli chcesz zakończyć wpisywanie znaków z klawiatury w konsoli, użyj CTRL+D.
  3. Jeśli chcesz przerwać po Enterze to wczytuj do Entera, a nie do -1 czyli znaku końca wejścia.
  4. StringTokenizer przyjmuje także Stringa, nie tylko Readera. Możesz podać mu w konstruktorze wynik readLine().
0

@Shalom : Nie rozumiem pytania.

Dobra, napiszę inaczej, na jakimś konkretnym przykładzie, mniej abstrakcyjnym.

Chce stworzyć program, który umożliwi dodanie n liczb.
Nie mam zamiaru robić to w sposób taki, że będę co chwile prosił "Podaj kolejną liczbę", tylko zakładam, że użytkownik poda wyrażenie w formie "x1 + x2 + x3 + ... + xn".
Zakładam też, że może wpaść na to, żeby wstawić gdzieś nawiasy (wszystko oddzieli spacją, żeby uprościć problem). Nawiasy można oczywiście pominąć, bo w dodawaniu nie robią żadnej różnicy. Innymi słowy chce z tego ciągu znaków wyłowić liczby, dodać je do siebie i zwrócić wynik.

Przykładowe dane wejściowe : "4 + 2 + ( 6 + 8 ) + 3"

Pewnie można jakoś rozbijać String itd., ale moje pytanie brzmi : Czy można to zrobić korzystając z klasy Scannner, bądź StreamTokenizer?
Tak, żeby sprawdzać, czy kolejna wartość jest liczbą ( TT_NUMBER / hasNextInt ), jeżeli tak to dodawać ją do jakiejś zmiennej ( nval / nextInt ) , jeżeli nie to brać następną ( nextToken / next ) i tak AŻ DO KOŃCA lini.

EDIT:

Ok. Taka konstrukcja załatwiła sprawę :

InputStreamReader inp = new InputStreamReader(System.in);
  BufferedReader br = new BufferedReader(inp);
  System.out.println("Podaj:");
  String linia = br.readLine();
  Scanner sc = new Scanner(linia);
  

Nie wiedziałem po prostu, że argumentem w konstruktorze scannera może być String i zawsze dawałem tam BufferedReader.
Przepraszam, za zmieszanie i dziękuje za pomoc :)

Pozdrawiam.

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