黑马程序员技术交流社区
标题:
关于RandomAccessFile中的指针的理解
[打印本页]
作者:
dolphin
时间:
2013-10-12 03:33
标题:
关于RandomAccessFile中的指针的理解
本帖最后由 dolphin 于 2013-10-16 09:38 编辑
RandomAccessFile中提到对指针的操作,我理解不够,还希望大家多给我讲讲啊,先谢谢了!
作者:
bird_not_fat
时间:
2013-10-14 23:49
这是我对这个类的理解:自成一派的工具类RandomAccessFile
(1)这哥们帮派没混下去,直接继承的Object,它不属于IO体系,但是它归属与IO包。
它既能读,又能写。它内部封装了数组,并且通过指针对数组元素进行操作!
(2)RandomAccessFile可以通过getFilePointer()方法获取指针位置,还可以通过seek()方法改变
指针位置。skipBytes(int n)跳过多少个字节读取。不能往回跳。
(3)其实完成读写的原理就是内部封装了输入字节流和输出字节流!
(4)通过构造函数,可以看出RandomAccessFile有个很大的局限性:只能操作文件!设备只有磁盘上的文件。
内存,键盘,控制台等等设备一律不能操作。
RandomAccessFile(String fileName,String mode);
RandomAccessFile(File file,String mode);
模式 r:只读 rw:读写
(5)方法包含了InputStream和OutputStream的所有方法,还添加了读写基本数据类型的方法。
以及比较特殊的seek()方法,getFilepointer()方法等等。
方法结束时候需要关闭流close()方法。
(6)可以在文件中的任何地方写入数据(seek()方法),原位置的数据被覆盖。
RandomAccessFile对象在创建的时候如果模式为rw:若关联文件不存在,会自动创建,若已存在,不会覆盖原有文件!
RandomAccessFile对象在创建的时候如果模式为r: 若关联文件不存在,不会自动创建文件,会爆异常!
(7)可以利用与线程结合的方法,一个线程负责一段的方式,分段式的录入数据,相互不冲突。(下载文件的原理)
数据要分段,希望数据有规律,便于操作。
然后我结合多线程的知识写了个小程序,就是在一个文件中拼诗歌,希望对你有帮助^^
/**
* RandomAccessFile与多线程结合完成诗歌的拼写
* @author lt
*/
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo2 {
public static void main(String[] args) {
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile("d:\\test.txt","rw");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
WriteThread1 wt1 = new RandomAccessFileDemo2().new WriteThread1(raf);
WriteThread2 wt2 = new RandomAccessFileDemo2().new WriteThread2(raf);
WriteThread3 wt3 = new RandomAccessFileDemo2().new WriteThread3(raf);
new Thread(wt1).start();
new Thread(wt2).start();
new Thread(wt3).start();
}
public class WriteThread1 implements Runnable{
RandomAccessFile raf = null;
public WriteThread1(RandomAccessFile raf){
this.raf = raf;
}
@Override
public void run() {
System.out.println("线程1已经启动!");
//窗前明月光,疑是地上霜。一共22位
try {
String s = "床前明月光,疑是地上霜.";
raf.seek(22*0);
raf.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class WriteThread2 implements Runnable{
RandomAccessFile raf = null;
public WriteThread2(RandomAccessFile raf){
this.raf = raf;
}
@Override
public void run() {
System.out.println("线程2已经启动!");
try {
String s = "举头望明月,低头思故乡.";
raf.seek(22*1);
raf.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class WriteThread3 implements Runnable{
RandomAccessFile raf = null;
public WriteThread3(RandomAccessFile raf){
this.raf = raf;
}
@Override
public void run() {
System.out.println("线程3已经启动!");
try {
String s = "好诗好诗~";
raf.seek(22*2);
raf.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
复制代码
作者:
To
时间:
2013-10-15 18:05
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:
http://bbs.itheima.com/thread-89313-1-1.html
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2