JAVA高级视频_IO输入与输出_RandomAccessFile类_笔记

 

 

概念:

1.RandomAccessFile类 提供了 众多(最多)的 文件 访问 方法;

2.RandomAccessFile类 支持 “随机访问” 方式;//不好画图,类似于vectoriterator方式或者数组指针方式。指示器大概就跟迭代器 一样吧……

3.RandomAccessFlie类 在随机读写 等长记录格式的 文件 时 有优势;//听了这一段的说明觉得指示器就是迭代器……记录格式:内 容有规律可循的格式。

4.RandomAccessFile类 仅限于 操作文件,不能 访问 其他的 IO设备,如网络、内存映像 等;

5.两种构造方式

new RandomAccessFile(f, "rw"); //read & write

new RandomAccessFile(f, "r"); //read only

//C++采用流方式读写文件和设置文件读写状态,跟这个稍微有点不一样。


 

2.编程实例:往文件中写入三名员工的信息,每个员工含有 姓名 和 年龄 两个字段(字段……数据库?),然后按照第二名,第一名,第三名的先后顺序读出员工信息。(要保证姓名的长度相同。年龄只要是整型数就不要担心长度,都是4字节)

 

/*

 *Employee.java

 */

public class Employee {

public String name = ""; //这里的成员变量竟然是public的让我很不习惯……

public int age = 0;

public static final int LEN = 8;

/**

* Method Employee

*

*

* @param name

* @param age

*

*/

public Employee(String name, int age) {

// TODO: Add your code here

if(name.length() > LEN){ //如果比规定长度长

name = name.substring(0, LEN); //用substring()方法截取规定长度的字符串

} else { //如果比规定长度短

while(name.length() < LEN){

name += "/u0000"; //用一个空字符(空格?)填充,循环至满足长度

}

}

this.name = name; //经过上述处理后,给对象赋标准的值

this.age = age;

}

}

/*
 *RandomFileTest.java
 */
import java.io.*;
public class RandomFileTest {
/**
* Method main
*
*
* @param args
*
*/
public static void main(String[] args) throws Exception {
// TODO: Add your code here
/*
*招了e1,e2,e3三个员工
*/
Employee e1 = new Employee ("张三", 23);
Employee e2 = new Employee ("lisi", 258);
Employee e3 = new Employee ("wangwu", 25);
/*
*把人家的名字和年纪(rw == 用铅笔)记到本子上
*/
RandomAccessFile ra = new RandomAccessFile("employee.txt", "rw"); //初始化为read & write
//write方法是在ra对象里写入
ra.writeChars (e1.name); //这个函数是把字符串转为字符数组;string.h的封装也许更严密些
//writeChars方法,把字符串直接转为一个一个字符
ra.writeInt (e1.age);
ra.writeChars (e2.name);
ra.writeInt (e2.age);
ra.writeChars (e3.name);
ra.writeInt (e3.age);
ra.close(); //关闭文件,好习惯好未来
//int len = 0; //记录字符数组的长度?
//byte[] buf = new byte[Employee.LEN]; //字符数组类型是byte[]……八个字符长的数组
String strName = ""; //此字符串初始化为空
RandomAccessFile raf = new RandomAccessFile("employee.txt", "r"); //初始化为read only
raf.skipBytes (Employee.LEN * 2 + 4); //跳过名字长度加int长度个字符
//len = raf.read (buf); //len被赋值为.read方法所读字符的数量,read方法是在raf对象里读。
//strName = new String (buf, 0, len); //把字符数组转回去……字符串……
for(int i = 0; i < Employee.LEN; i++) {
strName += raf.readChar();
}
System.out.println (strName.trim() + ":" + raf.readInt());//这个纯read是往后读一个字节,就是读在那个位置的年龄
raf.seek (0); //绝对定位,字符位置
//len = raf.read (buf);
//strName = new String (buf, 0, len);
strName = "";
for(int i = 0; i < Employee.LEN; i++) {
strName += raf.readChar();
}
System.out.println (strName.trim() + ":" + raf.readInt());//去掉不可见的字符
raf.skipBytes (Employee.LEN * 2 + 4);
//len = raf.read (buf);
//strName = new String (buf, 0, len);
strName = "";
for(int i = 0; i < Employee.LEN; i++) {
strName += raf.readChar();
}
System.out.println (strName.trim() + ":" + raf.readInt());
raf.close(); //关闭文件,好习惯好未来
}
}
/*
 *这个程序加上我的注释已经改的乱七八糟了,我个内牛满面啊,以后读的时候得多费心了。
 */
3.零星
(1)最终在JCreator中和文本中显示都不理想,还是CMD看得真切,自己估计还是Unicode标准与ASC标准之间的矛盾。
(2)宽字符和ASC标准之间的矛盾出现了,当名字是汉字的时候,由于字节数量翻倍,导致长度变化,指示器错位,然后年龄显示就完全不正常了。具体解决方法找writeChar和readChar。
(3)还是不正常,据说是因为使用宽字符,skipBytes又是读的是按一个字节来算的,所以LEN要乘以2.
(4)依旧不正常,strName变量不能初始化为null,否则会出现异常,必须初始化为空字符串。而且每次写之前都要赋值为空字符串,不然这一次的结果是连在上一次的结果上的。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值