# RandomAccessFile #
1. RandomAccessFile读写文件数据的类
package raf;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* java.io.RandomAccessFile
* 用来读写文件数据的类,其基于指针对文件数据进行读写操作
* @author Cole
* 2018年11月28日
*/
public class RandomAccessFileDemo {
public static void main(String[] args) throws IOException {
/*
* RandomAccessFile创建有两种模式:
* r:只读模式,只读取文件,不会写入内容
* rw:读写模式.对文件可以读,也可以写
*
* 常见构造方法:
* RandomAccessFile(String path,String mode)
* RandomAccessFile(File file,String mode)
* mode:创建的模式(r,rw)
*/
/*
* 对当前目录下的raf.dat文件进行读写操作
* 对于"rw"模式创建时,若指定的文件不存在时会自动创建出来,
* 若为"r"只读模式时,若指定的文件不存在,
* 则会直接抛出异常:"java.io.FileNotFoundException: raf.dat"
*/
RandomAccessFile raf = new RandomAccessFile("raf.dat","rw");
raf.write(97);
System.out.println("写出完毕");
raf.close();
}
}
2. ReadDemo 从文件中读取一个字节
package raf;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 从文件中读取一个字节
* @author Cole
* 2018年11月28日
*/
public class ReadDemo {
public static void main(String[] args) throws IOException {
/*
* 从raf.dat文件中读取1个字节
*/
RandomAccessFile raf = new RandomAccessFile("raf.dat","r");
int d = raf.read();
System.out.println(d);
d = raf.read();
System.out.println(d);
raf.close();
}
}
3. CopyDemo 文件复制
package raf;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 文件复制
* @author Cole
* 2018年11月28日
*/
public class CopyDemo {
public static void main(String[] args) throws IOException {
//创建一个RAF用于读取源文件
RandomAccessFile src = new RandomAccessFile("源文件名", "r");
//再创建一个RAF用于向复制文件中写
RandomAccessFile desc = new RandomAccessFile("新文件名", "rw");
//用于记录每次读取到的字节
int d = -1;
while((d = src.read()) != -1) {
desc.write(d);
}
System.out.println("复制完毕");
src.close();
desc.close();
}
}
3. CopyDemo2 文件复制
package raf;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 传统的机械硬盘由于其物理特性决定这单字节读写效率差
* 但是快读写效率是可以保证的
*
* 所以我们通过提高每次读取的数据量,减少实际读写的次数
* 可以提高读写效率
* 随机读写:通常是单字节读写
* 块读写:一次读写一组字节的模式
* @author Cole
* 2018年11月28日
*/
public class CopyDemo2 {
public static void main(String[] args) throws IOException {
RandomAccessFile src = new RandomAccessFile("bee.png","r");
RandomAccessFile desc = new RandomAccessFile("bee2,png","rw");
/*
* int read(byte[] data)
* 一次性从文件中读取给定的字节数组总长度的字节量
* 并将读取的字节存入到该数组中
* 返回值为实际读取到的字节量
* 若返回值为-1,表示读取到了文件末尾,本次没有读到
*
* void write(byte[] data)
* 一次性将给定的字节数组中的所有字节写入文件
*
* void write(byte[] data, )
* 将给定字节数组从下标start处开始的连续len个字节
* 写入到文件中
*/
//10k
byte[] data = new byte[1024*10];
//每次实际读取到的字节量
int len = -1;
long start = System.currentTimeMillis();
while((len = src.read(data)) !=-1) {
desc.write(data,0,len);
}
long end = System.currentTimeMillis();
System.out.println("复制完毕!耗时:"+(end-start)+"ms");
src.close();
desc.close();
}
}
5. WriteString 写入文本数据
package raf;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 写入文本数据
* @author Cole
* 2018年11月29日
*/
public class WriteStringDemo {
public static void main(String[] args) throws IOException {
RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
String str = "哈哈哈~";
byte[] data = str.getBytes();
raf.write(data);
str = "一二三";
str = "一二三";
/*
* String 提供了将字符串转换为字节的方法:
* byte[] getByte()
* 按照系统默认字符集将当前的字符串转换为对应的字节
* 不推荐这种方式,以来系统默认字符集不利于与跨平台
*
* byte[] getByte(String csn)
* 按照指定的字符集转换为一组字节
* 常见字符集:
* GBK:国标编码,其中英文1字节,中文2字节
* UTF-8:Unicode 的字符集编码,其中英文1字节,中文3字节.UTF-8支持世界流行的所有文字所以也称为万国码.互联网常用字符集
* ISO08859-1:一种欧洲的编码集,不支持中文
*/
data = str.getBytes("utf-8");
}
}
6. ReadString 读取文本数据
package raf;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 读取文本数据
* @author Cole
* 2018年11月29日
*/
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(byte[] data)
* 按照系统默认字符集转换为字符串(不推荐)
* String(byte[] data,String csn)
* 按照指定的字符集转换为对应字符串
*/
String str = new String(data, "utf-8");
System.out.println(str);
raf.close();
}
}
7. 简易记事本工具
package raf;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;
/**
* 简易记事本工具
*
* 程序启动后,要求用户输入一个文件名,然后开始对文件进行写操作
* 之后用户输入的每行字符串都写入到该文件中,当用户输入了单词"exit"时,程序退出
* @author Cole
* 2018年11月29日
*/
public class Note {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入文件名");
String name = scanner.nextLine();
RandomAccessFile note = new RandomAccessFile(name+".txt", "rw");
System.out.println("请输入文字");
while(true) {
String string = scanner.nextLine();
if ("exit".equals(string)) {
break;
}
byte[] data = string.getBytes("gbk");
note.write(data);
}
System.out.println("关闭");
note.close();
}
}
8. RandomAccessFileDemo2写基本数据类型
package raf;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 读写基本类型数据,以及RAF如何基于指针进行读写操作
* @author Cole
* 2018年11月29日
*/
public class RandomAccessFileDemo2 {
public static void main(String[] args) throws IOException {
RandomAccessFile raf = new RandomAccessFile("raf.dat", "rw");
//向文件中写入一个int最大值
int max = Integer.MAX_VALUE;
/*
* 01111111 11111111 11111111 11111111
* max>>>24
* 00000000 00000000 00000000 01111111
* write 默认读1个字节
*/
//raf.write(max>>>24);
//raf.write(max>>>16);
//raf.write(max>>>8);
//raf.write(max);
/*
* void writeInt(int d)
* 一次性写入4字节,将给定的int值写出
*/
raf.writeInt(max);
/*
* 对应的基本数据类型都提供了写操作
*/
raf.writeDouble(123.123);
raf.writeLong(123L);
System.out.println("写入完毕");
raf.close();
}
}
10. 完成用户注册功能
package raf;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
import java.util.Scanner;
/**
* 完成用户注册功能
* 要求用户输入注册信息包括:用户名,密码,昵称,年龄
* 其中前三个为字符串,年龄为int值
* 每个用户信息都写入到user.dat文件中保存
*
* 设计
* 每条记录占用固定的100字节
* 其中:用户名,密码.昵称各占32字节,年龄4字节
*
* 字符串故意留白有利于后期修改数据,并且格式固定,长度固定,
* 读取效率高但是会有部分空间上的浪费
* @author Cole
* 2018年11月29日
*/
public class RegDemo {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.println("欢迎注册!");
System.out.println("请输入用户名:");
String username = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine();
System.out.println("请输入昵称:");
String nickname = scanner.nextLine();
System.out.println("请输入年龄:");
int age = Integer.parseInt(scanner.nextLine());
RandomAccessFile raf = new RandomAccessFile("user.dat", "rw");
//先将指针移到末尾处
raf.seek(raf.length());
//写用户名
//1.将用户名转换为一组字节
byte[] data = username.getBytes("UTF-8");
//2.将数组扩容到32字节
data = Arrays.copyOf(data, 32);
//将32字节写入文件
raf.write(data);
//写密码
data = password.getBytes("UTF-8");
data = Arrays.copyOf(data, 32);
raf.write(data);
//写昵称
data = nickname.getBytes("UTF-8");
data = Arrays.copyOf(data, 32);
raf.write(data);
//写年龄
raf.writeInt(age);
//获取当前指针位置
System.out.println("pos:"+raf.getFilePointer());
System.out.println("注册完毕");
raf.close();
}
}
11. 读出用户信息
package raf;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 将user.dat中每个用户信息读出,并输出到控制台
* @author Cole
* 2018年11月29日
*/
public class ShowAllUserDemo {
public static void main(String[] args) throws IOException {
RandomAccessFile raf = new RandomAccessFile("user.dat", "r");
for (int i = 0; i < raf.length()/100; i++) {
//读取用户名
//1读取32字节
byte[] data = new byte[32];
raf.read(data);
//2.将其还原为字符串
String username = new String(data, "UTF-8").trim();
//读取密码
raf.read(data);
String password = new String(data,"UTF-8").trim();
//读取昵称
raf.read(data);
String nickname = new String(data,"UTF-8").trim();
//读取年龄
int age = raf.readInt();
System.out.println(username+","+password+","+nickname+","+age);
}
raf.close();
}
}
11. 修改用户信息
package raf;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
import java.util.Scanner;
/**
* 修改昵称
* 程序启动后,要求用户输入用户名及新的昵称,然后对user.dat文件中
* 该用户的昵称进行修改,如文件中没有此用户则提示:
* 没有此用户
* 实现思路:
* 循环读取user.dat文件中的每条记录中的用户名,然后与用户输入的
* 用户名进行比较,若不是则进行下一次循环,若是该用户则将指针移动到
* 该条记录的昵称位置,然后重写将新的昵称以32位字节形式写入以覆盖原昵称
* 完成修改操作.
* 若循环完毕后仍然没有匹配到用户,则最终提示:没有此用户
* @author Cole
* 2018年11月29日
*/
public class UpdateDemo {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = scanner.nextLine();
System.out.println("请输入新昵称:");
String newNickname = scanner.nextLine();
RandomAccessFile raf = new RandomAccessFile("user.dat", "rw");
//表示是否修改了数据
boolean updata = false;
for (int i = 0; i < raf.length()/100; i++) {
raf.seek(100*i);
//读取用户名
byte[] data = new byte[32];
raf.read(data);
String name = new String(data, "UTF-8").trim();
if (name.equals(username)) {
//找到了,将指针移动到昵称的位置
raf.seek(100*i+64);
data = newNickname.getBytes("UTF-8");
data = Arrays.copyOf(data, 32);
raf.write(data);
//修改成功
updata = true;
break;
}
}
if (updata) {
System.out.println("修改成功");
}else {
System.out.println("没有此用户");
}
raf.close();
}
}
## [返回SE](./SE.html) [返回主页](./index.html) ##
一键复制
编辑
Web IDE
原始数据
按行查看
历史