字节输入输出流(FileInputStream和FileOutputStream)字符转换流(InputStreamReader和OutputStreamWriter)

一、IO流

1.IO流的概述

IO流是用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中 java.io

2、IO流的分类
  1. 按照数据的流向(站在内存的角度)
    输入流——读入数据
    输出流——写出数据
  2. 按照数据类型
    字节流——可以读取任意类型的文件
    字符流——只能读取文本文件

二、FileInputStream和FileOutputStream

字节输入输出流
字节流的抽象基类:InputStream,OutputStream

1、FileOutputStream
        File file = new File("a.txt");
        FileOutputStream out1 = new FileOutputStream(file);//创建一个向指定File对象表示的文件中写入数据的文件输出流
        //输出流所关联的文件如果不存在,系统会自动帮你创建
        FileOutputStream out2 = new FileOutputStream("b.txt");//创建一个向具有指定名称的文件中写入数据的文件输出流
        //流用完之后必须释放资源
        out1.close();
        out2.close();
//写数据
        FileOutputStream out1 = new FileOutputStream(file,true);//参数2:true代表追加写入,false表示不追加
        FileOutputStream out2 = new FileOutputStream("b.txt",false);
        out1.write(97);
        out1.write(98);
        out1.write(99);//一次写入一个字节
        out1.write("\r\n".getBytes());

        byte[] bytes = new byte[]{100,101,102,103,104};
        out2.write(bytes);//一次写入一个字节数组
        out2.write("\r\n".getBytes());//回车换行符

        out2.write(bytes,2,3);//一次写入一个字节数组的一部分
        out2.write("\r\n".getBytes());
        String str="杨家有女初长成";
        out2.write(str.getBytes());//将一个字符串转换成字符数组
        out2.write("\r\n".getBytes());
        out1.close();
        out2.close();
2.FileInputStream
        File file = new File("a.txt");
        //输入流:所关联的文件如果不存在,就报错
        FileInputStream in1 = new FileInputStream(file);
        //通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象的file文件指定
        FileInputStream in2 = new FileInputStream("b.txt");
        //通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定        
//读数据
        in.read();//一次读取一个字节,读取不到返回-1

        //创建一个字节数组充当缓冲区
        byte[] bytes = new byte[1024];
        int len=in.read(bytes);//一次读取1024个字节,放到缓冲区里
        
        int len2 = in.read(bytes, 0, 3);//读取数组的一部分,装入缓冲区
        in.close();//流用完之后,要释放资源
3.使用文件输入输出流,进行文件的复制
        FileInputStream in = new FileInputStream("MyTest3.java");
        FileOutputStream out = new FileOutputStream("test.java");
        //方式一:读取一个字节,写入一个字节
        int len=0;
        while((len=in.read())!=-1){
            out.write(len);
            out.flush();
        }
        in.close();
        out.close();
        FileInputStream in = new FileInputStream("MyTest3.java");
        FileOutputStream out = new FileOutputStream("test.java");
        //方式二:一次读取一个字节数组来复制文件
        byte[] bytes = new byte[1024];//定义一个字节数组充当缓冲区
        int len=0;
        while((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();
4.流的异常处理
//流的异常处理
        FileInputStream in=null;
        FileOutputStream out=null;
        try {
            in = new FileInputStream("MyTest3.java");
            out = new FileOutputStream("test.java");
            //频繁的读写操作
            byte[] bytes = new byte[1024];
            int len=0;
            while((len=in.read(bytes))!=-1){
                out.write(bytes,0,len);
                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //释放资源
            try {
                if(in!=null){
                    in.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(out!=null){
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

三、BufferedInputStream和BufferedOutputStream

高效的字节输入输出流

//高效的字节输入输出流
        BufferedInputStream in = new BufferedInputStream(new FileInputStream("MyTest3.java"));
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("Test.java"));
        byte[] bytes = new byte[1024];
        int len=0;
        while((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();

四、InputStreamReader和OutputStreamWriter

字符转换流,字符流一定要记得刷新
字符流的抽象基类:Reader,Writer

1.OutputStreamWriter
        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("a.txt",true),"UTF-8");
 //写入数据
        out.write('你');//一次写一个字符
        out.write("\r\n");
        out.write("注意防暑降温");//一次写入一个字符串
        out.write("\r\n");
        out.write("注意防暑降温",2,4);//一次写入字符串的一部分
        char[] chars = new char[]{'你','好','啊'};
        out.write(chars);//一次写入一个字符数组
        out.write(chars,0,2);//一次写入字符数组的一部分

        out.close();
2.InputStreamReader
        InputStreamReader in = new InputStreamReader(new FileInputStream("a.txt"));
//读取数据        
        int read = in.read();//一次读取一个字符,读取不到返回-1

        char[] chars = new char[1024];//字符数组充当缓冲区
        int read1 = in.read(chars);

        int read2 = in.read(chars, 0, 3);
        in.close();
3.采用字符流来复制文件
        InputStreamReader in = new InputStreamReader(new FileInputStream("MyTest3.java"));
        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("Test.java"));
        //方法一:一次读取一个字符
        int len=0;
        while((len=in.read())!=-1){
            out.write(len);
            out.flush();//字符流要记得刷新
        }
        in.close();
        out.close();
        InputStreamReader in = new InputStreamReader(new FileInputStream("MyTest3.java"));
        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("Test.java"));
        //方法二:一次读取一个字符数组
        char[] chars = new char[1024];
        int len=0;
        while((len=in.read(chars))!=-1){
            out.write(chars,0,len);
            out.flush();//字符流要记得刷新
        }
        in.close();
        out.close();

五、FileReader和FileWriter

字符转换流的子类,也称便携流
唯一的缺点就是:它不能指定编码,也没有特有的方法都是从父类继承下来的
InputStreamReader----- FileReader
OutputStreamWriter------ FileWriter

        FileReader reader = new FileReader("MyTest3.java");
        FileWriter writer = new FileWriter("Test.java");
        char[] chars = new char[1024];
        int len=0;
        while((len=reader.read(chars))!=-1){
            writer.write(chars,0,len);
            writer.flush();
        }
        reader.close();
        writer.close();

六、案例演示

  1. 复制单层文件夹
  public static void main(String[] args) throws IOException {
        File srcFile = new File("E:\\文档");//封装源文件
        File targetFile= new File("D:\\" + srcFile.getName());//封装目标文件
        if(!targetFile.exists()){
            targetFile.mkdirs();
        }
        copyFolder(srcFile,targetFile);
    }

    private static void copyFolder(File srcFile,File targetFile) throws IOException {
        File[] files = srcFile.listFiles();
        for (File f : files) {
            if(f.isFile()){
                copyFile(f,targetFile);
            }
        }
    }

    private static void copyFile(File f,File targetFile) throws IOException {
        File file = new File(targetFile, f.getName());
        FileInputStream in = new FileInputStream(f);
        FileOutputStream out = new FileOutputStream(file);
        byte[] bytes = new byte[1024 * 8];
        int len=0;
        while((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();
    }
  1. 复制多层文件夹
public static void main(String[] args) throws IOException {
        File srcFile= new File("E:\\文档");
        File targetFile = new File("D:\\" + srcFile.getName());
        if(!targetFile.exists()){
            targetFile.mkdirs();
        }
        copyFolder(srcFile,targetFile);
    }

    private static void copyFolder(File srcFile,File targetFile) throws IOException {
        File[] files = srcFile.listFiles();
        for (File f : files) {
            if(f.isFile()){
                copyFile(f,targetFile);
            }else{
                File file = new File(targetFile, f.getName());
                if(!file.exists()){
                    file.mkdirs();
                }
                copyFolder(f,file);
            }
        }
    }

    private static void copyFile(File f,File targetFile) throws IOException {
        File file = new File(targetFile, f.getName());
        FileInputStream in = new FileInputStream(f);
        FileOutputStream out = new FileOutputStream(file);
        byte[] bytes = new byte[1024 * 8];
        int len=0;
        while((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值