当前位置: 首页 > 面试题库 >

相当于IOUtils.toString(InputStream)的番石榴

申屠喜
2023-03-14
问题内容

Apache Commons
IO
有一个很好的便捷方法IOUtils.toString()来读取InputStream字符串。

由于我正尝试从Apache Commons转移到Guava:Guava中有与之等效的产品吗?我查看了com.google.common.io包中的所有类,但几乎找不到任何简单的东西。

编辑: 我理解并赞赏字符集的问题。碰巧,我知道我所有的来源都是ASCII(是,ASCII,不是ANSI等),因此在这种情况下,编码对我来说不是问题。


问题答案:

您在对Calum答案的评论中表示要使用

CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))

该代码是有问题的,因为重载CharStreams.toString(Readable)指出:

不关闭Readable

这意味着在此代码完成后,您的InputStreamReader,以及作为扩展名的InputStreamby
supplier.get()将不会关闭。

另一方面,如果您利用了似乎已经具有InputSupplier<InputStream>和使用过重载(CharStreams.toString(InputSupplier<R extends Readable & Closeable>)的事实,则该toStringhtml" target="_blank">方法将为您处理的创建和关闭Reader

这正是乔恩斯基特建议,但没有真正的任何过载CharStreams.newReaderSupplier,它接受一个InputStream输入......你必须给它一个InputSupplier

InputSupplier<? extends InputStream> supplier = ...
InputSupplier<InputStreamReader> readerSupplier = 
    CharStreams.newReaderSupplier(supplier, Charsets.UTF_8);

// InputStream and Reader are both created and closed in this single call
String text = CharStreams.toString(readerSupplier);

关键InputSupplier是要允许番石榴处理需要难看的try-finally块以确保资源正确封闭的零件,从而使您的生活更轻松。

编辑:就 个人而言,我发现以下内容(这实际上是我编写它的方式,只是破坏了上面代码中的步骤)

String text = CharStreams.toString(
    CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));

远远 比这个更简洁:

String text;
InputStreamReader reader = new InputStreamReader(supplier.get(), 
    Charsets.UTF_8);
boolean threw = true;
try {
  text = CharStreams.toString(reader);
  threw = false;
}
finally {
  Closeables.close(reader, threw);
}

您或多或少需要写些什么才能自己正确处理。

编辑:2014年2月

InputSupplier并且OutputSupplier在Guava
16.0中已弃用使用它们的方法。其接替者ByteSourceCharSourceByteSinkCharSink。给定一个ByteSource,您现在可以String像这样获取其内容:

ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();


 类似资料:
  • 问题内容: 刚刚发现了Guava库项目。 这些与GWT兼容吗? 问题答案: 从该页面的介绍性PDF中, 您可以在…上使用这些库。 在JDK 6上 在Android上, 我们认为。需要志愿者来帮助我们进行测试。 在Google App Engine上, 我们认为。需要志愿者来帮助我们进行测试。 在GWT上-参差不齐! 由于GWT的JDK库支持 可能参差不齐,也许是2/3,所以到目前为止,这些库中的东

  • 问题内容: 我想知道哪个更有效,为什么? 1) 要么 2) 问题答案: 我看不出您为什么要在此处使用builder的任何原因: 比在这种情况下制作一个更具可读性, 不会推断通用类型,并且在用作单行代码时必须自己指定类型, (来自docs) 在与另一个不可变集合调用时 做得很好( 尝试避免在安全的情况下实际复制数据 ), (从源) 调用以前创建的,同时避免为零元素和一元素集合创建任何列表(分别返回空

  • 我想为番石榴设个坑(http://pitest.org/)进行突变熟练度测试,但我在尝试运行时出现以下错误。这是我得到的错误: 基本上,要么PIT没有检测到测试,要么测试在PIT中运行不正常,所有测试都失败了。我读了这篇文章:JUnit测试通过,但PIT说套件不是绿色的,我认为“您的代码库是否包含可变静态状态?(例如在单例中)”是问题所在,但我不知道如何修复它。如果测试套件有一些隐藏的顺序依赖关系

  • 我的 Spark 版本是 2.2.0,它在本地工作,但在具有相同版本的 EMR 上,它给出了以下异常。

  • 问题内容: 我在commons- lang中使用了简单的DTO。现在,我尝试使用Google Guava代替Apache Commons库。我在番石榴找到了。但是如果班上有很多成员,这太冗长了。例如: 如果我使用commons-lang,则简单得多: 有什么更好的方法可以用Guava而不是commons-lang 来实现? 番石榴文件 问题答案: 我有番石榴的小招。我将 IntelliJ IDEA

  • 要在spring boot应用程序中本地缓存一些数据,在读/写操作方面哪种技术更好?HashMap vs ConcurrentHashMap vs LoadingCache(Guava library)我试着在每一个上面写和读操作,HashMap是最快的,LoadingCache是最慢的,那么我们为什么要使用LoadingCache,目的是什么? 编辑:应用程序是多线程的。此外,缓存的最大大小、过