Java 并发处理IO流

Java 并发处理IO流,java,multithreading,spring-boot,concurrency,java-io,Java,Multithreading,Spring Boot,Concurrency,Java Io,通常,要从资源目录中的文件中读取内容,我们可以打开一个输入流。 this.getClass().getClassLoader().getResourceAsStream(“yourJsonFile.json”)当同步调用它时,它工作得相当好。 在并发处理的情况下,它抛出一个I/O异常,并显示以下消息 Too many open files at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91) at su

通常,要从资源目录中的文件中读取内容,我们可以打开一个输入流。
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的方法。现在,每当我们需要读取文件时,我们所需要做的就是调用此方法,使您的文件内容随时可用

这是目前处理此场景的方法之一


是否还有其他更有效的方法?

如果是多线程java应用程序或任何可能产生多个IO(输入输出)调用的应用程序,建议将其缓存以避免意外问题。