Save&Load

Save The World, Load The Game

0%

Python、Java组合玩文件

最近做的项目里面有这样一个需求,那就是使用Java实现POST不同大小的数据。数据通过读取本地文件得来,当然文件需要自己事先生成好,文件的大小从1KB到10MB,以2的倍数递增。

生成指定大小的文件

首先要做的就是生成指定大小的文件,这个上网一搜很多都是使用linux的dd命令来生成,但是这有一个不好的地方就是生成的文件是用空字符填充的,有些情况下读取一个文件的时候空字符会被忽略,这导致读一个文件最后的大小为0或者某些奇怪的数字。所以就想用实际的字符来生成文件。
既然是个很简单的类似原子操作的事情,果断祭出Python,几行代码搞定。

def create\_file(name, size):
file = open('./' + name, 'w')
for i in range(size):
file.write('t')
file.close()

create\_file(1KB, 1024)

读取文件

接下来就是要到了用Java来读取文件的时候了,感觉Java提供了非常丰富的方法来读取一个文件。但这次需要用到的是两种场景:一是读取整个文件到一个String对象中;二是从文件指定offset位置开始读取指定长度的数据。

第一种情况比较简单,google了一下之后发现一个非常简单的一句话搞定的方法:

String content = new Scanner(new File(filePath).useDelimiter("\\Z").next();

意思就是使用Scanner扫描一个文件直到文件的末尾为止,然后把扫描的内容保存到一个String对象中。

第二种情况就比较麻烦了,刚开始想的时候也比较麻烦,是想把整个文件都读到缓存里面,然后再根据需求读出要的数据。后来查来查去,发现有RandomAccessFile这么一个类,看了下功能简直就是为了这种场景量身定制的。

//打开要读取的文件
RandomAccessFile randomAccessFile = new RandomAccessFile(filePath, "rw");
//将指针直到要开始读取的offset
randomAccessFile.seek(offSet);
//读取指定长度的内容到自己创建的byte数组中
randomAccessFile.read(data, 0, readLength);

只需要三步就完活了,不得不感叹Java提供的工具类真的好强大,码代码之前还是需要多找找,不能一上来就蛮干,否则费力不讨好得不偿失。