zoukankan      html  css  js  c++  java
  • review28

    前面介绍了指向文件的输入流和输出流。随机流是既能读文件也能写文件。

    RandomAccessFile类创建的流称做随机流,与前面的输入、输出流不同的是,RandomAccessFile类既不是InputStream类的子类,也不是OutputStream类的子类。但是RandomAccessFile类创建的流既可以作为流的源,也可以作为流的目的地,换句话说,当准备对一个文件进行读写操作时,创建一个指向该文件的随机流即可,这样既可以从这个流中读取文件中的数据,也可以通过这个流写入数据到文件。

    以下是RandomAccessFile类的两个构造方法。

    RandomAccessFile(String name, String mode)参数name用来确定一个文件名,给出创建的流的源,也是流目的地。参数mode取r(只读)或rw(可读写),决定创建的流对文件的访问权利。

    RandomAccessFile(File file, String mode)参数file是一个File对象,给出创建的流的源,也是流的目的地。参数mode取r(只读)或rw(可读写),决定创建的流对文件的访问权利。

    RandomAccessFile流指向文件时,不刷新文件。

    RandomAccessFile类中有一个方法seek(long a)用来定位RandomAccessFile流的读写位置,其中参数a确定读写位置距离文件开头的字节个数。

    另外流还可以调用getFilePointer()方法获取流的当前位置。RandomAccessFile流对文件的读写比顺序读写更为灵活。

    代码展示如下所示:

    import java.io.IOException;
    import java.io.RandomAccessFile;
    
    public class Test10 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            RandomAccessFile inAndOut = null;
            int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
            
            try {
                inAndOut = new RandomAccessFile("E:/test/test03.txt", "rw");
                for(int i = 0; i < data.length; i++)
                {
                    inAndOut.writeInt(data[i]);//这是作为输出流
                }
                for(long i = data.length - 1; i >= 0; i--)
                {
                    inAndOut.seek(i * 4);
                    System.out.printf(" %d", inAndOut.readInt());//这是作为输入流
                }
                inAndOut.close();
            }
            catch (IOException e)
            {
            
            }
            
            
        }
    
    }

    程序运行后,在test03.txt文件中将会写入10个整数,然后并在控制台输出这10个整数。截图如下所示:

    需要注意的是,RandomAccessFile流的readLine()方法在读取含有非ASCII字符的文件时(比如含有汉字的文件)会出现“乱码”现象,因此,需要把readLine()读取的字符串用“iso-8859-1”编码重新编码存放到byte数组中,然后再用当前机器的默认编码将该数组转化为字符串。

    import java.io.IOException;
    import java.io.RandomAccessFile;
    
    public class Test11 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            RandomAccessFile in = null;
            try{
                in = new RandomAccessFile("E:/test/test01.txt", "rw");
                long length = in.length();
                long position = 0;
                in.seek(position);
                while(position < length)
                {
                    String str = in.readLine();
                    byte b[] = str.getBytes("iso-8859-1");
                    str = new String(b);
                    position = in.getFilePointer();
                    System.out.println(str);
                }
                in.close();
            }
            catch(IOException e){}
        }
    
    }

    程序运行之后会把test01.txt的数据读出并显示出来。

     字节流读取数据使用的是字节数组,字符流读取数据使用的是字符数组,缓冲流读取数据的时候使用的是字符串,用readLine()来实现读取一个文本行。

    随机流读取数据的时候像缓冲流一样使用readLine()方法。

     随机流与其他流不一样的地方在于它可以从指定位置开始读取数据

    总结

    从以上分析可以看出RandomAccessFile最大两个特点:

    1.可以指定位置开始操作;

    2.既可以读,也可以写;

  • 相关阅读:
    Ubuntu网卡配置
    Ubuntu软件包管理器
    更改系统语言环境
    简单泛型
    surface知识点
    RTMP协议
    直播技术之现代播放器原理
    直播技术之延迟优化
    直播技术之处理
    【转】草根老师的 linux字符设备驱动详解
  • 原文地址:https://www.cnblogs.com/liaoxiaolao/p/9456771.html
Copyright © 2011-2022 走看看