之前的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"),这是转化的中文就会变成两字节了。