IOの随机流

来源:互联网 发布:怎么在淘宝上做充值 编辑:程序博客网 时间:2024/05/16 19:00

随机存取文件流

RandomAccessFile类支持“随机访问”的方式,程序可以直接跳到文件的任意地方来读写文件

支持只访问的部分内容

可以向已存在的文件后追加内容

RandomAccessFile对象包含一个记录指针,用以标志当前读写处的位置。RandomAccessFile类对象可以自由移动记录指针:

long getFilePointer():获取文件记录指针的当前位置

void seek(long pos):将文件记录指针定位到pos位置

构造器

public RandomAccessFile(File file,String mode)

public RandomAccessFile(String name,String mode)

mode有四种:

r:以只读方式打开

rw打开以便读取和写入

rwd打开以便读取和写入:同步文件内容的更新

rws打开以便读取和写入:同步文件内容和元数据的更新

package IO;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile;import java.util.concurrent.locks.ReadWriteLock;import org.junit.Test;/* * RandomAccessFile:支持随机访问 * 1.既可以充当一个输入流,又可以充当一个输出流 * 2.支持从文件的开头读取、写入 * 3.支持从任意位置读取或写入(插入) * */public class TestRandomAccessFile {// 重构test3使得插入更通用(不止是一行的,整个文章的特定位置插入)@Testpublic void test4() {RandomAccessFile randomAccessFile = null;try {randomAccessFile = new RandomAccessFile(new File("HelloIO"), "rw");randomAccessFile.seek(3);// String string = randomAccessFile.readLine();// 将文章后面的字节,以每10个为单位添加到sb中StringBuffer sBuffer = new StringBuffer();byte[] bs = new byte[10];int len;while ((len = randomAccessFile.read(bs)) != -1) {// sBuffer.append(bs);//不对,因为bs是字节数组,而append参数应该是字符串sBuffer.append(new String(bs, 0, len));}randomAccessFile.seek(3);randomAccessFile.write("xy".getBytes());randomAccessFile.write(sBuffer.toString().getBytes());} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (randomAccessFile != null) {try {randomAccessFile.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}// 在文件的某个位置完成插入:/* * 先把指针移动对应位置 读出指针后面的一行到一个字符串中 把指针移到插入位置 写入操作(此时指针在写入后的最后位置正好) 把字符串写入 *  */@Testpublic void test3() {RandomAccessFile randomAccessFile = null;try {randomAccessFile = new RandomAccessFile(new File("HelloIO"), "rw");randomAccessFile.seek(3);String string = randomAccessFile.readLine();randomAccessFile.write("xy".getBytes());randomAccessFile.write(string.getBytes());} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (randomAccessFile != null) {try {randomAccessFile.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}// 在文件的某个位置进行覆盖的效果@Testpublic void test2() {RandomAccessFile randomAccessFile = null;try {randomAccessFile = new RandomAccessFile(new File("HelloIO"), "rw");randomAccessFile.seek(3);randomAccessFile.write("xy".getBytes());} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (randomAccessFile != null) {try {randomAccessFile.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}// 进行文件的读取和写入@Testpublic void test1() {// 进行文件的读取和写入RandomAccessFile r1 = null;RandomAccessFile r2 = null;try {// 读取的文件必须是存在的r1 = new RandomAccessFile(new File("hadi.txt"), "r");r2 = new RandomAccessFile(new File("file.txt"), "rw");byte[] bs = new byte[20];int len;while ((len = r1.read(bs)) != -1) {r2.write(bs, 0, len);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (r2 != null) {try {r2.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (r1 != null) {try {r1.close();} catch (IOException e) {e.printStackTrace();}}}}}

0 0
原创粉丝点击