ENTRADA E SAÍDA DE DADOS PELO TECLADO Entrada e saída de dados no modo texto equivalem a dados digitados e impressos via prompt de comando. A classe System, que pertence ao pacote java.lang, nos permite a entrada e saída de dados padrão. Seus atributos e métodos são usados para realizar diversas operações do sistema. A classe System possui três atributos utilizados para a realização de entrada e saída de dados padrão pelo console. in – atributo da classe System, do tipo InputStream, que permite a entrada de dados via teclado. err – atributo da classe System, do tipo InputStream, que permite a saída de erros via console. out – atributo da classe System, do tipo Input Stream, que permite a saída de dados via console. Esses métodos são estáticos e, portanto, não precisam de uma instância para serem acessados. System.in System.err System.out System.out O atributo out direciona toda a saída de dados para a saída padrão, ou seja. o prompt de comandos. Para isso existem dois métodos que fazem este direcionamento. print() println() A diferença entre os dois métodos é que o método print(), após imprimir os dados permanece na posição seguinte a da última palavra impressa, enquanto o método println(), após a impressão, pula para a primeira posição da linha seguinte a da que foi impressa. Para que o método print() possua uma quebra de linha, basta acrescentar ao final do dado a ser impresso o caractere de escape “\n”. Ex.: System.out.print(“Pula linha\n”); Colocando o “\n” no final da impressão o cursor passará para a próxima linha. Não é necessário utilizar o camando System.out para que os método de saída funcionem. Pode-se criar uma variável de instância/referência do tipo InputStream que exerça essa função. Ex.: InputStream imprime = System.out; Assim, é só substituir System.out por imprime: imprime.println(“Com o objeto imprime”); imprime.println(); System.in O método System.in permite a entrada de dados, via prompt de comando. Ele pertence a classe InputStream e direciona para a entrada padrão do sistema, ou seja, o prompt de comando. O método read() da classe InputStream faz a leitura dos dados digitados. Para receber os dados, é utilizada uma variável de instância do tipo vetor de bytes. O método read() chama a variável do tipo vetor e grava os dados nele. Depois é só transferir o dado para o tipo primitivo. try { byte bt[ ] = new byte[50]; System.in.read(byte); String st = new String(bt).trim(); } catch(IOException erro) { //Tratamento do erro } Como o método read() gera erro no caso de entrada de dados inválidos, é necessário o tratamento destes erros através do bloco try catch(). A primeira linha declara e instancia o vetor do tipo byte. A segunda linha faz a leitura do dado e a gravação no vetor. A terceira linha transfere o dado digitado para o tipo primitivo. Exemplo: import java.io.*; class EntradaRead { public static void main(String args[ ]) { String nome = “ “; int ra = 0; try { byte bt[ ] = new byte[50]; System.out.println(“Informe seu nome: “); System.in.read(bt); nome = new String(bt).trim(); bt = new byte[9]; System.out.println(“Informe seu RA”); System.in.read(bt); String st = new String(bt).trim(); ra = Integer.parseInt(st); } catch(IOException erro) { System.err.println(“Erro de entrada/saída”); System.exit(0); } catch(NumberFormatException erro) { System.err.println(“Matricula inválida!”); System.exit(0); } System.out.prrintln(“Nome : “ + nome); System.out.println(“RA : “ + Ra); } } O método System.exit(0) é utilizado para forçar o encerramento do programa e deve ser utilizado principalmente quando utilizamos interfaces gráficas, mesmo que seja uma simples caixa de diálogo. Quando se fecha uma caixa de diálogo, na verdade, não encerramos o programa que continua rodando. O System.exit(0) indica o encerramento normal do programa. Existe também o método System.gc, que ativaria o Garbaje Colector, mas a JVM já faz isso automaticamente. Scanner A classe scanner permite ler dados digitados via teclado, números, por exemplo, para serem usados no processamento. Da mesma forma que o pacote java.io, é necessário que seja instanciado um objeto para sua utilização. A classe Scanner pertence ao pacote java.util e utiliza os métodos next(), nextLine(), nextInt(), nextFloat(), nextDouble(). next() – retorna a primeira palavra digitada na linha de comando. nextLine() – retorna toda a frase digitada na linha de comando. nextInt() – retorna o numero inteiro digitado na linha de comando. nextFloat – retorna o numero real de precisão simples digitado na linha de comando. nextDouble() – retorna o numero real de precisão dupla digitado na linha de comando. Exemplos: import java.util.Scanner; public class ExemploNext { public static void main(String args[ ]) { String palavra = “ “; Scanner entra = new Scanner(System.in); for(int i=0; i<= 2; i++) { System.out.print(“Entre com a palavra “ + i + “:”); palavra = palavra+“\nResultado “ + i + “: “ +entra.next(); } System.out.pintln(prases + “\n”); } } import java.util.Scanner; public class ExNextLine { public static void main(String args[ ]) { String frase = " "; Scanner entra = new Scanner(System.in); for(int i = 0; i <= 2; i++) { System.out.print("Entre com a palavra " + i + ": "); frase = frase + "\nSaida " + i + ": " + entra.nextLine(); } System.out.println(frase + "\n"); } } import java.util.Scanner; public class ExScannerNumeros { public static void main(String args[ ]) { Scanner entrada = new Scanner(System.in); int numero1, float numero2, double numero3; System.out.println(“Entre com um numero inteiro”); numero1 = entrada.nextInt(); System.out.println(“Entre com um numero real simples”); numero2 = entrada.nextFloat(); System.out.println(“Entre com um numero real duplo”); numero3 = entrada.nextDouble(); System.out.println(“Numero inteiro : “ + numero1); System.out.println(“Numero float: “ + numero2); System.out.println(“Numero Double: “ + numero3); } } Entrada e saída de dados por JOptionPane Além da linha de comando do prompt, outra forma de entrada e saída de dados pelo sistema é através de caixas de diálogo. A classe JOptionPane que pertence ao pacote javax.swing, permite que utilizemos este recurso que é bem mais agradável ao usuário, por apresentar caixas de entrada de dados e saída de mensagens mais fáceis de utilizar e bem mais bonitas também, ao invés da tela preta do prompt de comandos. Existem vários métodos nesta classe que fazem a interação com usuário, para entrada de dados, mensagens, solicitação de uma confirmação e escolha de uma opção. São elas: showInputDialog() – Solicita que o usuário entre com algum valor. As caixas de diálogo de entrada são geradas a partir do método showInputDialog() e são utilizadas para fazer uma pergunta ao usuário e solicitar a entrada de um texto. Esse texto será armazenado em uma variável qualquer do tipo String. A sintaxe usada na criação de caixas de diálogo de entrada é praticamente a mesma usada nas caixas de mensagem. Sintaxe: JoptionPane.showInputDialog(Component, <mensagem>, <título da mensagem>, <botões presentes>, <tipo de mensagem>). showMessageDialog() – Mostra uma mensagem ao usuário. A caixa de diálogo showMessageDialog() é utilizada para mostrar ao usuário alguma informação e não retorna nenhum tipo de valor de resposta. Essas caixas de diálogo podem apresentar um ícone referente ao tipo de mensagem (pergunta, informação, alerta, ou erro) ou não apresentar nada, apenas a mensagem na tela sem ícone. Sintaxe: JoptionPane.showMessageDialog(Component, <mensagem>, <título da mensagem>, <tipo de mensagem>) Onde: • Component: Refere-se a um objeto do tipo contêiner que permite definir a posição da tela em que a caixa de mensagem aparecerá. Normalmente esse argumento é deixado como "null" (default) para que a mensagem apareça centralizada na tela. • Mensagem: É a mensagem do tipo String que a caixa de diálogo informa ao usuário. • Título da mensagem: É o texto que aparece na barra de título da janela da caixa de diálogo. • Tipo da mensagem: É o ícone que representa o tipo de mensagem que está sendo informado ao usuário. Esse ícone é definido pelo usuário. A tabela abaixo apresenta as "constantes" da linguagem Java para definição dos ícones a serem apresentados na tela. showConfirmDialog() – Solicita ao usuário uma confirmação. As caixas de diálogo de confirmação são pequenas janelas que possibilitam ao usuário responder algum questionamento por meio dos botões "YES, NO e CANCEL". Uma vez apresentada na tela, o usuário escolhe uma das opções e, dependendo do botão clicado, é gerado um valor inteiro pertencente à classe JOptionPane: • YES_OPTION = 0; • NO_OPTION = 1; • CANCEL_OPTION = 2. Estes valores são utilizados para conhecer qual dos botões foi clicado pelo usuário. Existem três tipos de caixa de diálogo de confirmação: • Apresentam os botões YES e NO D YES_NO_OPTION ou 0; • Apresentam os botões YES, NO e CANCEL D YES_NO_CANCEL ou 1; • Apresentam os botões OK e CANCEL D OK_CANCEL_OPTION ou 2. Sintaxe: JoptionPane.showConfirmDialog(Component, <mensagem>, <título da mensagem>, <botões presentes>, <tipo de mensagem>). A única diferença entre essa sintaxe e a sintaxe da caixa de mensagem (showMessageDialog()) se refere ao parâmetro <botões presentes> no qual são inseridos os botões que aparecerão na caixa de diálogo. showOptionDialog() – Solicita ao usuário que escolha uma das opções. As caixas de diálogo de opção são geradas a partir do método showOptionDialog() e são bem complexas. São capazes de combinar todos os recursos já vistos nas outras caixas de diálogo. Sintaxe: JOptionPane.showOptionDialog(Component, <mensagem>, <título da menagem>, <botões presentes>, <tipo de mensagem>, <ícone>, <array de objetos>, <seleção padrão>). Onde: • Botões presentes: Um tipo de caixa que utiliza as variáveis YES_NO_OPTION, YES_NO_CANCEL_OPTION ou OK_CANCEL_OPTION. Deve-se utilizar o 0(zero) caso outros botões sejam utilizados no lugar destes. • erro; Tipo de mensagem: Uma das variáveis de pergunta, informação, alerta, ou • Ícone: Um objeto ImageIcon a ser apresentado no lugar de um dos ícones do argumento anterior (<tipo de mensagem>). Se nenhum ícone for usado, deve-se colocar a palavra "null" no lugar desse argumento. • Array de objetos: É um array de objetos que contém os componentes ou outros objetos que representam as escolhas da caixa de diálogo, caso YES_NO_OPTION, YES_NO_CANCEL_OPTION ou OK_CANCEL_OPTION não esteja sendo utilizado. Além das mensagens elas permitem que se altere o nome da caixa, que é exibido no alto da caixa de diálogo, além do tipo de mensagem que se quer mostrar. Exemplo: import javax.swing.*; public class ExJOptionPane { public static void main(String args[]) { int resposta = JOptionPane.NO_OPTION; while(resposta == JOptionPane.NO_OPTION) { String sexo =JOptionPane.showInputDialog(null,"Digite seu sexo(M/F)","Sexo",JOptionPane.PLAIN_MESSAGE); if(sexo.equals("M")) { JOptionPane.showMessageDialog(null,"Você é do sexo masculino","Masculino",JOptionPane.INFORMATION_MESSAGE); } else if(sexo.equals("F")) { JOptionPane.showMessageDialog(null,"Você é do sexo feminino","Feminino",JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(null,"Sexo inválido","Inválido",JOptionPane.ERROR_MESSAGE); } resposta = JOptionPane.showConfirmDialog(null,"Deseja encerrar","Encerramento",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSA GE); } JOptionPane.showMessageDialog(null,"O programa será encerrado","Fim",JOptionPane.WARNING_MESSAGE); System.exit(0); } } import javax.swing.JOptionPane; public class TesteJOptionPane2 { public static void main(String[] args) { String[] escolha = {"entre 1 e 20 anos", "entre 21 e 40 anos", "mais de 40 anos"}; int resp = JOptionPane.showOptionDialog(null, "Qual sua idade?", "Idade", 0, JOptionPane.QUESTION_MESSAGE, null, escolha, escolha[0]); String idade = escolha[resp]; JOptionPane.showMessageDialog(null,idade,”Foi informado: “ + idade, "Informação", JOptionPane.INFORMATION_MESSAGE); System.exit(0) ;}} EXERCÍCIOS Qual a diferença entre os métodos print() e println()? O que deve ser feito para o método print() simular o método println()? Faça um programa em Java que imprima na tela a figura abaixo. Só pode ser impresso um caractere de cada vez, ou seja, um asterisco(*) ou um espaço em branco de cada vez. ******** * * *** ******* * * * ************ ** * ** * 4 Escreva um programa em Java que simule uma calculadora simples. Este programa deve solicitar via console do teclado, qual a operação que o usuário quer realizar (soma, subtração, multiplicação ou divisão) e em seguida peça para o usuário informar o primeiro e o segundo valor para realizar a operação matemática. A calculadora deve realizar operações apenas entre dois números. Após o calculo, deve-se imprimir na tela o resultado. 5 Utilize o mesmo programa feito no exercício quatro, porém ao invés de solicitar ao usuário as informações via console do teclado, utilize os métodos da classe javax.swing.JOptionPane para solicitar as informações por meio de caixas de diálogo. O seu programa deve conter obrigatoriamente os seguintes métodos: • showInputDialog(); • showMessageDialog(); • showConfirmDialog().