黑马程序员技术交流社区

标题: JAVA IO中的RandomAccessFile [打印本页]

作者: 权跃杰    时间: 2012-7-24 12:22
标题: JAVA IO中的RandomAccessFile
有个例子,用writeInt()方法将age写入文件,用writeBytes将姓名写入文件,为什么最后我打开文件里面只有姓名的,年龄都没有。
还有readInt()方法中  文件里有张三 李四 王五三个人的年龄,为什么读的时候只读了一个年龄,是不是遇到其他的类型就停止读取了

作者: 刘海源    时间: 2012-7-24 12:25
很神奇奥
作者: 创出一片辉煌    时间: 2012-7-24 12:27
write方法如果没有进行位置改变有可能会从文件开始位置进行写出,因此可能会覆盖掉原有的内容。
readInt()方法本身就是读取一个int值,不会一次将多个int一起读入。
作者: 周玉龙    时间: 2012-7-24 12:55
RandomAccessFile(随机访问文件):自身具备读写的方法。不是流体系中的成员。
        特点:
        1,随机访问。其实就是不断的改变指针的位置。从指定的位子进行读和写。
        2,操作的是文件。
        3,既能读,又能写。
        4,该对象中维护了一个大型的字节数组,可以通过指针进行操作。
        5,可以通过getFilePointer获取指针的位置,可以通过seek设置指针的位子。
        6,该对象中维护了读取和写入的字节流。
        要想随机访问,必须要数据有规律。因为他是通过确定指针的位置来用不同的访问的方法。如readInt,readByte
        RandomAccessFile ra = new RandomAccessFile("c:\\random.txt","rw");
        如果文件不存在,则会创建,如果文件存在,不覆盖。
        writeInt();可以保证字节原样性。
        他可以对数据进行修改,而不覆盖文件。
        通过下面的例子来说明下。
package com.itheima.io

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileDemo {

        /**
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {

                writeFile();
//                readFile();
               
                randomWrite();

        }

        /*
         * 通过randomaccessFile类,完成个人信息的存储(姓名,年龄)。
         */
        public static void writeFile() throws IOException {

                // 1,创建RandomAccessFile对象。明确具体的文件,和具体的模式。rw.
                /*
                 * 如果文件不存在,则会创建, 如果文件存在,不会覆盖。
                 */
                RandomAccessFile raf = new RandomAccessFile("random.txt", "rw");

                raf.write("张三".getBytes());
                raf.writeInt(97);

                raf.write("旺财".getBytes());
                raf.writeInt(99);

                raf.write("小明".getBytes());
                raf.writeInt(102);

                raf.close();
        }
        public static void readFile() throws IOException {

                // 定义对象读取文件。
                RandomAccessFile raf = new RandomAccessFile("random.txt", "r");

                // 设置指针的位置,通过seek方法。一组加起来就是八个字节。8*0表示0位置的张三,8*1表示第二个我们存储的李四。。。而不能像你那样直一次性获得,
                raf.seek(8 * 2);

                // 获取一下文件指针
                System.out.println("pos:" + raf.getFilePointer());

                byte[] buf = new byte[4];
                // 读取四个存储到buf中。为什么是四个了,因为我们用的编码是GBK,一个汉字占两个字节。两个汉字占四个。而且Int类型的数也是占四个字节。
                //所以每四个一起编译就不会产生错误


                raf.read(buf);
                String name = new String(buf);// 字节数组转成字符串。
                System.out.println("pos:" + raf.getFilePointer());

                int age = raf.readInt();
                System.out.println(name + ":" + age);
                System.out.println("pos:" + raf.getFilePointer());

                raf.close();

        }

        // 随机写。
        public static void randomWrite() throws IOException {
                RandomAccessFile raf = new RandomAccessFile("random.txt", "rw");

               
                raf.seek(8*5);
                System.out.println("pos:"+raf.getFilePointer());
               
                raf.write("哦也".getBytes());
                raf.writeInt(113);

                raf.close();
        }


}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2