Java中IO流——详解字节流之FileOutputStream和FileInputStream


前言

我们之前学习了Java中的异常机制和File类,现在正式进入IO流的学习。

一、Java流的概述

文件通常是由一连串的字节或字符构成。

  • 组成文件的字节序列称为字节流
  • 组成文件的字符序列称为字符流

Java中根据流的方向可以分为输入流和输出流。

  • 输入流是将文件或其它输入设备的数据加载到内存的过程
  • 输出流是将内存中的数据保存到文件或其他输出设备。
    在这里插入图片描述

二、常用字节流分类

在这里插入图片描述

1.字节输出输入流

1.FileOutputStream

1.FileOutputStream文件输出流:文件输出流是用于将数据写入file。
2.构造方法write()方法追加写入释放流等使用如下:

public class 字节输出流之FileOutputStream {
    //FileOutputStream 文件输出流:文件输出流是用于将数据写入file
    public static void main(String[] args) throws IOException {
        File file = new File("a.txt");
//一、构造方法
        //1.构造方法一:创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
            //注意:创建字节输出流对象做了哪几件事?
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        //2.构造方法二:创建一个向具有指定名称的文件中写入数据的输出文件流。
        FileOutputStream fileOutputStream1 = new FileOutputStream("b.txt");
//二、三个write()方法
        //1.write(int b)——将指定字节写入此文件输出流。
        fileOutputStream.write(97);
        fileOutputStream.write(98);
        fileOutputStream.write(99);
             //超过一个字节,丢弃多余字节
        fileOutputStream.write(200);

        //2.write(byte[] b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中。
        byte[] bytes = new byte[]{100,101,102,103};
        fileOutputStream.write(bytes);

        //3.write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
        fileOutputStream.write(bytes,0,1);//参数1是元素索引,参数2是个数
        //补充:利用getBytes()方法获取一个汉字的十进制表示
        byte[] bytes1 = "我".getBytes();
        fileOutputStream.write(bytes1);
        byte[] bytes2 = "我爱你悬悬小".getBytes();
        fileOutputStream.write(bytes2);

//三、追加写入
		//构造方法中的参数2,true代表追加写入。默认为false  
        FileOutputStream fileOutputStream2 = new FileOutputStream("c.txt",true);
        fileOutputStream2.write(bytes2);
        fileOutputStream2.write("\r\n".getBytes());


//四、释放流
        //流使用完毕之后,一定记得释放资源
        fileOutputStream.close();
        fileOutputStream1.close();

    }
}

2.FileInputStream

1.FileInputStream 从文件系统中的某个文件中获得输入字节。
2.构造方法read()方法释放流等使用如下

public class 字节输入流之FileInputStream {
    //FileInputStream 从文件系统中的某个文件中获得输入字节。
    public static void main(String[] args) throws IOException {
        //1.构造方法一:FileInputStream(File file)
        //          通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
        FileInputStream fileInputStream = new FileInputStream("a.txt");//输入流关联的文件必须存在!!

        //读入文件中的数据
        //1.read()--从此输入流中读取一个数据字节。如果读取不到,返回-1.(所以我们可以使用-1,判断文件是否读取完毕)
        int read = fileInputStream.read();
        System.out.println((read));
            //将int强转成char类型
        char ch=(char)read;
        System.out.println(ch);
        //2.read(byte[] b)——从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中
        FileInputStream fileInputStream1 = new FileInputStream("c.txt");
            //一次读取多个字节,填到字节数组中,返回的是读取到的有效字节个数。
        byte[] bytes = new byte[1024];//定义了字节数组充当缓冲区
        int read1 = fileInputStream1.read(bytes);
        System.out.println("实际读取到的字节个数"+read1);
            //输出内容:字节数组转化为字符串
        String s = new String(bytes,0,read1);
        System.out.println(s);

        //3.read(byte[] b, int off, int len)——从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
        int len = fileInputStream1.read(bytes, 0, 3);//只填充3个字节


        //释放资源
        fileInputStream.close();
        fileInputStream1.close();


    }
}

3.复制小练习

  1. demo1,循环一次读取一个字节,写入一个字节。(效率低)
public class 文件复制 {
    public static void main(String[] args) throws IOException {
        //1.封装源文件
        File F = new File("c.txt");
        FileInputStream in = new FileInputStream(F);
        //2.封装目标文件
        FileOutputStream out = new FileOutputStream(new File("C:\\Users\\46188\\Desktop\\", F.getName()));
        //3.复制,循环一次读取一个字节,写入一个字节完成复制(效率低)
        while(true){
            int by = in.read();
            if(by==-1){
                break;
            }
            out.write(by);
        }
        //4.释放资源
        in.close();
        out.close();

    }
}
  1. demo2,使用字符数组充当缓冲区
public class 文件复制2 {
    public static void main(String[] args) throws IOException {
        File FF = new File("小悬悬.txt");
        //1.封装源文件
        FileInputStream input = new FileInputStream(FF);
        //2.封装目标文件
        FileOutputStream output = new FileOutputStream(new File("C:\\Users\\46188\\Desktop\\", FF.getName()));
        //3.使用字节数组进行复制
            //创建字符数组充当缓冲区
        while (true){
            byte[] bytes1 = new byte[1024 * 8];
            int len = input.read(bytes1);//输出文件的内容填充到字符数组中,返回内容的字节个数
            if(len==-1){
                break;
            }
            output.write(bytes1, 0, len);//输入数组
        }
        input.close();
        output.close();


    }
}

4.异常捕获

  • 标准的流的异常处理
public class 流的异常处理 {
    public static void main(String[] args) {
        FileOutputStream fileOutputStream0 =null;
        try {
            fileOutputStream0 = new FileOutputStream("e.txt");
            fileOutputStream0.write("小悬悬".getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //释放资源
            try {
                if(fileOutputStream0!=null){
                    fileOutputStream0.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("下面的代码");

    }
}

总结

关于字节流中的FileOutputStream和FileInputStream不难掌握,其他流对象的原理和这两个是相同的,所以作为重点掌握。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值