java IO流总结

java I/O流总结

一、流的分类:

1.操作数据单位:字节流、字符流

对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,…),使用字节流处理

2.数据的流向:输入流、输出流

3.流的角色:节点流、处理流

节点流:直接从数据源或目的地读写数据

处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。

在这里插入图片描述

二、流的体系结构

抽象基类节点流(或文件流)缓冲流(处理流的一种)
字符流ReaderFileReader (read(char[] cbuf))BufferedReader (read(char[] cbuf) / readLine())
字符流WriterFileWriter (write(char[] cbuf,0,len)BufferedWriter (write(char[] cbuf,0,len) / flush()
字节流InputStreamFileInputStream(read(byte[] buffer))BufferedInputStream (read(byte[] buffer))
字节流OutputStreamFileOutputStream (write(byte[] buffer,0,len)BufferedOutputStream (write(byte[] buffer,0,len) / flush()
直接操作文件不可直接操作文件,操作对象为节点流

三、流的使用

以字符流FileReader举例:

流的使用一般有四个步骤:

1.实例化File类的对象,指明要操作的文件。

2.提供具体的流。

3.数据的读入。

4.流的关闭操作。

//节点流的举例
public void testFileReader(){
        FileReader fr = null;
        try {
            //1.实例化File类的对象,指明要操作的文件
            File file = new File("hello.txt");//相较于当前Module
            //2.提供具体的流
            fr = new FileReader(file);

            //3.数据的读入
            //read():返回读入的一个字符。如果达到文件末尾,返回-1
            //方式一:
//        int data = fr.read();
//        while(data != -1){
//            System.out.print((char)data);
//            data = fr.read();
//        }

            //方式二:语法上针对于方式一的修改
            int data;
            while((data = fr.read()) != -1){
                System.out.print((char)data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.流的关闭操作
           try {
               if(fr != null)
                   fr.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
        }

    }
    
//处理流举例:此处以缓冲流举例。实现文件复制。
public void copyFileWithBuffered(String srcPath,String destPath){
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;

        try {
            //1.造文件
            File srcFile = new File(srcPath);
            File destFile = new File(destPath);
            //2.造流
            //2.1 造节点流
            FileInputStream fis = new FileInputStream((srcFile));
            FileOutputStream fos = new FileOutputStream(destFile);
            //2.2 造缓冲流
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);

            //3.复制的细节:读取、写入
            byte[] buffer = new byte[1024];
            int len;
            while((len = bis.read(buffer)) != -1){
                bos.write(buffer,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.资源关闭
            //要求:先关闭外层的流,再关闭内层的流
            if(bos != null){
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            if(bis != null){
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            //说明:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略.
//        fos.close();
//        fis.close();
        }
    }

补充:

若用字节流输出字符文件(包含除英文外的其他字符,如汉字等)可能会出现乱码。原因是若用字节流一次读出两个字节,而一个字符如一个中文字符是由三个字节组成的,若一次输出两个字节就会将一个中文字符给撕碎,表现出来的就是乱码。

下面谈一下字符编码

编码表的由来

计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识

别各个国家的文字。就将各个国家的文字用数字来表示,并一一对应,形成一张表。

这就是编码表。

常见的编码表

 ASCII:美国标准信息交换码。

 用一个字节的7位可以表示。

 ISO8859-1:拉丁码表。欧洲码表

 用一个字节的8位表示。

 GB2312:中国的中文编码表。最多两个字节编码所有字符

 GBK:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码

 Unicode:国际标准码,融合了目前人类使用的所有字符。为每个字符分配唯一的

字符码。所有的文字都用两个字节来表示。

 UTF-8:变长的编码方式,可用1-4个字节来表示一个字符。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f8oteWMO-1580445191543)(E:\360MoveData\Users\Administrator\Desktop\捕1获.JPG)]

,融合了更多的中文文字符号。最多两个字节编码

 Unicode:国际标准码,融合了目前人类使用的所有字符。为每个字符分配唯一的

字符码。所有的文字都用两个字节来表示。

 UTF-8:变长的编码方式,可用1-4个字节来表示一个字符。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值