IO:RandomAccessFile类
之前的File类只是针对文件本身进行操作的,而如果相对文件内容进行操作,则可以使用RandomAccessFile类,此类属于随即读取类,可以随机的读取一个文件中指定位置的数据。
因为在文件中,所有得内容都是按照字节存放的,都有固定的保存位置。
构造函数:
public RandomAccessFile(File file,String mode)throws FileNotFoundException
实例化此类的时候需要传递File类。告诉程序应该操作的是哪个文件,之后有个模式,文件的打开模式,常用的两种模式:
- r:读
- w:写
- rw:读写,如果使用此模式,如果文件不存在,则会自动创建
先写信息:
1 import java.io.File;
2 import java.io.IOException;
3 import java.io.RandomAccessFile;
4
5 public class Test9 {
6 public static void main(String[] args) throws IOException {
7 File f = new File("d:" + File.separator+"test.txt");
8 RandomAccessFile raf=new RandomAccessFile(f,"rw");//读写模式,如果该路径不存在会自动创建
9 String name1="jim";
10 int age1 =20;
11 String name2="Tom";
12 int age2=30;
13 raf.writeBytes(name1);
14 raf.writeInt(age1);
15 raf.writeBytes(name2);
16 raf.writeInt(age2);
17 raf.close();
18 }
19 }
然后读文件:
1 import java.io.File;
2 import java.io.IOException;
3 import java.io.RandomAccessFile;
4
5 public class Test10 {
6 public static void main(String[] args) throws IOException {
7 File f = new File("d:" + File.separator+"test.txt");
8 RandomAccessFile raf=new RandomAccessFile(f,"r");//以读模式打开
9 raf.skipBytes(7);//跳过第一个人的信息
10 byte[] bs=new byte[3];
11 for(int i=0;i<bs.length;i++){
12 bs[i]=raf.readByte();
13 }
14 String name2=new String(bs);
15 int age2=raf.readInt();
16 System.out.println(name2+" "+age2);
17
18 raf.seek(0);//指针回到文件开头,读取第二个人的信息
19 for(int i=0;i<bs.length;i++){
20 bs[i]=raf.readByte();
21 }
22 String name1=new String(bs);
23 int age1=raf.readInt();
24 System.out.println(name1+" "+age1);
25 }
26 }
另外:可能有的同学输入的是中文,那么使用getBytes()转换,会占3个字节(取决你的本地编码,如果用Eclipse可设置成UTF-8),咦?java里面中文不是占两个字节吗?怎么会变成3个字节呢?其实这不是一个概念,java默认字符编码的是unicode,确实占两个字节,但是在String换转byte[]时用的getBytes()默认用的编码进行转换,那么就会占3个字节,unicode和UTF-8不是一个概念,仔细观察的话会发现getBytes()方法有另外的重载getBytes("……"),例如通过getBytes("gbk"),这是转化的中文就会变成两字节了。