2.读取字节
<span style="color: #008000;">/**</span><span style="color: #008000;">
* 从文件中读取字节
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> RafDemo2 {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main(String[] args) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException {
RandomAccessFile raf </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("raf.dat","r"<span style="color: #000000;">);
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
* int read()
* 从文件中读取1个字节,并以int形式
* 返回.若返回值为-1则表示文件末尾
* 00000000 00000000 00000000 11111111
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">int</span> d =<span style="color: #000000;"> raf.read();
System.out.println(d);
d </span>=<span style="color: #000000;"> raf.read();
System.out.println(d);
System.out.println(</span>"读取完毕!"<span style="color: #000000;">);
raf.close();
}
}</span>
3.读写基本类型数据以及RAF基于指针的操作
<span style="color: #008000;">/**</span><span style="color: #008000;">
* 读写基本类型数据以及RAF基于指针的操作
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> RafDemo3 {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main(String[] args) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException {
RandomAccessFile raf </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("raf.dat","rw"<span style="color: #000000;">);
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
* 获取RAF指针位置,创建后从0开始(文件第
* 一个字节位置)
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">long</span> pos =<span style="color: #000000;"> raf.getFilePointer();
System.out.println(</span>"pos:"+<span style="color: #000000;">pos);
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
* 向文件中写入一个int最大值
* vvvvvvvv
* 01111111 11111111 11111111 11111111
* imax>>>24
* 00000000 00000000 00000000 01111111
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">int</span> imax =<span style="color: #000000;"> Integer.MAX_VALUE;
System.out.println(imax);
raf.write(imax</span>>>>24<span style="color: #000000;">);
System.out.println(</span>"pos:"+<span style="color: #000000;">raf.getFilePointer());
raf.write(imax</span>>>>16<span style="color: #000000;">);
raf.write(imax</span>>>>8<span style="color: #000000;">);
raf.write(imax);
System.out.println(</span>"pos:"+<span style="color: #000000;">raf.getFilePointer());
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
* void writeInt(int d)
* 将给定的int值对应的4字节一次性写出
* 等同上面四句操作
</span><span style="color: #008000;">*/</span><span style="color: #000000;">
raf.writeInt(imax);
System.out.println(</span>"pos:"+<span style="color: #000000;">raf.getFilePointer());
raf.writeLong(</span>123L<span style="color: #000000;">);
System.out.println(</span>"pos:"+<span style="color: #000000;">raf.getFilePointer());
raf.writeDouble(</span>123.123<span style="color: #000000;">);
System.out.println(</span>"pos:"+<span style="color: #000000;">raf.getFilePointer());
System.out.println(</span>"写出完毕!"<span style="color: #000000;">);
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
* void seek(long pos)
* 移动指针到指定位置
</span><span style="color: #008000;">*/</span><span style="color: #000000;">
raf.seek(</span>0<span style="color: #000000;">);
System.out.println(</span>"pos:"+<span style="color: #000000;">raf.getFilePointer());
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
* int readInt()
* 连续读取4个字节并返回该int值,若连续读取
* 4个字节的过程中发现读取到了文件末尾,此时
* 会直接抛出异常EOFException
* EOF(end of file)文件末尾
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">int</span> d =<span style="color: #000000;"> raf.readInt();
System.out.println(d);
System.out.println(</span>"pos:"+<span style="color: #000000;">raf.getFilePointer());
</span><span style="color: #008000;">//</span><span style="color: #008000;">读取long值
</span><span style="color: #008000;">//</span><span style="color: #008000;">1移动指针到long的所在位置</span>
raf.seek(8<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">2读取long的8字节还原long值</span>
<span style="color: #0000ff;">long</span> lon =<span style="color: #000000;"> raf.readLong();
System.out.println(lon);
System.out.println(</span>"pos:"+<span style="color: #000000;">raf.getFilePointer());
</span><span style="color: #0000ff;">double</span> dou =<span style="color: #000000;"> raf.readDouble();
System.out.println(dou);
System.out.println(</span>"pos:"+<span style="color: #000000;">raf.getFilePointer());
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
* 将第二个int值内容改为int最小值
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">//</span><span style="color: #008000;">1移动指针到第二个int值的开始位置</span>
raf.seek(4<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">2重写写入新的int值来覆盖原内容</span>
<span style="color: #000000;"> raf.writeInt(Integer.MIN_VALUE);
System.out.println(</span>"pos:"+<span style="color: #000000;">raf.getFilePointer());
raf.seek(</span>4<span style="color: #000000;">);
d </span>=<span style="color: #000000;"> raf.readInt();
System.out.println(d);
raf.close();
}
}</span>
4.用RAF复制文件(单字节,很慢)
<span style="color: #008000;">/**</span><span style="color: #008000;">
* 复制文件
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> CopyDemo {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main(String[] args) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException {
RandomAccessFile src </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("./movie.mp4","r"<span style="color: #000000;">);
RandomAccessFile desc </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("./movie_cp.mp4","rw"<span style="color: #000000;">);
</span><span style="color: #0000ff;">int</span> d = -1;<span style="color: #008000;">//</span><span style="color: #008000;">用于保存每次读取到的字节</span>
<span style="color: #0000ff;">long</span> start =<span style="color: #000000;"> System.currentTimeMillis();
</span><span style="color: #0000ff;">while</span>((d = src.read())!=-1<span style="color: #000000;">) {
desc.write(d);
};
</span><span style="color: #0000ff;">long</span> end =<span style="color: #000000;"> System.currentTimeMillis();
System.out.println(</span>"复制完毕!耗时:"+(end-start)+"ms"<span style="color: #000000;">);
src.close();
desc.close();
}
}</span>
5.用RAF复制文件(块读,速度快)
<span style="color: #008000;">/**</span><span style="color: #008000;">
* 通过提高每次读写的数据量,减少实际读写的次数可以提高读写效率.
* 单字节读写是随机读写,效率差
* 块读写是一组一组字节的读写,效率高
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> CopyDemo2 {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main(String[] args) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException {
RandomAccessFile src </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("movie.mp4","r"<span style="color: #000000;">);
RandomAccessFile desc </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("movie_cp.mp4","rw"<span style="color: #000000;">);
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
* int read(byte[] data)
* 一次性从文件中读取给定数组总长度的字节量,并将读取到的数据存入到该数组
* 中,返回值为实际读取到的字节量.若返回值为-1,则表示文件末尾(本次没有
* 读取到任何数据)
* void write(byte[] data)
* 一次性将给定字节数组中所有字节写入文件
*
* void write(byte[] data,int s,int len)
* 将给定字节数组从下标s处开始的连续len个字节一次性写入文件
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">//</span><span style="color: #008000;">10K</span>
<span style="color: #0000ff;">byte</span>[] data = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">byte</span>[1024*10<span style="color: #000000;">];
</span><span style="color: #0000ff;">int</span> len = -1;<span style="color: #008000;">//</span><span style="color: #008000;">每次实际读取到的字节数 </span>
<span style="color: #0000ff;">long</span> start =<span style="color: #000000;"> System.currentTimeMillis();
</span><span style="color: #0000ff;">while</span>((len = src.read(data))!=-1<span style="color: #000000;">) {
desc.write(data,</span>0<span style="color: #000000;">,len);
}
</span><span style="color: #0000ff;">long</span> end =<span style="color: #000000;"> System.currentTimeMillis();
System.out.println(</span>"复制完毕!耗时"+(end-start)+"ms"<span style="color: #000000;">);
src.close();
desc.close();
}
}</span>
6.读取文本数据
<span style="color: #008000;">/**</span><span style="color: #008000;">
* 读取文本数据
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> ReadStringDemo {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main(String[] args) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException {
RandomAccessFile raf </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("raf.txt","r"<span style="color: #000000;">);
</span><span style="color: #0000ff;">byte</span>[] data = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">byte</span>[(<span style="color: #0000ff;">int</span><span style="color: #000000;">)raf.length()];
raf.read(data);
String str </span>= <span style="color: #0000ff;">new</span> String(data,"UTF-8"<span style="color: #000000;">);
System.out.println(str);
raf.close();
}
}</span>
7.写入字符串
<span style="color: #008000;">/**</span><span style="color: #008000;">
* 使用RAF向文件中写入字符串
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> WriteStringDemo {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main(String[] args) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException {
RandomAccessFile raf </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("raf.txt","rw"<span style="color: #000000;">);
String line </span>= "夜空中最亮的星"<span style="color: #000000;">;
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
* String提供了转换为字节的方法:
* byte[] getBytes()
* 将当前字符串按照系统默认字符集转换为一组字节
*
* byte[] getBytes(String csn)
* 重载的getBytes方法要求我们传入一个
* 字符串参数表示字符集的名称,该名称
* 不区分大小写,作用是将当前字符串按照
* 给定的字符集转换为一组字节,推荐用
* 这种方式,不要按照系统默认字符集操作.
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">byte</span>[] data = line.getBytes("UTF-8"<span style="color: #000000;">);
raf.write(data);
raf.write(</span>",能否听清,".getBytes("UTF-8"<span style="color: #000000;">));
System.out.println(</span>"写出完毕!"<span style="color: #000000;">);
raf.close();
}
}</span>
8.RAF简单应用
<span style="color: #008000;">/**</span><span style="color: #008000;">
* 用户注册
* 程序启动后,要求用户输入注册信息:
* 用户名,密码,昵称,年龄
* 其中除了年龄是int值外,其余三个是String.
* 然后将该信息写入user.dat文件中保存.
*
* 每条记录固定占用100字节.
* 其中用户名,密码,昵称为字符串,各占用32字节.
* 年龄为int值固定的4字节.
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> RegDemo {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main(String[] args) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException {
Scanner scanner </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Scanner(System.in);
System.out.println(</span>"欢迎注册"<span style="color: #000000;">);
System.out.println(</span>"请输入用户名:"<span style="color: #000000;">);
String username </span>=<span style="color: #000000;"> scanner.nextLine();
System.out.println(</span>"请输入密码:"<span style="color: #000000;">);
String password </span>=<span style="color: #000000;"> scanner.nextLine();
System.out.println(</span>"请输入昵称:"<span style="color: #000000;">);
String nickname </span>=<span style="color: #000000;"> scanner.nextLine();
System.out.println(</span>"请输入年龄:"<span style="color: #000000;">);
</span><span style="color: #0000ff;">int</span> age =<span style="color: #000000;"> Integer.parseInt(scanner.nextLine());
System.out.println(username</span>+","+password+","+nickname+","+<span style="color: #000000;">age);
RandomAccessFile raf </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("user.dat","rw"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">首先将指针移动到文件末尾,以便追加新记录</span>
<span style="color: #000000;"> raf.seek(raf.length());
</span><span style="color: #008000;">//</span><span style="color: #008000;">写入用户名</span>
<span style="color: #0000ff;">byte</span>[] data = username.getBytes("UTF-8"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">扩容数组到32字节</span>
data = Arrays.copyOf(data, 32<span style="color: #000000;">);
raf.write(data);
</span><span style="color: #008000;">//</span><span style="color: #008000;">写密码</span>
data = password.getBytes("UTF-8"<span style="color: #000000;">);
data </span>= Arrays.copyOf(data, 32<span style="color: #000000;">);
raf.write(data);
</span><span style="color: #008000;">//</span><span style="color: #008000;">写昵称</span>
data = nickname.getBytes("UTF-8"<span style="color: #000000;">);
data </span>= Arrays.copyOf(data, 32<span style="color: #000000;">);
raf.write(data);
</span><span style="color: #008000;">//</span><span style="color: #008000;">写年龄</span>
<span style="color: #000000;"> raf.writeInt(age);
System.out.println(</span>"pos:"+<span style="color: #000000;">raf.getFilePointer());
System.out.println(</span>"注册完毕!"<span style="color: #000000;">);
raf.close();
}
}</span>
<span style="color: #008000;">/**</span><span style="color: #008000;">
* 将user.dat文件中的用户信息显示到控制台
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> ShowAllUserDemo {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main(String[] args) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException {
RandomAccessFile raf </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("user.dat","r"<span style="color: #000000;">);
</span><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0;i<raf.length()/100;i++<span style="color: #000000;">) {
</span><span style="color: #0000ff;">byte</span>[] data = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">byte</span>[32<span style="color: #000000;">];
raf.read(data);
String username </span>= <span style="color: #0000ff;">new</span> String(data,"UTF-8"<span style="color: #000000;">).trim();
raf.read(data);
String password </span>= <span style="color: #0000ff;">new</span> String(data,"UTF-8"<span style="color: #000000;">).trim();
raf.read(data);
String nickname </span>= <span style="color: #0000ff;">new</span> String(data,"UTF-8"<span style="color: #000000;">).trim();
</span><span style="color: #0000ff;">int</span> age =<span style="color: #000000;"> raf.readInt();
System.out.println(username</span>+","+password+","+nickname+","+<span style="color: #000000;">age);
System.out.println(</span>"pos:"+<span style="color: #000000;">raf.getFilePointer());
}
raf.close();
}
}</span>
<span style="color: #008000;">/**</span><span style="color: #008000;">
* 完成修改昵称操作
*
* 程序启动后要求输入用户名和新的昵称.然后
* 修改user.dat文件中该用户的昵称.
* 若输入的用户名在user.dat文件中不存在则输出
* 提示信息:该用户不存在!
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> UpdateDemo {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main(String[] args) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException {
Scanner scanner </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Scanner(System.in);
System.out.println(</span>"请输入用户名:"<span style="color: #000000;">);
String username </span>=<span style="color: #000000;"> scanner.nextLine();
System.out.println(</span>"请输入新的昵称:"<span style="color: #000000;">);
String nickname </span>=<span style="color: #000000;"> scanner.nextLine();
RandomAccessFile raf </span>= <span style="color: #0000ff;">new</span> RandomAccessFile("user.dat","rw"<span style="color: #000000;">);
</span><span style="color: #0000ff;">boolean</span> updated = <span style="color: #0000ff;">false</span>;<span style="color: #008000;">//</span><span style="color: #008000;">是否修改过信息</span>
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0;i<raf.length()/100;i++<span style="color: #000000;">) {
</span><span style="color: #008000;">//</span><span style="color: #008000;">移动到每条记录的开始位置</span>
raf.seek(i*100<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">读取用户名</span>
<span style="color: #0000ff;">byte</span>[] data = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">byte</span>[32<span style="color: #000000;">];
raf.read(data);
String name </span>= <span style="color: #0000ff;">new</span> String(data,"UTF-8"<span style="color: #000000;">).trim();
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(name.equals(username)) {
</span><span style="color: #008000;">//</span><span style="color: #008000;">移动指针到昵称位置</span>
raf.seek(i*100+64<span style="color: #000000;">);
data </span>= nickname.getBytes("UTF-8"<span style="color: #000000;">);
data </span>= Arrays.copyOf(data, 32<span style="color: #000000;">);
raf.write(data);
System.out.println(</span>"修改完毕!"<span style="color: #000000;">);
updated </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
}
}
</span><span style="color: #0000ff;">if</span>(!<span style="color: #000000;">updated) {
System.out.println(</span>"该用户不存在!"<span style="color: #000000;">);
}
raf.close();
}
}</span>
RandomAccessFile java IO
标签:break 扩容 dat文件 can 简单 system scan dem 下标
本文系统来源:https://www.cnblogs.com/hello4world/p/12129580.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!