Estou com um problema tenho que fazer uma leitura e para parar a leitura deve-se digitar ##, mas quando digito ## realmente sai da leitura, mas aí para continuar lendo os próximos comandos eu tenho que teclar enter para ir para o próximo comando.
Mas o que eu quero é que assim que encontar ## saia da função e continue o código. Se alguém tiver alguma idéia.
package TrabalhoTP;
import java.io.*;
import java.util.Scanner;
public class Prog {
File arquivo;
public String lerTexto() {
String texto = "";
char letra;
try {
// ler caracteres até encontrar ## e sair do laço
while (!texto.endsWith("##")) {
letra = (char) System.in.read();
texto = texto + letra;
}
// remove o ## do final do texto
texto = texto.substring(0, texto.length() - 2);
} catch (Exception e) {
e.printStackTrace();
}
return texto;
}
...
Eu acho a classe Scanner difícil de usar, devido a esse problema de ela não saber quando parar se você não souber o que está fazendo.
Eu sou particuilarmente preguiçoso e costumo ler linha a linha (com readLine() da classe BufferedReader) e então submeter as linhas lidas para aquele construtor da classe Scanner que recebe uma string como parâmetro. Mas isso é questão de gosto pessoal
Tem como postar um exemplo do arquivo de entrada, só para eu dar um exemplo de como você estruturaria seu programa?
Eu criei um menu simples para exibir no console e quando a pessoa digita 1
ele chama a função lerTexto que executa letra = (char) System.in.read(); de todos os caracteres e concatena em uma string porque senão eu não teria como parar quando digitar ## eu acho.
A entrada pode ser qualquer frase ou texto desde que termine em ##
o negócio está funcionando só que além de digitar ## eu tenho pressionar enter também.
Segredinho: o Java não consegue ler caracteres digitados no console à medida que você vai digitando.
Ele só recebe os caracteres digitados depois que você digita ENTER.
Ele faz isso porque as rotinas que lêem do console foram designadas para rodar em qualquer sistema operacional suportado (incluindo Linux, Windows e MacOSX).
O problema é que as rotinas são tão genéricas que não existe nem um modo de o programa saber se a leitura está sendo feita através do console (teclado) ou através de um redirecionamento de um arquivo (ou seja, não existe uma rotina como “isatty” que existe no Linux ou “_isatty” no Windows, que permite determinar exatamente isso).
Se você precisa, por algum motivo, dessa funcionalidade, você precisa usar uma biblioteca que usa a ligação direta com o sistema operacional, como a Charva ( http://www.pitman.co.za/projects/charva/index.html ) . O problema de usar uma biblioteca dessas é que você precisa disponibilizar código nativo (.DLL ou .SO), o que é sempre dor de cabeça.
Muito obrigado sobre o exclarecimento, eu realmente já sabia que o java era pobre quando o assunto é trabalhar com o console, mas pensei que talvez ele tivesse algo parecido com o C++, mas se não tem mesmo vou ter me contentar com apenas com apertar enter. muito obrigado pela resposta rápida.
A rigor o C++ não tem isso também na biblioteca-padrão do C++. (Note que você normalmente tem de usar algo com o nome “getch” ou “getche”, que são rotinas que não fazem parte da biblioteca padrão - não estão em ou ).
Só que o C tem acesso direto às APIs do sistema operacional, e o Java, justamente para poder rodar sem problemas em vários sistemas operacionais, não lhe dá esse acesso direto de propósito.