sirve servlet que para example clase java io stream printwriter

java - servlet - printwriter que es



Java-Comprender PrintWriter y necesidad de color (2)

Es más eficiente no vaciar los datos después de cada println . Si está escribiendo una gran cantidad de datos, desea almacenarlos en búfer y enviar grandes fragmentos, no enviar cada línea por separado. Es por eso que necesita enjuagar manualmente las transmisiones si desea asegurarse de que los datos se envíen al otro extremo.

Imagine que está escribiendo un correo electrónico a un amigo, y envía cada palabra como su propio correo electrónico en lugar de enviar el texto completo en un solo correo electrónico. ¿Cuál crees que es más rápido? Claro, su amigo leerá el correo más rápido si envía cada palabra como lo piensa, pero el tiempo total será más largo.

Ok, en primer lugar, me disculpo por todo el código, pero me parece que demasiado código es mejor que no suficiente. Estoy haciendo un simple cliente de chat y un impresor en particular con el que estoy luchando. Con el código tal como está, ahora interactuará con la clase de servidor y se ajustará perfectamente e imprimirá lo que quiero imprimir. Sin embargo, cuando elimino ''writer.flush ();'' dejará de imprimir. Según tengo entendido, lo que evidentemente está mal, ''writer.println (outgoing.getText ());'' debería ser suficiente ya que esto enviaría el texto que estoy tratando de enviar al servidor. Entiendo que Flush obliga a escribir toda la información, pero ¿por qué es necesario cuando ya he escrito lo que quiero escribir?

public class SimpleChatClientA { JTextArea incoming; JTextField outgoing; BufferedReader reader; PrintWriter writer; Socket sock; public void go(){ JFrame frame = new JFrame("Ludicrously Simple Chat Client"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(); incoming = new JTextArea(15,50); incoming.setLineWrap(true); incoming.setWrapStyleWord(true); incoming.setEditable(false); JScrollPane qScroller = new JScrollPane(incoming); qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); outgoing = new JTextField(20); JButton sendButton = new JButton("Send"); sendButton.addActionListener(new SendButtonListener()); mainPanel.add(qScroller); mainPanel.add(outgoing); mainPanel.add(sendButton); setUpNetworking(); Thread readerThread = new Thread(new IncomingReader()); readerThread.start(); frame.getContentPane().add(BorderLayout.CENTER, mainPanel); frame.setSize(400, 500); frame.setVisible(true); }//close go public void setUpNetworking(){ try{ sock = new Socket("127.0.0.1", 5000); InputStreamReader streamReader = new InputStreamReader(sock.getInputStream()); reader = new BufferedReader(streamReader); writer = new PrintWriter(sock.getOutputStream()); System.out.println("network established"); }catch(Exception e){ e.printStackTrace(); } }//close setupnetworking public class SendButtonListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { try{ writer.println(outgoing.getText()); writer.flush(); }catch(Exception ex){ ex.printStackTrace(); } outgoing.setText(""); outgoing.requestFocus(); } }//close sendbuttonlistener inner class public class IncomingReader implements Runnable{ public void run(){ String message; try{ while((message = reader.readLine()) != null){ System.out.println("read " + message); incoming.append(message + "/n"); } }catch(Exception e){ e.printStackTrace(); } } }//close inner class incomingreader public static void main(String[] args){ new SimpleChatClientA().go(); }

}

Gracias de antemano, si hay más información que puedo dar, por favor avíseme la primera vez que publique correctamente en stackoverflow.


Los métodos println() de la clase PrintWriter "comprometen" los datos a la transmisión solo si el atributo de autoFlush está habilitado.

Mira esta cita de los documentos de Java:

si el lavado automático está habilitado, se realizará solo cuando se invoque uno de los métodos println, printf o format

Enlace a documentos Java aquí: https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter(java.io.OutputStream,%20boolean)

Si necesita enviar el mensaje al servidor, cree el objeto PrintWriter con la opción de autoflush activada.

Entonces, donde estás creando el objeto writer , solo haz esto:

writer = new PrintWriter(sock.getOutputStream(), true);

Deberias hacer eso. ¡Espero eso ayude!