随机读写文件内容之RandomAccessFile类相关

来源:互联网 发布:淘宝宝贝排名查询软件 编辑:程序博客网 时间:2024/05/22 15:26

//重点掌握:用RandomAccessFile实现两个数组分别读取同一个文件的不同部分,最后再拼接成一个数组并打印出来.



//a.学会使用java.util.Arrays.copyOf(source,newLength),作用是:将源数据复制并扩容,返回一个包含源数组数据的新数组;

//b.学会使用java.lang.System.arraycopy(src,srcStartPosition,dest,destStartPosition,numbersToCopy)

作用:将源数据(src)   中的指定数量(numbersToCopy)   的数据copy到目标数组(dest)   中的指定位置(destStartPosition).

//Java使用的编码方法是UTF-16BE(utf-16be),一个字符都是2个字节,不管是全角还是半角.

File file=new File("C:\\Users\\Administrator\\Desktop\\想.txt");

try {
RandomAccessFile raf=new RandomAccessFile(file, "rw");
long length=raf.length();
byte[] bs=new byte[(int)length/2];
byte[] c=new byte[(int)length/2];

System.out.println(length);
raf.read(bs);
raf.read(c);
int bsl=bs.length;
int cl=c.length;
bs=Arrays.copyOf(bs, bsl+cl);
System.arraycopy(c, 0, bs, bsl, cl);
String a=new String(bs,"gbk");

System.out.println(a);

raf.close();


} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();

}


java.io.File类用于表示文件(目录);

File类只用于表示文件(目录)的信息(名称、大小等),不能用于文件内容的访问。

而RandomAccessFile类则用于对文件内容的随机读取。支持随机访问文件,可以访问文件的任意位置。


1.Java文件模型:在硬盘上的文件是按照byte byte byte...的字节排列存储的,是数据的集合。

2.打开文件模式(mode):"rw"(可读可写)、"r”(只读).  

构造器:RandomAccessFile raf=new RandomAccessFile(file,"rw");

文件指针:打开文件时,指针在开头,即pointer=0.

3.读方法:

int a=raf.read();-->读取一个字节,读取后指针指到第二个字节,pointer=1.

4.写方法:

raf.write(int);(后8位)-->写入一个字节,写入后指针指到第二个字节,pointer=1.

5.读写完毕后要记得关闭与文件相关的流及系统资源.raf.close();


byte--字节   读出与写入的基本单元,一个字节占8位.(存储的基本单元)

char--字符   1 个字符占两个字节

 short--短整型 1 个短整型占2 个字节

int--整型  1个整型占4个字节

float--单精度浮点型 1 个单精度浮点型数也占4个字节

long--长整型  1个长整型占8个字节

double--双精度浮点型 1个双精度浮点型数也占8个字节

6.如何写入一个int值: writeInt(int v)

write((v >>> 24) & 0xFF);
        write((v >>> 16) & 0xFF);
        write((v >>>  8) & 0xFF);
        write((v >>>  0) & 0xFF);
 

(先将最高的8位右移到最低8位,左边全部补0,再写入最后8位)

7.raf.getFilePointer():返回当前的指针指向的位置

raf.seek(10):将指针指向第10个字节所在位置

raf.length():返回文件的长度


raf.write(int v):写入一个字节

raf.writeByte(int v):写入一个byte

raf.writeChar(int v):写入一个字符

raf.writeChars(String s):写入一个字符串,任意一人字符均为两个字节

raf.writeShort(int v):写入一个短整型,

public final void writeShort(int v) throws IOException {
        write((v >>> 8) & 0xFF);
        write((v >>> 0) & 0xFF);
        //written += 2;
    }

raf.writeInt(int v):写入一个int

raf.writeFloat(float f):写入一个float.[调用 writeInt(Float.floatToIntBits(v));]


raf.writeDouble(double d):写入一个double.[仍然是调用writeLong(Double.doubleToLongBits(v))]

raf.write(byte[] b):写入一个byte[],所以写入一个字符串时可以先转化成字节数组后再写入,也可以直接调用raf.writeChars(String s)

raf.writeBoolean(boolean b):写入一个布尔值



0 0