前面介绍过大文件上传分片合并的nodejs并发示例,主要有mapLimit、Promise、pipeline、fs.createReadStream、fs.createWriteStream(注意,这个设置写入偏移量)等要点,可以实现将文件分片并发写入目标文件的。
java的话,不太熟悉去搜的话,一下子能找到很多关于文件操作的类,为了支持从指定偏移量开始写入数据,那么只能使用这个RandomAccessFile,另外好像MappedByteBuffer这个看起来比较高级,但是在文件分片合并场景下并不简明,除了需要维护FileChannel外,还需要在内存中申请分配空间容纳文件分片内容,并发的话,则还需要申请更多的内存,而RandomAccessFile和FileInputStream配合可以采用流的特点,内存占用低。
目标文件以RandomAccessFile的rw模式new出来,seek到目标分片起始位置。
暂时还没有学到类似nodejs里的pipeline方法,方案暂时就是从输入流(分片文件)read到缓冲区,再将缓冲区写入到目标文件,分片不大的话(比如5MB),干脆一次读完。
还在学习中,希望还能找到更理想的解决方案。