在rw
模式下,默认是使用buffer
的,只有cache
满的或者使用RandomAccessFile.close()
关闭流的时候才真正的写到文件。
API
1、void seek(long pos)
:设置下一次读取或写入时的文件指针偏移量,通俗点说就是指定下次读文件数据的位置。
❝
偏移量可以设置在文件末尾之外,只有在偏移量设置超出文件末尾后,才能通过写入更改文件长度;
❞
2、native long getFilePointer()
:返回当前文件的光标位置;
3、native long length()
:返回当前文件的长度;
4、**「读」**方法
5、**「写」**方法
6、readFully(byte[] b)
:这个方法的作用就是将文本中的内容填满这个缓冲区b。如果缓冲b不能被填满,那么读取流的过程将被阻塞,如果发现是流的结尾,那么会抛出异常;
7、FileChannel getChannel()
:返回与此文件关联的唯一FileChannel
对象;
8、int skipBytes(int n)
:试图跳过n个字节的输入,丢弃跳过的字节;
❝
RandomAccessFile
的绝大多数功能,已经被JDK1.4
的NIO的**「内存映射」**文件取代了,即把文件映射到内存后再操作,省去了频繁磁盘io
。
❞
主菜
–
总结经验,砥砺前行:之前的实战文章中过多的粘贴了源码,影响了各位小伙伴的阅读感受。经过大佬的点拨,以后将展示部分关键代码,供各位赏析,源码可在**「后台」**获取。
文件分块
文件分块需要在前端进行处理,可以利用强大的js
库或者现成的组件进行分块处理。需要确定分块的大小和分块的数量,然后为每一个分块指定一个索引值。
为了防止上传文件的分块与其它文件混淆,采用文件的md5
值来进行区分,该值也可以用来校验服务器上是否存在该文件以及文件的上传状态。
-
如果文件存在,直接返回文件地址;
-
如果文件不存在,但是有上传状态,即部分分块上传成功,则返回未上传的分块索引数组;
-
如果文件不存在,且上传状态为空,则所有分块均需要上传。
fileRederInstance.readAsBinaryString(file);
fileRederInstance.addEventListener(“load”, (e) => {
let fileBolb = e.target.result;
fileMD5 = md5(fileBolb);
const formData = new FormData();
formData.append(“md5”, fileMD5);
axios
.post(http + “/fileUpload/checkFileMd5”, formData)
.then((res) => {
if (res.data.message == “文件已存在”) {
//文件已存在不走后面分片了,直接返回文件地址到前台页面
success && success(res);
} else {
//文件不存在存在两种情况,一种是返回data:null代表未上传过 一种是data:[xx,xx] 还有哪几片未上传
if (!res.data.data) {
//还有几片未上传情况,断点续传
chunkArr = res.data.data;
}
readChunkMD5();
}
})
.catch((e) => {});
});
在调用上传接口前,通过slice
方法来取出索引在文件中对应位置的分块。
const getChunkInfo = (file, currentChunk, chunkSize) => {
//获取对应下标下的文件片段
let start = currentChunk * chunkSize;
let end = Math.min(file.size, start + chunkSize);
//对文件分块
let chunk = file.slice(start, end);
return { start, end, chunk };
};
之后调用上传接口完成上传。
断点续传、文件秒传
后端基于spring boot
开发,使用redis
来存储上传文件的状态和上传文件的地址。
如果文件完整上传,返回文件路径;部分上传则返回未上传的分块数组;如果未上传过返回提示信息。
❝
在上传分块时会产生两个文件,一个是文件主体,一个是临时文件。临时文件可以看做是一个数组文件,为每一个分块分配一个值为127的字节。
❞
校验MD5值时会用到两个值:
-
文件上传状态:只要该文件上传过就不为空,如果完整上传则为
true
,部分上传返回false
; -
文件上传地址:如果文件完整上传,返回文件路径;部分上传返回临时文件路径。
/**
* 校验文件的MD5
**/
public Result checkFileMd5(String md5) throws IOException {
//文件是否上传状态:只要该文件上传过该值一定存在
Object processingObj = stringRedisTemplate.opsForHash().get(UploadConstants.FILE_UPLOAD_STATUS, md5);
if (processingObj == null) {
return Result.ok(“该文件没有上传过”);
}
boolean processing = Boolean.parseBoolean(processingObj.toString());
//完整文件上传完成时为文件的路径,如果未完成返回临时文件路径(临时文件相当于数组,为每个分块分配一个值为127的字节)
String value = stringRedisTemplate.opsForValue().get(UploadConstants.FILE_MD5_KEY + md5);
//完整文件上传完成是true,未完成返回false
if (processing) {
return Result.ok(value,“文件已存在”);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后总结我的面试经验
2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。
另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
BAT面试经验
实战系列:Spring全家桶+Redis等
其他相关的电子书:源码+调优
面试真题:
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
源码+调优**
[外链图片转存中…(img-nuyXLteO-1712726386975)]
面试真题:
[外链图片转存中…(img-78GO5rBo-1712726386975)]
[外链图片转存中…(img-BPHzcl6k-1712726386975)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-v23uS1HP-1712726386976)]