java io 一些总结

来源:互联网 发布:软件补丁 编辑:程序博客网 时间:2024/05/18 20:09

首先,java io分为两大阵营,字节流,字符流。结构图如下:
java io


一些常用类的用法以及注意点:

  • IO流(FileInputStream)
FileInputStream fis = new FileInputStream("aaa.txt");   //创建一个文件输入流对象,并关联aaa.txtint b;                                                  //定义变量,记录每次读到的字节while((b = fis.read()) != -1) {                         //将每次读到的字节赋值给b并判断是否是-1    System.out.println(b);                              //打印每一个字节}fis.close();                                            //关闭流释放资源

  • IO流(read()方法返回值为什么是int)
    答:因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111。那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上。24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型。

  • IO流(FileOutputStream)
FileOutputStream fos = new FileOutputStream("bbb.txt"); //如果没有bbb.txt,会创建出一个//fos.write(97);                        //虽然写出的是一个int数,但是在写出的时候会将前面的240去掉,所以写出的一个bytefos.write(98);fos.write(99);fos.close();

  • IO流(拷贝图片)
FileInputStream fis = new FileInputStream("01.mp3");    //创建输入流对象,关联01.mp3FileOutputStream fos = new FileOutputStream("copy.mp3");//创建输出流对象,关联copy.mp3int b;while((b = fis.read()) != -1) {    fos.write(b);}fis.close();fos.close();

  • IO流(定义小数组的标准格式)
FileInputStream fis = new FileInputStream("01.mp3");FileOutputStream fos = new FileOutputStream("copy.mp3");int len;byte[] arr = new byte[1024 * 8];                    //自定义字节数组while((len = fis.read(arr)) != -1) {//fos.write(arr);fos.write(arr, 0, len);                         //写出字节数组写出有效个字节个数}fis.close();fos.close();

  • IO流(BufferedInputStream和BufferOutputStream拷贝)
FileInputStream fis = new FileInputStream("01.mp3");            //创建文件输入流对象,关联致01.mp3BufferedInputStream bis = new BufferedInputStream(fis);         //创建缓冲区对fis装饰FileOutputStream fos = new FileOutputStream("copy.mp3");        //创建输出流对象,关联copy.mp3BufferedOutputStream bos = new BufferedOutputStream(fos);       //创建缓冲区对fos装饰int b;while((b = bis.read()) != -1) {         bos.write(b);}bis.close();                        //只关装饰后的对象即可bos.close();

  • IO流(flush和close方法的区别)
    答:
    flush()方法:
    用来刷新缓冲区的,刷新后可以再次写出 。
    close()方法:
    用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出 。

  • IO流(字节流读写中文)
  • 字节流读取中文的问题
    • 字节流在读中文的时候有可能会读到半个中文,造成乱码
  • 字节流写出中文的问题
    • 字节流直接操作的字节,所以写出中文必须将字符串转换成字节数组
    • 写出回车换行 write(“\r\n”.getBytes());

  • IO流(流的标准处理异常代码1.6版本及其以前)
        FileInputStream fis = null;        FileOutputStream fos = null;        try {            fis = new FileInputStream("aaa.txt");            fos = new FileOutputStream("bbb.txt");            int b;            while((b = fis.read()) != -1) {                fos.write(b);            }        } finally {            try {                if(fis != null)                    fis.close();            }finally {                if(fos != null)                    fos.close();            }        }
  • IO流(流的标准处理异常代码1.7版本)
    try(            FileInputStream fis = new FileInputStream("aaa.txt");            FileOutputStream fos = new FileOutputStream("bbb.txt");            MyClose mc = new MyClose();        ){            int b;            while((b = fis.read()) != -1) {                fos.write(b);            }        }

原理:
在try()中创建的流对象必须实现了AutoCloseable这个接口,如果实现了,在try后面的{}(读写代码)执行后就会自动调用,流对象的close方法将流关掉


  • IO流(图片加密)
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.jpg"));        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.jpg"));        int b;        while((b = bis.read()) != -1) {            bos.write(b ^ 123);        }        bis.close();        bos.close();

  • IO流(字符流FileReader)
        FileReader fr = new FileReader("aaa.txt");              //创建输入流对象,关联aaa.txt        int ch;        while((ch = fr.read()) != -1) {                         //将读到的字符赋值给ch            System.out.println((char)ch);                       //将读到的字符强转后打印        }        fr.close();

  • IO流(字符流FileWriter)
        FileWriter fw = new FileWriter("aaa.txt");        fw.write("aaa");        fw.close();

  • IO流(字符流的拷贝)
    FileReader fr = new FileReader("a.txt");    FileWriter fw = new FileWriter("b.txt");    int ch;    while((ch = fr.read()) != -1) {        fw.write(ch);    }    fr.close();    fw.close();

  • IO流(自定义字符数组的拷贝)
        FileReader fr = new FileReader("aaa.txt");          //创建字符输入流,关联aaa.txt        FileWriter fw = new FileWriter("bbb.txt");          //创建字符输出流,关联bbb.txt        int len;        char[] arr = new char[1024*8];                      //创建字符数组        while((len = fr.read(arr)) != -1) {                 //将数据读到字符数组中            fw.write(arr, 0, len);                          //从字符数组将数据写到文件上        }        fr.close();                                         //关流释放资源        fw.close(); 

  • IO流(带缓冲的字符流)
        BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));  //创建字符输入流对象,关联aaa.txt        BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));  //创建字符输出流对象,关联bbb.txt        int ch;                     while((ch = br.read()) != -1) {     //read一次,会先将缓冲区读满,从缓冲去中一个一个的返给临时变量ch            bw.write(ch);                   //write一次,是将数据装到字符数组,装满后再一起写出去        }        br.close();                         //关流        bw.close();

BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率。
BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率。


  • IO流(readLine()和newLine()方法)

BufferedReader的readLine()方法可以读取一行字符(不包含换行符号).
BufferedWriter的newLine()可以输出一个跨平台的换行符号”\r\n”.

        BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));        BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));        String line;        while((line = br.readLine()) != null) {            bw.write(line);            //bw.write("\r\n");                 //只支持windows系统            bw.newLine();                       //跨平台的        }        br.close();        bw.close(); 

  • IO流(使用指定的码表读写字符)

FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)。
FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)。

        BufferedReader br =                                     //高效的用指定的编码表读                new BufferedReader(new InputStreamReader(new FileInputStream("UTF-8.txt"), "UTF-8"));        BufferedWriter bw =                                     //高效的用指定的编码表写                new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"), "GBK"));        int ch;        while((ch = br.read()) != -1) {            bw.write(ch);        }        br.close();        bw.close();
0 0
原创粉丝点击