您的位置:首页 > 编程语言 > Java开发

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

2011-05-12 21:23 671 查看
概念:
1.RandomAccessFile类 提供了 众多(最多)的 文件 访问 方法;
2.RandomAccessFile类 支持 “随机访问” 方式;//不好画图,类似于vector和iterator方式或者数组指针方式。指示器大概就跟迭代器 一样吧……
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,否则会出现异常,必须初始化为空字符串。而且每次写之前都要赋值为空字符串,不然这一次的结果是连在上一次的结果上的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: