【问题标题】:How to easily convert a BufferedReader to a String?如何轻松地将 BufferedReader 转换为字符串?
【发布时间】:2013-02-09 00:49:38
【问题描述】:
@POST
@Path("/getphotos")
@Produces(MediaType.TEXT_HTML)
public String getPhotos() throws IOException{
    // DataInputStream rd = new DataInputStream(request.getInputStream());
    BufferedReader rd = new BufferedReader(
        new InputStreamReader(request.getInputStream(), "UTF-8")
    );
    String line = null;
    String message = new String();
    final StringBuffer buffer = new StringBuffer(2048);
    while ((line = rd.readLine()) != null) {
        // buffer.append(line);
        message += line;
    }
    System.out.println(message);
    JsonObject json = new JsonObject(message);
    return message;
}

上面的代码用于我的 servlet。它的目的是获取一个流,从中制作一个 Json 文件,然后将 Json 发送回客户端。 但为了制作 Json,我必须使用“while”循环读取 BufferedReader 对象 rd。但是,我想用尽可能少的代码行将rd 转换为字符串。我该怎么做?

【问题讨论】:

  • 很难看出您对多出三行代码的反对意见是什么。

标签: java json


【解决方案1】:

从 Java 8 开始:

rd.lines().collect(Collectors.joining());

【讨论】:

  • 太棒了!人们应该为不需要在自己的项目中添加又大又胖的库的解决方案赋予更多价值。
  • 顺便说一句,我必须使用Collectors.joining("\n") 为每一行添加一个尾随换行符。
  • Call requires API level 24 (current min is xx): java.io.BufferedReader#lines
  • 执行 Collectors.joining("\n") 非常重要。这个答案太错误了!我希望其他人不要像我一样错过它。另外,非常重要的是,如果请求正文使用了其他转义字符,例如\r,该怎么办?不确定。所以我更喜欢 IOUtils 库
  • \r 实际上会被转换为\n 并且在某些情况下这可能会导致错误(在我的情况下确实如此,因为结果正在hmac中使用而我创建的哈希没有匹配我收到的那个)
【解决方案2】:

我建议使用 commons IO 库 - 那么它是一个简单的 1 班轮:

String message = org.apache.commons.io.IOUtils.toString(rd);

当然,请注意,使用这种机制,可以通过发送将填满服务器内存的永无止境的数据流来进行拒绝服务攻击。

【讨论】:

  • 正是我需要的!
  • Java 完全需要更多的单行代码
  • 如果 commons-io 在过去 3 年内更新过,我会使用它 :(
【解决方案3】:

我发现自己今天正在这样做。不想引入 IOUtils,所以我选择了这个:

String response = new String();
for (String line; (line = br.readLine()) != null; response += line);

【讨论】:

  • 又短又甜。
【解决方案4】:

像这样使用一个变量作为字符串:

BufferedReader rd = new BufferedReader(
                new InputStreamReader(response.getEntity().getContent()));
String line = "";
while((line = rd.readLine()) != null){

} 

【讨论】:

  • 如果缓冲区的最后一行不以'\n'结尾,则不会将其添加到字符串中
  • 然而这和发布的代码完全一样,只是更糟。
猜你喜欢
  • 2015-05-23
  • 2020-02-22
  • 2011-02-02
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
相关资源
最近更新 更多