为什么用FileoutputStream写入一个4M的文件流,会阻塞
时间: 2024-03-30 21:39:47 浏览: 30
使用`FileOutputStream`写入4MB大小的文件时,如果一次性写入整个文件流,可能会导致阻塞。这是因为`FileOutputStream`类是没有缓冲区的,每次调用`write()`方法都会直接将数据写入磁盘中,因此效率较低。在写入过程中,如果磁盘I/O速度跟不上写入速度,就会导致阻塞。
为了避免阻塞,可以将文件分成多个小块逐个写入,或者使用`BufferedOutputStream`类来提供缓冲区支持。`BufferedOutputStream`类内部维护一个缓冲区,每次调用`write()`方法时,将数据先写入缓冲区,当缓冲区满时再一次性将数据写入磁盘中,从而提高写入效率。可以根据实际情况设置缓冲区大小,以达到最佳的性能表现。
相关问题
FileOutputStream.write() 写入4M的数据,为什么会阻塞
当使用 FileOutputStream.write() 写入较大量的数据时,可能会出现阻塞的情况。这是因为在写入数据时,Java I/O 库会将数据写入到操作系统的内部缓冲区中,然后由操作系统后台线程将缓冲区中的数据写入到磁盘上。如果写入数据量较大,超过了操作系统内部缓冲区的大小,此时会阻塞等待内核将数据从用户空间复制到内核空间,然后再将数据写到磁盘上。
操作系统内部缓冲区的大小是由操作系统内核决定的,并且可能会随着时间的推移而发生变化。在 Linux 操作系统中,缺省情况下,操作系统会将可用内存的一部分用作 page cache,用于缓存文件数据。如果写入的数据量超过了 page cache 的大小,就需要等待 page cache 中的数据被写入磁盘后才能继续写入数据,这就会导致阻塞。
另外,写入数据时可能还会受到磁盘 I/O 性能的影响。如果写入的数据量较大,且磁盘的读写速度较慢,也会导致阻塞的情况发生。
为避免写入大量数据时的阻塞问题,可以考虑使用 Java NIO 库中的 FileChannel 类进行文件操作,并使用 ByteBuffer 缓冲区来控制写入数据的速度和延迟。此外,也可以将数据分批写入,每次写入一部分数据,然后等待一段时间再写入下一部分数据,以避免一次性写入过多数据导致的阻塞问题。
为什么FileputputStream的write一个大点的byte[]就会阻塞
FileOutputStream的write方法是阻塞式的,当写入的数据太大时,会占用过多的系统资源,导致阻塞。具体原因可能与操作系统的文件IO机制有关,比如磁盘的读写速度、内存缓存等因素都可能影响阻塞的发生。为了避免这种情况,可以使用缓冲区将大的byte[]分成小块写入,或者使用NIO的通道(Channel)实现非阻塞式的文件IO。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)