RandomAccessFile

RandomAccessFile

  1. 该类是用来专门读写文件数据。其基于指针进行读写,即总是在指针当前位置读或写字节。
  2. 两种常用创建模式:
     ~ “r”:只读模式
     ~ “rw”:读写模式
  3. 构造方法:
    ~RandomAccessFile(File file, String mode):
           创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。
    ~RandomAccessFile(String name, String mode) :
           创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。

方法:
~close() :
       关闭此随机访问文件流并释放与该流关联的所有系统资源。
~read():
       从此文件中读取一个数据字节。

RandomAccessFile raf = new RandomAccessFile("./raf.dat","rw");
/*
 * void write(int d)
 * 写出一个字节,将给定的int值对应的二进制的"低八位"写入文件
 *                                                 vvvvvvvv
 * 00000000 00000000 00000000 00000001
 */
raf.write(-1);
raf.write(2);
raf.write(3);
raf.write(4);
System.out.println("执行完毕");
raf.close();
  •  write(int d);void

    写出一个字节,将给定的int 值对应的2进制的“低八位”写入文件

RandomAccessFile raf = new RandomAccessFile("./raf.dat", "r");
/*
 * int read()
 * 读取一个字节,并以int形式返回
 * 若返回值为-1,则表示读取到了文件末尾
 * 
 * 
 * raf.write(-1);
 * -1的二进制:
 * 11111111 11111111 11111111 11111111
 * 取低八位11111111
 * 因为返回值是int,所以int的1111111是255
 */
int d = raf.read();
System.out.println(d);
d = raf.read();
System.out.println(d);
d = raf.read();
System.out.println(d);
d = raf.read();
System.out.println(d);
d = raf.read();
System.out.println(d);//文件末尾
  • Demo:复制文件
RandomAccessFile raf = new RandomAccessFile("./star3.jpg", "r");
RandomAccessFile desc = new RandomAccessFile("./star3_cp.jpg", "rw");
 
/*RandomAccessFile raf = new RandomAccessFile("./1.wav", "r");
RandomAccessFile desc = new RandomAccessFile("./1_cp.wav", "rw");*/
 
int d = -1;//记录每次读取的字节数据
long start = System.currentTimeMillis();
while( (d=raf.read())!=-1 ) {
	desc.write(d);
}
long end = System.currentTimeMillis();
System.out.println(start-end);
System.out.println("copy success");
raf.close();
desc.close();
  •  int read(byte [] data);

         一次性读取给定的字节数组长度的字节量,并存入到该数组中,返回实际读取到的字节量,若返回-1,则是文件末尾 

  •  void write(byte[] data)

         一次性将给定的字节数组中所有字节输出    

  •   void write(byte[] data,int index,int len)

         将给定的字节数组从下标index处开始的连续len个字节一次性输出 

	public static void main(String[] args) throws IOException {
		/*
		 * int read(byte [] data);
		 * 一次性读取给定的字节数组长度的字节量,并存入到该数组中,返回实际读取到的字节量,若返回-1,则是文件末尾
		 * 
		 * 
		 * void write(byte[] data)
		 * 一次性将给定的字节数组中所有字节输出
		 * 
		 * void write(byte[] data,int index,int len)
		 * 将给定的字节数组从下标index处开始的连续len个字节一次性输出 
		 * 
		 * 1byte = 8位2进制
		 * 1kb = 1024byte
		 * 1mb = 1024kb
		 * 1gb = 1024mb
		 * 1tb = 1024gb
		 */
		RandomAccessFile src = new RandomAccessFile("./h6.jpg", "rw");
		RandomAccessFile desc = new  RandomAccessFile("/h6_cp.jpg","rw");
		byte [] buf =  new byte[1024*10];
		
		int len= 0;
		long start =  System.currentTimeMillis();
		while((len=src.read(buf))!=-1) {
//			desc.write(buf);
			desc.write(buf,0,len);
		}
		long end =  System.currentTimeMillis();
		System.out.println("复制完毕,耗时:"+(end-start)+"ms");
	}
  • byte[] getBytes(String csn);

         将当前字符串按照指定字符集转换为一组字节,推荐使用这种方式转换字符串,因为按照系统默认字符集转换会导致跨平台出现乱码问题

package raf;

import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 写出字符串操作
 * @author liuyanyan
 *
 */
public class WriteStringDemo {
	public static void main(String[] args) throws IOException {
		/*
		 * 在相对路径中“./”可以不写,不写默认也是在当前目录中
		 * 
		 * 
		 * byte[] getBytes(String csn);
		 * 将当前字符串按照指定字符集转换为一组字节,推荐使用这种方式转换字符串,因为按照系统默认字符集转换会导致跨平台出现乱码问题
		 * GBK:国际编码,中文占两个字节
		 * UTF-8:无国码,对Unicode进行编码,边长编码集,英文一个字节,中文3个字节
		 * ISO8859-1:欧洲编码集,不支持中文
		 */
		RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
		String str= "我先共耦合农女噢女偶扭矩处女男";
		byte [] buf =  str.getBytes("utf-8");
		raf.write(buf);
		raf.write("解耦翁军偶军和军军军军军军军".getBytes("utf-8"));
		System.out.println("写出完毕");
		raf.close();
	}
}

 

package raf;

import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 读取字符串
 * @author liuyanyan
 *
 */
public class ReadStringDemo {
	public static void main(String[] args) throws IOException {
		RandomAccessFile raf = new RandomAccessFile("./raf.txt", "r");
		byte[] data = new byte[(int)raf.length()];
		raf.read(data);
		String str = new String(data,"utf-8");
		System.out.println(str);
		raf.close();

		
	}
}

  • void  writeInt(int i);

按四个字节将int值写入该文件,先写高字节;

  • void writeLong(long l);

按八个个字节将long值写入该文件,先写高字节;

  • void writeDouble(Double d)

按八个字节将Double值写入该文件,先写高字节;

  • void  seek(long pos);

 移动指针到指定位置

  •       int readInt(); 
package raf;

import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 读写基本数据类型,以及RAF指针的操作,
 * 
 * @author liuyanyan
 *
 */
public class RandomAccessFileDemo2 {
	public static void main(String[] args) throws IOException {
		RandomAccessFile raf = new RandomAccessFile("raf.dat","rw");
		long pos = raf.getFilePointer();
		System.out.println("pos"+raf.getFilePointer());
		/*
		 * 01111111 11111111 11111111 11111111
		 * 
		 * max>>>24
		 * 00000000 00000000 00000000 01111111
		 * max>>>16
		 * 00000000 00000000 01111111 11111111
		 * max>>>8
		 * 00000000 01111111 11111111 11111111
		 * 
		 */
		//向文件中写入int 最大值
		int max= Integer.MAX_VALUE;
		raf.write(max>>>24);
		System.out.println("pos"+raf.getFilePointer());
		raf.write(max>>>16);
		raf.write(max>>>8);
		raf.write(max);
		System.out.println("pos"+raf.getFilePointer());
		
		/*
		 * RAF提供了我们方便写出基本数据类型的相关方法
		 * 
		 */
		//一次性将给定的int值写入
		raf.writeInt(max);
		System.out.println("pos"+raf.getFilePointer());
		raf.writeLong(123L);
		System.out.println("pos"+raf.getFilePointer());
		raf.writeDouble(123.123);
		System.out.println("pos"+raf.getFilePointer());
		System.out.println("写入完毕");
		
		/*
		 * seek(long pos);void
		 * 移动指针到指定位置
		 */
		raf.seek(0);
//		System.out.println("pos"+raf.getFilePointer());
		
		//读取EOF  end of file
		/*
		 * 
		 */
		int d = raf.readInt();
		System.out.println("int:"+d);
		System.out.println("pos"+raf.getFilePointer());
		
		//读取long 
		raf.seek(8);
		long l = raf.readLong();
		System.out.println("long:"+l);
		System.out.println("pos"+raf.getFilePointer());
		
		//读取double
		double bou = raf.readDouble();
		System.out.println("double:"+bou);
		System.out.println("pos"+raf.getFilePointer());
		
		raf.seek(0);
		l = raf.readLong();
		System.out.println(l);
		System.out.println("pos"+raf.getFilePointer());
		raf.close();
	}
}
  • 简易记事本
package raf;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;

/**
 * 练习:
 * 完成一个简易记事本工具
 * 程序启动后,用户在控制台输入每一行字符串都写入到文件note.txt中,当用户输入"exit"时,程序退出
 * @author liuyanyan
 *
 */
public class NoteDemo {
	public static void main(String[] args) throws IOException {
		System.out.println("请输入字符串(输入exit退出程序)");
		Scanner scn  = new Scanner(System.in);
		RandomAccessFile raf = new RandomAccessFile("node.txt","rw");
		String str;
		while(true) {
			str = scn.nextLine();
			if("exit".equals(str)) {
				break;
			}
			byte [] buf = str.getBytes("utf-8");
			raf.write(buf);
			
			/*byte [] data = new byte[(int)raf.length()];
			raf.read(data);
			String str1 =  new String(data,"utf-8");
			System.out.println(str1);
			raf.close();*/
		}
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值