在java中从BufferedReader读取两次

在java中从BufferedReader读取两次,java,sockets,bufferedreader,Java,Sockets,Bufferedreader,我用java构建了一个Web服务器,将请求作为套接字获取并处理它。 我需要先打印整个请求,然后在上处理它。 以下是我的代码片段: public HttpRequest(Socket socket) throws Exception { this.socket = socket; BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); printRe

我用java构建了一个Web服务器,将请求作为套接字获取并处理它。 我需要先打印整个请求,然后在上处理它。 以下是我的代码片段:

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打印整个请求


有没有办法解决这个问题?

将请求作为字符串读入

String request = readUntilEOF(input);
然后你想用它做什么就做什么

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

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

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

您可以读取字节数组中的内容,然后在需要时使用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))));

家庭作业标签已经并且不应该再被使用。我被要求先打印整个申请,然后再进行处理。为什么?这将限制您使用比实际可用内存更多的实现,并增加不必要的延迟。打印请求块(例如,一行一行地传递请求块)更有意义。