RandomAccessFile类的使用

使用RandomAccessFile操作文件内容

这个类是对内容进行操作的,但是操作起来比较麻烦,所有做一定的了解就行;
具体代码:

package bufferReader;   
import java.io.IOException;
import java.io.RandomAccessFile;   
public class RandomAccessFileTest {
    public static void main(String[] args) {
        RandomAccessFile ra=null;
        try {
             ra=new RandomAccessFile("e:\\myeclipse 2015 workplace\\testfile\\test5.txt", "rw");
            //这一句会出现乱码,为什么?
            ra.writeBytes("randomaccessfile的读写模式");
            ra.write("不会出现乱码".getBytes());
            ra.writeBytes("hello world");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(ra!=null){
                try {
                    ra.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

说一下:流的概念,在程序里面,所有的数据都是以流的形式进行传输的,当内容需要数据的时候,就使用输入流读取数据,同样使用输出流将内存的数据保存到文件里面。
InputStream,OutputSTraem是最大的字节流父类,但是他是抽象类,一次需要使用子类实例进行实例化。这个其实也就是这个类的设计了,使用到多态性。这个字节流可以将数据从流中读取和将数据写到流里面,但是无法操作我们的文件,这个也就是我们为什么实例化的时候使用到FilleInputStream/FileOutputStream这个子类的原因,使用多态性进行数据到文件的存储,中间的就是我们的流,其实就是将文件File的功能赋予到输入输出流。

对IO的理解

  1. 首先明白,流,文件操作是不一样的,jvm内存的数据都是以流的形式进行读取和存储的,也就说,程序需要的数据是从流里面读取,将数据缓存也是写到流里面的。流其实就是一个中间驿站,那么,流到文件以及文件到流的操作怎么实现?就是使用的FileInptStream和FileOutputStream进行操作,这两也是输入输出流的子类,利用多态性就可以使得输入输出流的对象可以进行数据到文件的操所(本来就是数据到流或者流到数据,文件类是文件到流和流到文件);这个流其实是被装饰过了。IO里面体现了很多的设计模式,多态性是最显而易见的。
  2. FileInputStream,就是将文件读取到流里面;之后我们如果想要得到文件里面的数据的话,就直接利用它这个类里面提供的方法就可以将数据写到指定的内容里面,inputstream就是写到字节数组里面;同理,我们的ByteArrayIputStream其实就是将数据读取到流里面,数据是”字节数组”类型,其实这个和File是一样的,XxxInputStream里面的Xxx前面就是数据类型。同理,ByteArrayOutputStream其实就是将数据写到流里面的对象。使用它提供的方法将需要写到字节数组的数据使用write(“需要的数据”.getBytes());
  3. 从File和ByteArray这两个类其实就知道IO的设计模式了,就是将某个形式的数据读取或者写入到流里面,File的话就是将数据从文件里面读取写到流里面或者将数据从流里面写到文件,字节数组也一样。
  4. 我们其实还有一个类需要掌握,那就是InputStreamReader / OutputStreamWriter ,这个类支持将字节流转换成字符流。所以我们可以很简单的解决一些中文乱码的问题,一般来说,将字节读取后转换成字符会出现乱码,或者是受到字节数组的大小的限制,但是字符流的读取是没有这两个问题的,所以,当需要将我们的字节流读取变成我们的字符流的时候,最好就是使用我们的这个中间的类进行一下包装,使得我们的读取和存储没有乱码的问题。具体大代码在下面的例子里面就可以很好的体现出来了:

例子代码:

package bufferReader;  
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;   
public class SystemTest {
    public static void main(String[] args) throws IOException  {
        SystemTest st=new SystemTest();
        st.getByGood();

    }
    public  void getByByte() throws IOException{
        InputStream in=System.in;//从键盘读取数据输入
        int temp=0;
        byte b[]=new byte[1024];
        System.out.println("请输入内容!");
        while((temp=in.read(b))!=-1){
            System.out.println(new String(b,0,temp));
        }
        //次方法有缺陷,字节数组大小的限制以及中文乱码的限制(中文乱码是当字节数组是奇数的时候只读取一般的中文 )
    }
    public void getByOther() throws IOException{
        InputStream in=System.in;//从键盘读取数据输入
        StringBuffer sb=new StringBuffer();
        int temp=0;

        System.out.println("请输入内容!");
        while((temp=in.read())!=-1){
            //0-255其实包括了我们的字母和所有的符号?所有可以将数字和字母或者符号进行等价
            char c=(char)temp;
            if(c=='\n'){
                break;
            }
            sb.append(c);    
        }
        System.out.print(sb);
        //这个方法的缺陷就是中文输入会造成乱码。原因就是这个只能每次读取一个字节,也就inputstream这类本身方法的缺陷。
    }
    public void getByGood() throws IOException{
        BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入内容:");
        System.out.println(buf.readLine());
        //这个方法输入没有限制,没有中文乱码的问题。
        //对于InputStream来说,其read要么受到字节数组大小的影响,要么每次只能读取一个字节,很是不方便.BufferedReader一次将数据直接读取到缓冲区,解决了意以上问题
    }
}
  1. 由这个Scanner的构造方法我们知道,这个工具很是强大,它可以直接扫面很多的文件类型,IO的操作基本都包括了。它简直就是一个神器,可以省了我们直接使用IO操作的很多麻烦