欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java IO流总结

程序员文章站 2024-03-04 22:58:24
...

java I/O流总结

一、流的分类:

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

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

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

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

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

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

java IO流总结

二、流的体系结构

抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
字符流 Reader FileReader (read(char[] cbuf)) BufferedReader (read(char[] cbuf) / readLine())
字符流 Writer FileWriter (write(char[] cbuf,0,len) BufferedWriter (write(char[] cbuf,0,len) / flush()
字节流 InputStream FileInputStream(read(byte[] buffer)) BufferedInputStream (read(byte[] buffer))
字节流 OutputStream FileOutputStream (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个字节来表示一个字符。
java IO流总结
java IO流总结

相关标签: java