import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;public class AccessFileRandom {
public static void main(String args[]){
try{
//RandomAccessFile
RandomAccessFile file = new RandomAccessFile("d:/test1.txt","rw");
file.writeBoolean(true);
file.writeInt(12345);
file.writeInt(7890);
file.writeLong(10000);
file.writeFloat(.001f);
file.seek(5);
System.out.println(file.readInt());
file.close();

            //FileOutputStream
FileOutputStream fos = new FileOutputStream("d:/test.txt");
for (int i=10000;i<10002;i++){
fos.write(i);
}
fos.close();
RandomAccessFile raf = new RandomAccessFile("d:/test.txt","r");
raf.seek(1);
int i=raf.read();
raf.close();
System.out.println(i);

}catch(IOException e){

}
}
}

解决方案 »

  1.   

    1.boolean虽然是1bit数据,但是实际存储时是要用到1个字节的,然后int在java中是占用4个字节的,所以第一个7890你应该能理解吧;
    2.因为FileOutputStream中,write(int b)是写入低位的8位(1个字节),其余24位全部丢弃,然后RandomAccessFile的Read方法是读入一个字节,所以你seek(1)后读入的是17,你可以试下,你seek(0)是16,然后seek(2),因为已经到达文件末尾,所以你再读取则返回-1。
      

  2.   

    答:
    1)在d:/test1.txt中你写的字节流如下:
      1(第0个字节,是表示true)   xxxx(第1-4个字节,这四个字节是整数值:12345的四个字节) yyyy(第5-8个字节,这四个字节是整数值:7890的四个字节) wwwwwwww(第9-16个字节,这八个字节是长整数值:10000的八个字节) zzzzzzzz(第17-24个字节,这八个字节是float:.001f的八个字节)
    因此:你的
    file.seek(5); 
    //<==正好是yyyy(第5-8个字节,这四个字节是整数值:7890的四个字节)System.out.println(file.readInt()); //<==因此:当然打出:7890了2)for (int i=10000;i <10002;i++){ 
    fos.write(i); 

    代码往文件中写入的实际上是两个字节:16(第0个字节) 17(第1个字节)
    当:raf.seek(1); 
    int i=raf.read(); 
    时,读出的第1个字节  17值
      

  3.   

    4楼file.wrteFloat(.001f); 
    zzzzzzzz(第17-24个字节,这八个字节是float:.001f的八个字节) 说法不对,应该是float写入4个字节
    不过,还是要感谢楼上的指导。
    结了。