【问题标题】:Reading from BufferedReader twice in java在java中从BufferedReader读取两次
【发布时间】:2012-11-27 15:58:46
【问题描述】:

我在 java 中构建了一个 Web 服务器,我获取请求(作为套接字)并对其进行处理。 我需要先打印整个请求,然后再进行处理。 这是我的代码 sn-p:

public HttpRequest(Socket socket) throws Exception
{
    this.socket = socket;
    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    printRequest(input);
    // Do More...
}

问题是,从现在开始,BufferedReader 已经到了尽头,我似乎无法找到让它回到开始的方法。 printRequest() 方法使用 while 循环和 readline() 操作打印来自 BufferedReader 的整个请求。

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 作业标签已为deprecated,不应再使用。
  • '我需要先打印整个请求,然后再处理它。'为什么?这将您限制在一个可能使用比实际可用内存更多的内存的实现中,并且还会增加不必要的延迟。在您传递请求块(例如行)时,将它们逐一打印会更有意义。

标签: java sockets bufferedreader


【解决方案1】:

您可以读取byte 数组中的内容,然后在需要时随时使用ByteArrayInputStream

InputStream is = socket.getInputStream();
byte[] content = new byte[is.available()];
is.read(content);
printRequest(new BufferedReader(new InputStreamReader(new ByteArrayInputStream(content))));
processRequest(new BufferedReader(new InputStreamReader(new ByteArrayInputStream(content))));

【讨论】:

    【解决方案2】:

    以字符串形式读入请求;

    String request = readUntilEOF(input);
    

    然后用它做任何你想做的事;

    System.out.println(request);
    process(request);
    doFunThingsWith(request);
    

    【讨论】:

      【解决方案3】:

      从概念上讲,当您从它们中读取时,就会消耗流。特别是在您从套接字读取的情况下,数据一经读取就消失了。 因此,如果您想重新读取// Do More 中的“流”,您需要创建一个新流并将您收到并存储在某处的数据提供给它。 或者,如果您想记录读取的所有内容,您可以包装 InputStream 并在最终消费者消费流后立即进行打印,

      【讨论】:

        【解决方案4】:

        您不能使用 BufferedReader 读取内容两次。第一次读取后,将读取的内容保存在变量中以供以后使用。

        【讨论】:

          猜你喜欢
          • 2014-02-09
          • 2013-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-21
          • 1970-01-01
          相关资源
          最近更新 更多