java io 一些总结

本文详细介绍了Java IO流的基础概念及常见操作,包括字节流、字符流的基本使用方法,如FileInputStream、FileOutputStream、FileReader、FileWriter等,并探讨了缓冲流、文件复制技巧以及异常处理方式。

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


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

  • IO流(FileInputStream)
FileInputStream fis = new FileInputStream("aaa.txt");   //创建一个文件输入流对象,并关联aaa.txt
int 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去掉,所以写出的一个byte
fos.write(98);
fos.write(99);
fos.close();

  • IO流(拷贝图片)
FileInputStream fis = new FileInputStream("01.mp3");    //创建输入流对象,关联01.mp3
FileOutputStream fos = new FileOutputStream("copy.mp3");//创建输出流对象,关联copy.mp3

int 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.mp3
BufferedInputStream bis = new BufferedInputStream(fis);         //创建缓冲区对fis装饰
FileOutputStream fos = new FileOutputStream("copy.mp3");        //创建输出流对象,关联copy.mp3
BufferedOutputStream 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();
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值