IO流-文件字节和字符输入输出流

文章中对输入输出流的用法介绍都在实例的注释中,请耐心通过实例来学习

一、文件字节流

1、字节输入流介绍

常见子类的继承关系

2、字节输出流介绍

继承关系图

(一)fileInputStream文件字节输入流

1、方法一:单个字节的读取
//方法一:单个字节的读取read()
public void readFile01() {
    String pathName = "E:\\hello.txt";
    //定义一个readData接收读取到的字节
    int readData = 0;
    //后面的finally中想要调用这个对象,所以把这个对象名定义到try上面,可以让try和finally都能用
    FileInputStream fileInputStream = null;
    //创建IO 流对象
    try {
        //创建FileInputStream对象,用于读取文件中的内容
        fileInputStream = new FileInputStream(pathName);
        //read方法,是获取这个文件内的内容,返回值类型为int   如果返回的是 -1,那么证明读取结束
        while ((readData = fileInputStream.read()) != -1){
            //因为读取的数据类型是int,所以我需要把他强制转换成char类型
            System.out.print((char)readData);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //流相当于一种资源,当我们用完之后一定记得关闭,关闭文件流,释放资源
        try {
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
2、方法二:多个字节的读取
//方法二:多个字节的读取,使用read(byte[] b)方法,定义一个字节数组,从该输入流中读取最多b.length字节的数组到字节数组
        //如果文件到达尾部,也会返回一个-1
public void readFile02() {
    String pathName = "E:\\hello.txt";
    //定义一个字节类型的数组,一次读取8个字节
    byte[] b = new byte[8];
    //定义一个变量,接收read(byte[] b)返回的数组实际长度
    int readLength = 0;
    //后面的finally中想要调用这个对象,所以把这个对象名定义到try上面,可以让try和finally都能用
    FileInputStream fileInputStream = null;
    //创建IO 流对象
    try {
        //创建FileInputStream对象,用于读取文件中的内容
        fileInputStream = new FileInputStream(pathName);
        //read方法,是获取这个文件内的内容,返回值类型为int   如果返回的是 -1,那么证明读取结束
        while ((readLength = fileInputStream.read(b)) != -1){
            //把byte的字节数组转化成字符串,用new String方法,b表示字节数组名,0表示从0索引开始,最后一个表示字节数组的转换长度
            System.out.print(new String(b,0,readLength));
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //流相当于一种资源,当我们用完之后一定记得关闭,关闭文件流,释放资源
        try {
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(二)、fileOutputStream文件字节输出流

实例是利用输入输出流完成文件的拷贝

package com.guohui.outputstream_;

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

public class FileCopy {
    public void copy() {
        //首先先将图片输入到程序中
        String filePathName = "E:\\weixin.png";
        //创建接收的文件
        String endPathName = "D:\\weixinnew.png";
        //创建一个输入流对象
        FileInputStream fileInputStream = null;
        //创建一个输出流对象
        FileOutputStream fileOutputStream = null;
        //创建一个读取的字节数组,便于后续按照字节数组的长度快速读取文件中的数据
        byte[] b = new byte[1024];
        //创建个变量接收读取到的字节
        int readLen = 0;
        try {
            fileInputStream = new FileInputStream(filePathName);
            fileOutputStream = new FileOutputStream(endPathName);
            while ((readLen = fileInputStream.read(b)) != -1) {
                //读取到文件后,用fileOutputStream将文件内容写入到指定的文件中
                //避免文件过大,读取慢,一般采用边读边写的方式
                fileOutputStream.write(b, 0, readLen);
            }
            System.out.println("文件拷贝成功!");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        //为减少资源的浪费,用完输入和输出流后要及时关闭,释放资源
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
}

二、文件字符流

(一)FileReader(字符输入流)用法

有两种读取输入的方法:

1、单个字符读取
//第一种方案,单个字符读取
public void fileReader1() {
    //定义变量接收需要读取文件的路径
    String pathName = "E:\\story.txt";
    //定义一个变量接收读取到的值
    int data = 0;
    java.io.FileReader fileReader = null;
    try {
        fileReader = new java.io.FileReader(pathName);
        while ((data = fileReader.read())!= -1){
            System.out.print((char)data);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
2、定义数组来读取,提高读取的效率
//第二种方案,字符数组来读取文件
public void readeFile2(){
    //定义变量接收需要读取文件的路径
    String pathName = "E:\\story.txt";
    //定义一个字符数组
    char[] buf = new char[20];
    int readerLen  = 0;
    //抽取Filereader对象名
    java.io.FileReader fileReader = null;

    try {
        java.io.FileReader reader = new java.io.FileReader(pathName);
        while ((readerLen = reader.read(buf)) != -1){
            System.out.print(new String(buf,0,readerLen));
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //这个地方在关闭字符读取流之前,加了一个非空的判断,就是为了避免在创建字符读取流的时候,报空指针异常
        if (fileReader != null){
            try {
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

(二)、FileWriter(字符输出流)用法

以一个样例来介绍字符输出流

需求:

有5中方法:

package com.guohui.writer_;

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

public class Writer {
    public void writerFile(){
        //定义想要输出的文件
        String pathName = "e:\\note.txt";
        FileWriter fileWriter = null;
        //方法2中需要定义的数组
        char[] chars = {'a','b','c'};
        try {
            fileWriter = new FileWriter(pathName,true);
            //方法1: 写入单个字符,用write(int c)方法
            fileWriter.write('H');
            //方法2: 写入指定的数组,用write(char[])
            fileWriter.write(chars);
            //方法3: 写入指定数组的指定部分,用write(char[],off,len)方法
            fileWriter.write("学习编程".toCharArray(),0,2);
            //方法4: 写入整个字符串,用writr(String)方法
            fileWriter.write("风雨之后,定见彩虹");
            //方法5: 写入字符串的指定部分
             fileWriter.write("你好北京 北京欢迎你",0,4);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {if (fileWriter != null){
                fileWriter.flush();
            }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                    fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Be explorer

若认可笔者文章,手头富裕望支持

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

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

打赏作者

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

抵扣说明:

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

余额充值