繁体   English   中英

在java中从BufferedReader读取两次

[英]Reading from BufferedReader twice in java

我用 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);

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

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

您可以读取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))));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM