当前位置: 首页 > 知识库问答 >
问题:

用InputStreamReader包装stream的地方?

养聪
2023-03-14
try (InputStream in = ModelCodeGenerator.class.getClassLoader().getResourceAsStream("/model.java.txt"))
{
    modelTemplate = new SimpleTemplate(CharStreams.toString(new InputStreamReader(in, "ascii")));
}
try (InputStreamReader reader = new InputStreamReader(...))

但这似乎更糟。如果InputStreamReader由于某种原因抛出,InputStream将永远不会关闭,对吗?这是C++中调用其他构造函数的构造函数的常见问题。异常会导致内存/资源泄漏。

这里有最佳实践吗?

共有1个答案

单于俊智
2023-03-14

这意味着InputStreamReader永远不会关闭

嗯?在你的代码里...它当然也可以处理资源流的.close()。有关详细信息,请参阅下文...

然而,正如@SotiriosDelimanolis所提到的,您可以在try-with-resources语句的“resource block”中声明多个资源。

如果我是你我会这么做:

final URL url = ModelCodeGenerator.class.getClassLoader()
    .getResource("/model.java.txt");

if (url == null)
    throw new IOException("resource not found");

try (
    final InputStream in = url.openStream();
    final Reader reader = new InputStreamReader(in, someCharsetOrDecoder);
) {
    // manipulate resources
}

注意,与Closeable的close方法不同,这个close方法不要求是幂等的。换句话说,多次调用此close方法可能会产生一些明显的副作用,这与CloSeable.close不同,如果多次调用此close方法则要求close不起作用。但是,强烈鼓励该接口的实现者使其闭式方法是幂等的。

事实上,closeable的javadoc对此很清楚:

关闭此流并释放与之关联的所有系统资源。如果流已经关闭,则调用此方法不起作用。

    null
 类似资料:
  • 关于已回答的问题:Java BufferedReader,将InputStream转换为BufferedReader,Java的BufferedReader和InputStreamReader类之间有什么区别? BufferedReader[BR]和InputStreamReader[ISR]都实现了相同的接口。BR拥有ISR拥有的所有方法以及其他方法,包括非常有用的readLine()方法和不那

  • 主要内容:1 什么是Java InputStreamReader,2 Java InputStreamReader的构造方法,3 Java InputStreamReader的方法,4 Java InputStreamReader的例子1 什么是Java InputStreamReader InputStreamReader是从字节流到字符流的桥梁:它读取字节,并使用指定的字符集将它们解码为字符。它使用的字符集可以按名称指定,也可以明确指定,也可以接受平台的默认字符集。 2 Java Input

  • 我有一个映射,我正在遍历它,并使用循环修改映射的值。我想知道是否有一种方法可以使用Java8流来实现。 这是我的代码: 基本上,我想流化地图值,设置值,并将其作为新地图。

  • 问题内容: 我似乎无法确定任何区别和另外两个被初始化的方式。使用一个或另一个有什么好处吗?其他大多数文章都介绍了vs ,但与此相反。在我看来,它们都有相同的目的。 问题答案: 首先,可以处理所有输入流,而不仅仅是文件。其他示例是网络连接,类路径资源和ZIP文件。 其次,直到Java 11不允许您指定编码,而只使用平台默认编码,这使它几乎无用,因为当代码在具有不同平台默认编码的系统上运行时,使用它会

  • 问题内容: 使用over 的好处是什么,反之亦然。 这是一个实际的例子: 这是一个使用InputStreamReader的示例(显然是在InputStream的帮助下): Reader是否以特殊方式处理数据? 只是想让我了解Java 的整个流数据方面。 问题答案: 它们代表了一些不同的东西。 它是所有可能的字节 流 的祖先类,它本身没有用,但是所有子类(如您正在使用的子类)都非常适合处理二进制数据

  • 问题内容: 最近,我从使用Spring的XML配置切换到了Java配置,并遇到了一个奇怪的问题。 XML配置为: Java配置为: 两种bean在不同的文件中声明,我在这里将它们分组以便于阅读。该映射也包含引用,而不仅仅是字符串。 我希望能够在第二个bean中使用,但Spring会注入以下映射: 我不明白为什么Spring会将地图包装到另一个地图中,以及为什么它与XML配置的行为方式不同。 有任何