首页 > 解决方案 > 并发处理 IO 流

问题描述

通常,要从资源目录中的文件中读取内容,我们可以通过打开输入流来完成。 this.getClass().getClassLoader().getResourceAsStream("yourJsonFile.json");这在同步调用时效果很好。在同时处理的情况下,它会抛出带有以下消息的 I/O 异常。

Too many open files
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
at java.nio.file.Files.newByteChannel(Files.java:361)
at java.nio.file.Files.newByteChannel(Files.java:407)
at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
at java.nio.file.Files.newInputStream(Files.java:152)
at java.nio.file.Files.newBufferedReader(Files.java:2784)
at java.nio.file.Files.lines(Files.java:3744)
at java.nio.file.Files.lines(Files.java:3785)

为了使其更全面,假设我们正在使用 InputStream 读取文件,并在从文件中读取所有行后立即关闭它。在这种情况下,读取文件时打开一个 I/O 端口。但是,当并发调用发生时,它会尝试一次打开多个端口。这不仅会阻碍程序的进度,还会影响性能,因为 I/O 操作在时间消耗方面略高一些。

为了解决这种情况,我们可以通过将 IO 流封装到兼容的数据结构中来缓存它,HashMap 可能是理想的。有一个可以返回 HashMap 的方法。现在,每当我们需要读取文件时,我们需要做的就是调用此方法以使您的文件内容随时可供您使用。

这是目前处理这种情况的方法之一。

还有其他可能更有效的方法吗?

标签: javamultithreadingspring-bootconcurrencyjava-io

解决方案


推荐阅读