复习(基础3)IO流(1)

目录

1、概述

2、字节流

2.1、字节输入流 :FileInputStream

2.2、字节输出流:FileOutputStream

2.3、文件复制

3、资源释放的方式

 3.1、try-catch-finally

3.2、try-with-resource


1、概述

I 表示 intput ,把硬盘文件中的数据读入到内存的过程,称之输入,负责读。
O 表示 output ,把内存中的数据写出到硬盘文件的过程,称之输出,负责写。
IO流分类

字节输入流:以内存为基准, 来自 磁盘文件 / 网络中的数据 以字节的形式读入到内存 中去的流称为字节输入流。
字节输出流:以内存为基准,把内存中的数据 以字节写出到磁盘文件或者网络中去 的流称为字节输出流。
字符输入流:以内存为基准, 来自 磁盘文件 / 网络中的数据 以字符的形式读入到内存 中去的流称为字符输入流。
字符输出流:以内存为基准,把内存中的数据 以字符写出到磁盘文件或者网络介质中 去的流称为字符输出流。

2、字节流

2.1、字节输入流 :FileInputStream

作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。

 一次读取一个字节

缺点:性能较慢,读取中文字符输出无法避免乱码问题。

package com.itwpf.d03_stream;

import java.io.*;

public class FileinputStreamDemo1 {
    public static void main(String[] args) throws IOException {
        //1、创建一个文件输入流管道与源文件接通
        InputStream fileInputStream = new FileInputStream(new File("day05_file\\src\\main\\java\\data.txt"));
        //2.每次读取一个字节,读取到最后返回-1;
        int a = fileInputStream.read();
        System.out.println((char)a);

        //3.使用循环改进
        //定义一个变量记录每次读取的字节
        int b;
        while((b=fileInputStream.read())!=-1){
            System.out.print((char)b);
        }
    }
}

一次读取一个字节数组

读取的性能得到了提升,读取中文字符输出无法避免乱码问题。

package com.itwpf.d03_stream;

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

public class FileinputStreamDemo2 {
    public static void main(String[] args) throws IOException {
        //1、创建一个文件输入流管道与源文件接通
        InputStream fileInputStream = new FileInputStream(new File("day05_file\\src\\main\\java\\data.txt"));
        byte bytes[] = new byte[1024];
        int len ;//记录每次读取的字节数
        while((len=fileInputStream.read(bytes))!=-1){
            //读多少倒出多少
            String s = new String(bytes,0,len, "UTF-8");
            System.out.print(s);
        }
    }
}

读取文件的全部字节

直接把文件数据全部读取到一个字节数组可以避免乱码

 

 如果文件过大,字节数组可能引起内存溢出。

package com.itwpf.d03_stream;

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

public class FileinputStreamDemo3 {
    public static void main(String[] args) throws IOException {
        File file = new File("day05_file\\src\\main\\java\\data.txt");
        //1、创建一个文件输入流管道与源文件接通
        InputStream fileInputStream = new FileInputStream(file);
        
        byte[] bytes = fileInputStream.readAllBytes();
        
        System.out.println(file.length() + "个字节");
        System.out.println(new String(bytes, "UTF-8"));

    }
}

2.2、字节输出流:FileOutputStream

l 作用:以内存为基准,把 内存中的数据以字节的形式写出到磁盘文件中去的流。

构造器

说明

public FileOutputStream​(File file)

创建字节输流管道与源文件对象接通

public FileOutputStream​(File fileboolean append)

创建字节输流管道与源文件对象接通

可追加数据

public FileOutputStream​(String filepath)

创建字节输流管道与源文件路径接通

public FileOutputStream​(String filepathboolean append)

创建字节输流管道与源文件路径接通

可追加数据

 

package com.itwpf.d03_stream;

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

public class OutputStreamDemo4 {
    public static void main(String[] args) throws IOException {
        //1.创建一个文件字节输入流管道与目标文件接通
        //OutputStream outputStream = new FileOutputStream("day05_file\\src\\main\\java\\data02.txt");
        //每次都会先清空之前的数据,再将新数据写入
        //如果要追加数据,则在后面加上true
        OutputStream outputStream = new FileOutputStream("day05_file\\src\\main\\java\\data03.txt",true);

        //2.写数据出去
        outputStream.write('a');
        outputStream.write(98);
        outputStream.write('1');
        //换行
        outputStream.write("\r\n".getBytes());
        //3.写数据必须刷新数据
        outputStream.flush();


        //写一个字节数组出去
        byte[]bytes = new byte[]{'a',64,65,'b'};
        byte[] bytes1 = "我来自中国111".getBytes();
        outputStream.write(bytes);
        outputStream.write(bytes1);
        outputStream.flush();

        //4.释放资源
        //释放资源时,自动刷新数据
        outputStream.close();
    }
}

2.3、文件复制

package com.itwpf.d03_stream;

import java.io.*;

public class copyDemo {
    public static void main(String[] args)  {
        /**
         * 使用字节流完成文件的复制(支持一切文件的复制)
         */
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            //创建一个字节输入流管道与源文件连接
            inputStream = new FileInputStream(new File("D:\\log4j\\00\\01.mp4"));
            //创建一个字节输出流管道与目标文件连接
            outputStream = new FileOutputStream(new File("D:\\log4j\\01\\03.mp4"));
            //定义一个字节数组转移数据
            byte[] bytes = new byte[1024];
            int len;//记录每次读取的字节数
            while((len=inputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
                outputStream.flush();
            }
            System.out.println("复制完成了");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭流
            try {
                if(outputStream!=null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(inputStream!=null){
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

3、资源释放的方式

 3.1、try-catch-finally

     finally :放在 try-catch 后面的,无论是正常执行还是异常执行代码,最后一定要执行, 除非 JVM 退出。
作用:一般用于进行最后的资源释放操作(专业级做法)

3.2、try-with-resource

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值