IO流常见使用方法

IO流

1 初识Java IO

IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。

Java 中是通过流处理IO 的,那么什么是流?

流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。

当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。

1 流Stream

在学习IO流之前,我们首先需要学习的概念就是Stream流
为了方便理解,我们可以把数据的读写操作抽象成数据在"管道"中流动,但需注意:
1.流只能单方向流动
2.输入流用来读取 → in
3.输出流用来写出 → out
4.数据只能从头到尾顺序的读写一次
所以以程序的角度来思考,In/out 相对于程序而言的输入(读取)/输出(写出)的过程.

2 IO流的继承结构

在java中,根据处理的数据单位不同,可以把流分为字节流和字符流
字节流 : 针对二进制文件
字符流 : 针对文本文件
再结合对应类型的输入和输出方向,常用的流有:

File
字节流:针对二进制文件
InputStream
FileInputStream
BufferedInputStream
ObjectInputStream
OutputStream
FileOutputStream
BufferedOutputStream
ObjectOutputStream
字符流:针对文本文件
Reader
FileReader
BufferedReader
InputStreamReader
Writer
FileWriter
BufferedWriter
OutputStreamWriter
PrintWriter一行行写出

流的分类:

1.按照方向分类:输入流,输出流
2.按照操作的单位分类:字节流,字符流

组合情况: 字节输入流,字节输出流,字符输入流,字符输出流

字节输入流

​ 抽象父级:InputStream—不能实例化

​ 普通子级:

​ FileInputStream–操作文件的字符输入流

​ 构造方法参数:File file / String pathname

package cn.tedu.file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import static java.lang.System.in;

/*字节输入流InputStream*/
public class TestIn {
    public static void main(String[] args) {

        mtthod();//字节流的读取
    }

    //方法用于字节流的读取
    private static void mtthod() {
        InputStream in = null;
        //创建流对象,注意InputStream是抽象父类,不可以实例化
        try {
            in = new FileInputStream("G:\\学习\\java\\ready\\123.txt");

            //2.使用流对象,读取指定文件中的数据
            /*read()方法每次调用都会读取一个字节,如果读到了文件数据的末尾,返回-1
             * read()方法返回值类型为int。所以会查找指定字符对应的编码打印*/
//            System.out.println(in.read());//97
//            System.out.println(in.read());//98
//            System.out.println(in.read());//99
//            System.out.println(in.read());//-1
//            System.out.println(in.read());//-1
//            System.out.println(in.read());//-1
            //优化代码,使用循环读取文件
            int b;
            //循环读取数据,只要读到的数据不等于-1,说明还有数据,符合循环条件,继续循环
            while ((b = in.read()) != -1) {
                System.out.println(b);
            }
        } catch (Exception e) {
            e.printStackTrace();//默认写法,打印错误信息
        }finally {
            /*finally{}代码块是try--catch结构的第三个部分
            * 这部分,不管是否捕获到异常,都一定会执行,常用来关闭流*/
            //3.释放资源,流资源用完必须释放
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

​ BufferedInputStream–高效字节输入流

​ 构造方法参数:InputStream,但无法创建抽象父级对象,所以传的是FileInputStream

package cn.tedu.review;

import org.omg.CORBA_2_3.portable.InputStream;

import java.io.*;

public class TestFile2 {
    public static void main(String[] args) {
        method(); //高效字符流读取
    }

    private static void method() {
        java.io.InputStream in = null;
        //1.创建流对象
//        InputStream in2 = new BufferedInputStream(
//                new FileInputStream(new File("G:\\学习\\java\\ready\\123.txt")));
        try {
            in = new BufferedInputStream(new FileInputStream("G:\\学习\\java\\ready\\123.txt"));
            int a;
            while ((a = in.read())!=-1){
                System.out.println(a);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

字节输出流

​ 抽象父级:OutputStream—不能实例化

​ 普通子级:

​ FileOutputStream–操作文件的字符输出流

​ 构造方法参数:File file / String pathname

​ 注意:默认存在一个参数Boolean append,默认值为false,覆盖输出,如果设置为true,追加输出

​ BufferedOutputStream–高效字节输出流

​ 构造方法参数:OutputStream,但无法创建抽象父级对象,所以传的是FileOutputStream

package cn.tedu.file;

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*字节输出流OutputStream*/
public class TestOut {
    public static void main(String[] args) {
        //method1();//用来测试普通字节输出流
        method2();//用来测试高效字节输出流
    }
    //本方法用于测试普通字节输出流FileOutputStream
    private static void method1() {
        FileOutputStream fileOutputStream = null;
        try {
            //1.创建流对象

            //fileOutputStream = new FileOutputStream("G:\\学习\\java\\ready\\123.txt");/*覆盖输出*/
            fileOutputStream = new FileOutputStream("G:\\学习\\java\\ready\\123.txt",true);/*追加输出*/
            fileOutputStream.write(97);
            fileOutputStream.write(98);
            fileOutputStream.write(99);
            fileOutputStream.write(45);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //本方法用于测试高效字节输出流BufferedOutputStream
    private static void method2() {
        BufferedOutputStream bufferedOutputStream = null;
        try {
            bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("G:\\学习\\java\\ready\\123.txt",true));
            bufferedOutputStream.write(94);
            bufferedOutputStream.write(94);
            bufferedOutputStream.write(94);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                bufferedOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

字符输入流

​ 抽象父级:Reader—不能实例化

普通子级:

​ FileReader–操作文件的字符输入流

​ 构造方法参数:File file / String pathname

​ BufferedReader–高效字节输入流

​ 构造方法参数:Reader,但无法创建抽象父级对象,所以传的是FileReader

package cn.tedu.review;

import java.io.*;

/*本类用于字符输入流Reader的读取操作*/
public class TestIn {
    public static void main(String[] args) {
        //method1(); //用于测试普通的字符输入流
        method2(); //用于测试高效字符输入流

    }
    //本方法用于测试高效字符输入流的读取操作
    private static void method2() {
        BufferedReader bufferedReader = null;
        1.创建高效字符输入流对象
        try {
            bufferedReader = new BufferedReader(
                    new FileReader("G:\\学习\\java\\ready\\123.txt"));
            int a;
            while ((a=bufferedReader.read())!=-1){
                System.out.println(a);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    //本方法用于测试普通字符输入流的读取操作
    private static void method1() {
        FileReader fileReader = null;
        try {
            //1.创建流对象
            fileReader = new FileReader("G:\\学习\\java\\ready\\123.txt");
            //2.使用流对象
            int b;//定义变量用于保存读到的数据
            while ((b=fileReader.read())!=-1){ //只要读到的数据不是-1,就继续循环
                System.out.println(b);//打印读到的数据
            }
        } catch ( Exception e) {
            e.printStackTrace();
        }finally {
            try {
                //3.关流
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

字符输出流

​ 抽象父级:Writer—不能实例化

​ 普通子级:

​ FIleWriter–操作文件的字符输出流

​ 构造方法参数:File file / String pathname

​ 注意:默认存在一个参数Boolean append,默认值为false,覆盖输出,如果设置为true,追加输出

​ BufferedWriter–高效字节输出流

​ 构造方法参数:Writer,但无法创建抽象父级对象,所以传的是FIleWriter

​ 注意:默认存在一个参数Boolean append,默认值为false,覆盖输出,如果设置为true,追加输出

package cn.tedu.file;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/*字符输出流Writer*/
public class TestOut2 {
    public static void main(String[] args) {
        //method1();//用来测试普通字符输出流
        method2();//用来测试高效字符输出流
    }
    //本方法用于测试普通字符输出流--FileWriter
    private static void method1() {
        FileWriter fileWriter = null;
        try {
            fileWriter = new FileWriter("G:\\学习\\java\\ready\\123.txt",true);
            fileWriter.write(95);
            fileWriter.write(95);
            fileWriter.write(95);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //本方法用于测试普通字符输出流--BufferedWriter
    private static void method2() {
        BufferedWriter bufferedWriter = null;
        try {
            bufferedWriter = new BufferedWriter(new FileWriter("G:\\学习\\java\\ready\\123.txt",true));
            bufferedWriter.write(28);
            bufferedWriter.write(28);
            bufferedWriter.write(28);
            bufferedWriter.write(99);

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                bufferedWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值