Java day16

IO流

输入还是输出的参考系是相对于内存来说的。
input输入流:从硬盘到内存中
output输出流:从内存到硬盘中

分类

字节流
字节流什么文件都可以处理
字符流
字符流只能处理文本类型的文件

输入流输出流
字符流ReaderWriter
字节流InputStreamOuputStream

FileWriter类

// 创建了一个流对象指向了D盘下的abc.txt
// 创建一个新文件
// 如果原文件不存在,则使用创建的这个新文件
// 如果原文件存在,则使用新创建的文件覆盖原文件
// append:如果设置为true,那么文件可以继续拼接
FileWriter fw = new FileWriter(“D:\\abc.txt”,true);
// 写数据 FileWriter默认有一个缓冲区
fw.write(“aaa”);
// 冲刷缓冲区 -->立即保存
fw.flush();
// 关闭流 在关流时候会默认冲刷一次缓冲区
fw.close();
// 将这个对象标记为垃圾对象
fw = null;
FileWriter异常处理

FileWriter fw = null;
        try {
            fw = new FileWriter("D:\\abc.txt");
            fw.write("abc");
            // 防止关流失败,导致数据遗留在缓冲区产生数据丢失
            fw.flush();
        }catch (IOException e){
            // 打印栈轨迹
            e.printStackTrace();
        }finally {
            // 判断流对象是否初始化成功
            if (fw != null){
                try {
                     fw.close();
                }catch(IOException e){
                    e.printStackTrace();
                }finally {
                    // 如果关流成功,标记垃圾对象来释放内存
                    // 如果关流失败,则强制回收这个对象
                    fw = null;
                }
            }
        }

JDK1.7特性–>try–with–resources

// 格式:try(必须是AutoCloseable的子类对象)
        // 资源会自动释放,不需要写close()
        // 注意:try()中的对象的初始化必须在()中
        // 1.7特性:try ... with ...resources
        try(FileWriter fw = new FileWriter("D:\\abc.txt")){
            fw.write("abc");
        }catch (IOException e){
            e.printStackTrace();
        }

FileReader类

// 字符输入流
//        创建流对象
        FileReader fr = new FileReader("D:\\abc.txt");
//       int c;
//        while((c = fr.read()) != -1){
//            System.out.println((char)c);
//        }

        // 定义一个空的字符数组
        char[] cs = new char[3];
        // 返回值是实际读取到的数量,读取失败返回-1
        int len;
        // 将数据读取到字符数组中
        // 读取到末尾返回-1
        while ((len =fr.read(cs)) != -1){
            System.out.print(new String(cs,0,len));
        }
        // 关闭流
        fr.close();

BufferedReader类和BufferedWriter类

// 自带缓冲区的字节输入流
        // BufferedReader的构造方法中需要传入一个Reader的对象
        FileReader fileReader = new FileReader("D:\\aaaaaa.txt");
        BufferedReader br = new BufferedReader(fileReader);
        // 每次读取一行  读不到内容会返回null
       String str;
       // 注意:BufferedReader的readLine()方法,不会读取换行符
       while ((str = br.readLine()) != null){
           System.out.println(str);
       }

        // 关闭外层流,内部的流也会关闭
        br.close();
// 创建BufferedWriter
//        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\nba.txt"));
//        bw.write("我爱你中国");
//        bw.newLine();
//        bw.write("亲爱的母亲");
//        bw.close();
//        bw.newLine();换行

// 装饰设计模式
// 模式:针对于某一类问题的统一的处理方法
// 设计模式:在软件开发中针对遇到的问题所提供的统一个解决方法
// 装饰设计模式:利用同类对象来构建本类对象,然后对所构建的对象进行功能的改善或者增强
练习 拷贝文件

// 创建BufferedReader和BufferedWriter
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\cba.txt"));
        BufferedReader br = new BufferedReader(new FileReader("D:\\aaaaaa.txt"));
        String str = null;
        // 一边读取一边写入
        while ((str = br.readLine()) != null){
            bw.write(str);
            // 记得一定要换行
            bw.newLine();
        }

        // 关闭流
        br.close();
        bw.close();

字节流

字符流只能操作字符类的文件。如果要操作视频音频图片等文件,需要使用字节流。字节流可以操作任何文件。
字节流中没有缓冲区,不关流也可以写入到文件中。

// 字节输入流和字节输出流
        // 字符流:只能处理和字符相关的文件(txt  java)
        // 字节流: 处理任何的文件

        // 字节输出流  创建字节输出流
//        FileOutputStream fos = new FileOutputStream("D:\\asdf.txt");
        fos.write();// 输出一个字节
//        fos.write("abc".getBytes());// 输出一个字节数组
//        // 关流
//        fos.close();


        // 字节输入流
        // 创建字节输入流
        FileInputStream fis = new FileInputStream("D:\\asdf.txt");
        // 创建一个数组作为缓冲区
        byte[] bs = new byte[10];

        // 每次实际读取到的字节个数
        int len;
        // 读取数据
        while ((len = fis.read(bs)) != -1){
            System.out.println(new String(bs,0,len));
        }
        // 关闭流
        fis.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值