如何使用 BufferedReader 读取 DataInputStream 中的内容

Posted

技术标签:

【中文标题】如何使用 BufferedReader 读取 DataInputStream 中的内容【英文标题】:How to use BufferedReader to read content in DataInputStream 【发布时间】:2015-10-18 18:22:01 【问题描述】:

我写了一个关于在客户端和服务器之间发送/接收消息的简单套接字教程。我使用 DataOutputStream 将字符串写入流中,但如果我使用 BufferedReader

,服务器将无法读取它

如果我使用 PrintWriter 写入(客户端),它可以工作。

这里有什么问题?太感谢了。

1.客户:

    client = new Socket("localhost", 1982);
    DataOutputStream opStr = new DataOutputStream(client.getOutputStream());

    //pw = new PrintWriter(client.getOutputStream(), true);
    //pw.println("Hello, is there anybody out there?");// Can be read by BufferedReader
    opStr.writeUTF("Hello, anyone there?");
    opStr.flush();// BufferedReader can't read it

2。服务器:

        openServer();// port 1982
        while(true) 
            Socket clientSocket = null;

                // listen to connection.
                clientSocket = echoServer.accept();

                DataInputStream inStr = new DataInputStream(
                        clientSocket.getInputStream());

                //System.out.println("M1: Got msg " + inStr.readUTF());// It showed the content

                BufferedReader bfReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

                System.out.println("got Messages: ");
                String strLine = "";
                // Don't show anything
                while ((strLine = bfReader.readLine()) != null) 
                    System.out.println(strLine);
                
            

【问题讨论】:

我认为您写入数据的方式将只允许您以这种方式读取数据......就像缓冲读取器/写入器......数据读取器/写入器......看到你的行已在上面的服务器中评论... instr.readUTF();这就是我的意思... 我发现这个:BufferedReader can't wrap an InputStream directly。它包装了另一个读者***.com/questions/5200187/…。我所需要的只是更改为新的 BufferedReader(new InputStreamReader(clientSocket.getInputStream(), "UTF-8")。Tks 这么多 @ducanhng 不。这并没有为您提供使用BufferedReader. 读取writeUTF() 输出的解决方案。没有。 【参考方案1】:

你不能。如果你在一端使用writeUTF(),你必须在另一端使用readUTF()

您只需决定要使用哪个 API,而不是尝试混合搭配它们。

【讨论】:

【参考方案2】:

您想以文本形式读取文件,例如BufferedReader 或二进制,例如数据输入流。所以你不能同时使用。

Server.java

public class Server 

    public static void main(String[] args) 
    
        DataInputStream inStr = null;
        String str;
        openServer();// port 1982
        while(true) 
        
            Socket clientSocket = null;
            // listen to connection.
            clientSocket = echoServer.accept();
            try
            
                inStr = new DataInputStream(clientSocket.getInputStream());
                str = inStr.readUTF();
                System.out.print((String) str);
                System.out.flush(); 
             
            catch (IOException io) 
            
                System.err.println("I/O error occurred: " + io);
             
            catch (Throwable anything) 
            
                System.err.println("Exception caught !: " + anything);
            
            finally 
            
                if (inStr != null) 
                 
                    try 
                    
                        inStr.close();
                     
                    catch (IOException io) 
                    
                      System.err.println("I/O error occurred: " + io);
                    
                
            
        
    


【讨论】:

以上是关于如何使用 BufferedReader 读取 DataInputStream 中的内容的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 的 BufferedReader 与 InputStreamReader 读取文件?

如何使用BufferedReader或其他方法读取固定长度字符?

如何在 Java 中使用 BufferedReader 读取文件末尾 (EOF)?

如何使用 java.nio.channels.FileChannel 读取到 ByteBuffer 实现类似 BufferedReader#readLine() 的行为

如何读取 BufferedReader 两次或多次?

java中BufferedReader的问题 一个程序中如何多次调用BufferedReader 我第二次调用的时候无法读取数据 如