最近做的项目里面有这样一个需求,那就是使用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提供的工具类真的好强大,码代码之前还是需要多找找,不能一上来就蛮干,否则费力不讨好得不偿失。