RandomAccessFile的使用
2017-08-11 19:32
183 查看
在这之前,散仙还是喜欢先啰嗦的介绍下RandomAccessFile这个类,RandomAccessFile是Java中输入,输出流体系中功能最丰富的文件内容访问类,它提供很多方法来操作文件,包括读写支持,与普通的IO流相比,它最大的特别之处就是支持任意访问的方式,程序可以直接跳到任意地方来读写数据。
如果我们只希望访问文件的部分内容,而不是把文件从头读到尾,使用RandomAccessFile将会带来更简洁的代码以及更好的性能。
下面来看下RandomAccessFile类中比较重要的2个方法,其他的和普通IO类似,在这里,就不详细说明了。
getFilePointer() 返回文件记录指针的当前位置
seek(long pos) 将文件记录指针定位到pos的位置
1、读取任意位置的数据:
1)创建randomAccessFile对象,以读的方式打开文件。RandomAccessFile raf=new RandomAccessFile(path, "r");
2)调用seek(long pos) 方法seek到文件的指定位置(按照字节去seek)。
3)调用randomAccessFile对象的read方法读取数据;
2、追加数据:
1)创建randomAccessFile对象,以写的方式打开文件。RandomAccessFile raf=new RandomAccessFile(path, "w");
2)调用seek(long pos) 方法seek到文件的尾部(raf.seek(raf.length()); )。
3)调用raf的write方法写数据。
3、任意位置插入数据:
1)创建randomAccessFile对象,以读写的方式打开文件。RandomAccessFile raf=new RandomAccessFile(path, "rw");
2)创建文件缓冲区;
3)调用seek(long pos) 方法seek到文件的指定位置,然后把剩下内容写入到缓冲区中;
4)调用seek(long pos)方法返回到指定位置,把新内容写入;
5)吧缓冲区内容追加到文件尾部。
注:RandomAccessFile并不直接支持,需要新建一个缓冲区临时空间,存数据,然后在写,因为一旦数据量上了级别,在任意位置插入数据,是很耗内存的,这个也就是为什么hadoop的HDFS文件系统,只支持append的方式,而没有提供修改的操作。
另外我们可以用RandomAccessFile这个类,来实现一个多线程断点下载的功能,用过下载工具的朋友们都知道,下载前都会建立两个临时文件,一个是与被下载文件大小相同的空文件,另一个是记录文件指针的位置文件,每次暂停的时候,都会保存上一次的指针,然后断点下载的时候,会继续从上一次的地方下载,从而实现断点下载或上传的功能,有兴趣的朋友们可以自己实现下
如果我们只希望访问文件的部分内容,而不是把文件从头读到尾,使用RandomAccessFile将会带来更简洁的代码以及更好的性能。
下面来看下RandomAccessFile类中比较重要的2个方法,其他的和普通IO类似,在这里,就不详细说明了。
getFilePointer() 返回文件记录指针的当前位置
seek(long pos) 将文件记录指针定位到pos的位置
1、读取任意位置的数据:
1)创建randomAccessFile对象,以读的方式打开文件。RandomAccessFile raf=new RandomAccessFile(path, "r");
2)调用seek(long pos) 方法seek到文件的指定位置(按照字节去seek)。
3)调用randomAccessFile对象的read方法读取数据;
2、追加数据:
1)创建randomAccessFile对象,以写的方式打开文件。RandomAccessFile raf=new RandomAccessFile(path, "w");
2)调用seek(long pos) 方法seek到文件的尾部(raf.seek(raf.length()); )。
3)调用raf的write方法写数据。
3、任意位置插入数据:
1)创建randomAccessFile对象,以读写的方式打开文件。RandomAccessFile raf=new RandomAccessFile(path, "rw");
2)创建文件缓冲区;
3)调用seek(long pos) 方法seek到文件的指定位置,然后把剩下内容写入到缓冲区中;
4)调用seek(long pos)方法返回到指定位置,把新内容写入;
5)吧缓冲区内容追加到文件尾部。
注:RandomAccessFile并不直接支持,需要新建一个缓冲区临时空间,存数据,然后在写,因为一旦数据量上了级别,在任意位置插入数据,是很耗内存的,这个也就是为什么hadoop的HDFS文件系统,只支持append的方式,而没有提供修改的操作。
package cn.edu.nuc.MyTestSimple.randomFile; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.RandomAccessFile; public class RandomFileTest { /** * 读的方法 * * @param path * 文件路径 * @param pointe * 指针位置 * **/ public static void randomRed(String path, int pointe) { try { // RandomAccessFile raf=new RandomAccessFile(new // File("D:\\3\\test.txt"), "r"); /** * model各个参数详解 r 代表以只读方式打开指定文件 rw 以读写方式打开指定文件 rws * 读写方式打开,并对内容或元数据都同步写入底层存储设备 rwd 读写方式打开,对文件内容的更新同步更新至底层存储设备 * * **/ RandomAccessFile raf = new RandomAccessFile(path, "r"); // 获取RandomAccessFile对象文件指针的位置,初始位置是0 System.out.println("RandomAccessFile文件指针的初始位置:" + raf.getFilePointer()); raf.seek(pointe);// 移动文件指针位置 byte[] buff = new byte[1024]; // 用于保存实际读取的字节数 int hasRead = 0; // 循环读取 while ((hasRead = raf.read(buff)) > 0) { // 打印读取的内容,并将字节转为字符串输入 System.out.println(new String(buff, 0, hasRead)); } } catch (Exception e) { e.printStackTrace(); } } /** * 追加方式 写的方法 * * @param path * 文件路径 * ***/ public static void randomWrite(String path) { try { /** 以读写的方式建立一个RandomAccessFile对象 **/ RandomAccessFile raf = new RandomAccessFile(path, "rw"); // 将记录指针移动到文件最后 raf.seek(raf.length()); raf.write("我是追加的 \r\n".getBytes()); } catch (Exception e) { e.printStackTrace(); } } /** * 实现向指定位置 插入数据 * * @param fileName * 文件名 * @param points * 指针位置 * @param insertContent * 插入内容 * **/ public static void insert(String fileName, long points, String insertContent) { try { File tmp = File.createTempFile("tmp", null); tmp.deleteOnExit();// 在JVM退出时删除 RandomAccessFile raf = new RandomAccessFile(fileName, "rw"); // 创建一个临时文件夹来保存插入点后的数据 FileOutputStream tmpOut = new FileOutputStream(tmp); FileInputStream tmpIn = new FileInputStream(tmp); raf.seek(points); /** 将插入点后的内容读入临时文件夹 **/ byte[] buff = new byte[1024]; // 用于保存临时读取的字节数 int hasRead = 0; // 循环读取插入点后的内容 while ((hasRead = raf.read(buff)) > 0) { // 将读取的数据写入临时文件中 tmpOut.write(buff, 0, hasRead); } // 插入需要指定添加的数据 raf.seek(points);// 返回原来的插入处 // 追加需要追加的内容 raf.write(insertContent.getBytes()); // 最后追加临时文件中的内容 while ((hasRead = tmpIn.read(buff)) > 0) { raf.write(buff, 0, hasRead); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String path = "D:\\liuxiao.txt"; int seekPointer = 20; randomRed(path, seekPointer);// 读取的方法 // randomWrite(path);//追加写的方法 insert(path, 33, "\nlucene是一个优秀的全文检索库"); } }
另外我们可以用RandomAccessFile这个类,来实现一个多线程断点下载的功能,用过下载工具的朋友们都知道,下载前都会建立两个临时文件,一个是与被下载文件大小相同的空文件,另一个是记录文件指针的位置文件,每次暂停的时候,都会保存上一次的指针,然后断点下载的时候,会继续从上一次的地方下载,从而实现断点下载或上传的功能,有兴趣的朋友们可以自己实现下
相关文章推荐
- 使用RandomAccessFile读写数据
- 使用RandomAccessFile和多线程来实现开启三个线程去复制一个文件
- RandomAccessFile的使用
- java当中randomAccessFile文件随机读取对象的简单使用
- Java RandomAccessFile使用
- RandomAccessFile基本使用
- Java--使用多线程下载,断点续传技术原理(RandomAccessFile)
- Java使用RandomAccessFile读写文件
- Java中断点下载使用类RandomAccessFile
- Java IO的RandomAccessFile的使用(转)
- RandomAccessFile使用
- Java按行读取正在被动态写入的大文件实例--使用RandomAccessFile(1)
- Java RandomAccessFile的使用
- Java RandomAccessFile使用
- RandomAccessFile使用
- Java使用RandomAccessFile读写文件
- 使用RandomAccessFile进行文件的读写
- Java IO的RandomAccessFile的使用
- RandomAccessFile 使用
- Android文件相关:RandomAccessFile介绍与使用demo