JAVA流整理

输入输出流分类

从程序的角度,将数据写入到为输入流,从文件的角度上看是输出流,程序角度上看,数据写出为输出流,从文件角度上看是输入流。
下面都是以软件角度说明

字节流和处理流

字节流是一个基础流,里面是01这样的数据编码,处理流是在数据流外面对01编码进行处理,将数据处理成我们所需要的样式。

字节流类型

字节流类型
字节流就是直接读取数据源里的数据,或者是直接往数据源里写入数据,典型的是文件流FileRender输入流|FileWriter输出流|FileInputstream字节输入流|FileOutputStream字节输出流

处理流类型

处理流类型

InputStream输入流

继承InputStream的流都是向程序中输入数据,数据的单位为字节(8bit)
在这里插入图片描述

InputStream的基本方法

read()方法是一个字节一个字节地往外读,每读取一个字节,就处理一个字节。read(byte[] buffer)方法读取数据时,先把读取到的数据填满这个byte[]类型的数组buffer(buffer是内存里面的一块缓冲区)

例:
public void readFile() throws IOException {
    try (InputStream input = new FileInputStream("src/readme.txt")) {
        // 定义1000个字节大小的缓冲区:
        byte[] buffer = new byte[1000];
        int n;
        while ((n = input.read(buffer)) != -1) { // 读取到缓冲区
            System.out.println("read " + n + " bytes.");
        }
    }
}

OutputStream输出流

继承自OutputStream的流是用于程序中输入数据,且数据的单位为字节(8bit)
在这里插入图片描述

OutputStream的基本方法

向输出流中写入字节数据write(byte[] b)

例:
	public void writeFile() throws IOException {
    OutputStream output = new FileOutputStream("out/readme.txt");
    output.write("Hello".getBytes("UTF-8")); // Hello
    output.close();
}

Reader流

Reader和InputStream一模一样,就是数据的单位为字符(16bit)也就是两个字节的大小,为的是有些字符是占两个字节,比如说中文在java中就是占用两个数据,如果读取8bit这样就回得到半个汉字,在java重视没有办法正确的显示出中文的。所以有必要存在这种流,一个字符一个字符地往外流
在这里插入图片描述

Reader的基本方法

在这里插入图片描述

Writer流

与OutputStream基本一致,不过数据的单位为字符(16bit)
在这里插入图片描述

Writer的基本方法

在这里插入图片描述

节点流讲解

以文件类型作为代表FileInputStream|FileoutputStream

使用FileInputStream流来读取文件的内容
 public static void main(String args[]) {
        int b = 0;// 使用变量b来装调用read()方法时返回的整数
        FileInputStream in = null;
        // 使用FileInputStream流来读取有中文的内容时,读出来的是乱码,因为使用InputStream流里面的read()方法读取内容时是一个字节一个字节地读取的,而一个汉字是占用两个字节的,所以读取出来的汉字无法正确显示。
        // FileReader in = null;//使用FileReader流来读取内容时,中英文都可以正确显示,因为Reader流里面的read()方法是一个字符一个字符地读取的,这样每次读取出来的都是一个完整的汉字,这样就可以正确显示了。
        try {
            in = new FileInputStream("D:\\Java\\MyEclipse 10\\Workspaces\\AnnotationTest\\src\\cn\\galc\\test\\FileInputStream.java");
            // in = new FileReader("D:/java/io/TestFileInputStream.java");
        } catch (FileNotFoundException e) {
            System.out.println("系统找不到指定文件!");
            System.exit(-1);// 系统非正常退出
        }
        long num = 0;// 使用变量num来记录读取到的字符数
        try {// 调用read()方法时会抛异常,所以需要捕获异常
            while ((b = in.read()) != -1) {
                // 调用int read() throws Exception方法时,返回的是一个int类型的整数
                // 循环结束的条件就是返回一个值-1,表示此时已经读取到文件的末尾了。
                // System.out.print(b+"\t");//如果没有使用“(char)b”进行转换,那么直接打印出来的b就是数字,而不是英文和中文了
                System.out.print((char) b);
                // “char(b)”把使用数字表示的汉字和英文字母转换成字符输入
                num++;
            }
            in.close();// 关闭输入流
            System.out.println();
            System.out.println("总共读取了" + num + "个字节的文件");
        } catch (IOException e1) {
            System.out.println("文件读取错误!");
        }
    }
使用FileOutputStream流往一个文件里面写入数据
 public static void main(String args[]) {
        int b = 0;
        FileInputStream in = null;
        FileOutputStream out = null;
        try {
            in = new FileInputStream("D:\\Java\\MyEclipse 10\\Workspaces\\AnnotationTest\\src\\cn\\galc\\test\\MyMouseAdapter.java");
            out = new FileOutputStream("D:/java/TestFileOutputStream1.java");
            // 指明要写入数据的文件,如果指定的路径中不存在TestFileOutputStream1.java这样的文件,则系统会自动创建一个
            while ((b = in.read()) != -1) {
                out.write(b);
                // 调用write(int c)方法把读取到的字符全部写入到指定文件中去
            }
            in.close();
            out.close();
        } catch (FileNotFoundException e) {
            System.out.println("文件读取失败");
            System.exit(-1);// 非正常退出
        } catch (IOException e1) {
            System.out.println("文件复制失败!");
            System.exit(-1);
        }
        System.out
                .println("TestFileInputStream.java文件里面的内容已经成功复制到文件TestFileOutStream1.java里面");
    }
这两种都是字节流,都是8bit一个字节,对于占用2个字节的字符来说读取的时候会出现乱码的情况
使用FileWriter字符流向指定文件中写入数据
public static void main(String args[]){
        /*使用FileWriter输出流从程序把数据写入到Uicode.dat文件中
        使用FileWriter流向文件写入数据时是一个字符一个字符写入的*/
        FileWriter fw = null;
        try{
                fw = new FileWriter("D:/java/Uicode.dat");
                //字符的本质是一个无符号的16位整数
                //字符在计算机内部占用2个字节
                //这里使用for循环把0~60000里`在这里插入代码片`面的所有整数都输出
                //这里相当于是把全世界各个国家的文字都0~60000内的整数的形式来表示
                for(int c=0;c<=60000;c++){
                    fw.write(c);
                    //使用write(int c)把0~60000内的整数写入到指定文件内
                    //调用write()方法时,我认为在执行的过程中应该使用了“(char)c”进行强制转换,即把整数转换成字符来显示
                    //因为打开写入数据的文件可以看到,里面显示的数据并不是0~60000内的整数,而是不同国家的文字的表示方式
            }
            /*使用FileReader(字符流)读取指定文件里面的内容
            读取内容时是以一个字符为单位进行读取的*/
                int b = 0;
                long num = 0;
                FileReader fr = null;
                fr = new FileReader("D:/java/Uicode.dat");
                while((b = fr.read())!= -1){
                    System.out.print((char)b + "\t");
                    num++;
                }
                System.out.println();
                System.out.println("总共读取了"+num+"个字符");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学弟QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值