Java入门(三十八)

IO流概述和分类

  • IO流概述:输入/输出(Input/Output) 。流是一种抽象的概念的总称,也就是说数据在设备间的传输称为流,流的本质是数据传输。
  • IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载。
  • 要把硬盘上的东西加载到内存里面,这个动作是输入,输入对应的是读数据。
  • 把内存中的内容放到硬盘上,是输出的动作,输出对应写数据。
  • IO流分类,按照数据的流向分为:输入流、输出流。
  • 按照数据类型来分又可以分为字节流和字符流。字节流分为字节输入流和字节输出流。字符流分为字符出入流和字符输出流。
  • 像这种读的懂的就叫做字符流
    在这里插入图片描述
  • 这种看不到的就是字节流
    在这里插入图片描述
  • 如果你不知道用哪种方式打开文件,就使用字节流,因为他是万能的。

字节流写数据

在这里插入图片描述

  • 这个抽象类是表示输入字节流所有类的超类,所以InputStream是所有字节输入流的超类。
  • 他的子类都是以InputStream作为后缀的。BufferedInputStream, ByteArrayInputStream, DataInputStream, FilterInputStream, read(), OutputStream, PushbackInputStream。那么我们看到这些名称之后就都知道是字节输入流。
  • OutputStream 类,这个抽象类是表示字节输出流的所有类的超类。
    在这里插入图片描述
  • 他子类的名称:ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream
  • 写入文件要用到他的子类FileOutputStream。他的作用就是要将数据写入到文件
    在这里插入图片描述
  • 下面的构造方法我们选择FileOutputStream(String name)使用,创建文件输出流以指定的名称写入文件。
    在这里插入图片描述
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class FileOutputStreamDemo01 {
    public static void main(String[] args) throws FileNotFoundException {
        //创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("基础语法/src/io/fos.txt");
    }
}
  • 上面语句在控制台什么也没有输出。但在模块里面多了一个文件,这个文件是没有内容的。
    在这里插入图片描述
  • 他一共做了三件事:调用系统功能创建了文件 。创建了字节输出流对象。让字节输出流对象指向创建好的文件。
  • 在这里我们使用最后一个write方法
    在这里插入图片描述
  • 将指定字节写入此文件输出流
//抛出父亲的异常
import java.io.FileNotFoundException;
//
        fos.write(97);
  • 在fos.txt文件里面可以看到一个a
    在这里插入图片描述
  • 所有跟io相关的操作最后都要释放资源。关闭此输出流,而且释放了与此流任何相关的系统资源。
fos.close();
  • 使用字节输出流对象(调用系统功能创建了文件,创建字节输出流对象指向文件)。调用字节输出流对象的写数据方法。释放资源。

字节流写数据的三种方式

方法名说明
void write(int b)将指定的字节写入此文件输出流,一次写一个字节数据
void write(byte[] b)将b.length字节从指定的字节数组写入此文件输出流,一次写一个字节数组数据
void write(byte[] b, int off, int len)将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流,一次写一个字节数组的部分数据
  • 看一下FileOutputStream类的源码,如果name不等于null,他就new 一个 File。
    在这里插入图片描述
  • 我们写以下代码的时候,给的参数不是null,所以底层这个动作就相当于做了一个new File的动作。
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class FileOutputStreamDemo02 {
    public static void main(String[] args) throws FileNotFoundException {
        FileOutputStream fos = new FileOutputStream("基础语法/src/io/fos.txt");
    }
}
  • 可以替换为,就相当于底层做了一个new File的动作,把字符串路径封装成了一个对象。
        FileOutputStream fos = new FileOutputStream(new File("基础语法/src/io/fos.txt"));
  • 这样创建也可以
        File file = new File("基础语法/src/io/fos.txt");
        FileOutputStream fos = new FileOutputStream(file);
  • 一次写一个字节的数据
        fos.write(97);
        fos.write(98);
        fos.write(99);
        fos.write(100);
        fos.write(101);

在这里插入图片描述

  • 第二个方法,void write(byte[] b) 首先我得有一个字节数组
        byte[] bys = {97,98,99,100,101};
        fos.write(bys);
  • 上面是字节写的字节数组,我们可以通过一个简单的方式来得到数组。String类里面有一个方法叫做getByte()。他是字符串类中的一个方法,他是通过一个字符串得到的一个字节数组。
        byte[] bys = "abcde".getBytes();
        fos.write(bys);

-第三个方法,一次写一部分数组里的数据。

        fos.write(bys, 0, bys.length);
        fos.write(bys, 1, 3);

在这里插入图片描述

字节流写数据的两个小问题

  • 字节流写数据如何实现换行?字节流写数据如何实现追加写入?
  • 下面代码循环写10个数据
        //创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("基础语法/src/io/fos2.txt");
        //写数据
        for(int i = 0; i < 10; i++){
            fos.write("hello".getBytes());
        }
        //释放资源
        fos.close();

在这里插入图片描述

  • 上面看到有10个数据,但都是在一行内,我现在想让他每个hello在一行。直接加一行代码即可
            fos.write("\n".getBytes());
  • 假如用windows的记事本打开的话会看到他没有换行。因为不同的操作系统他对换行符的识别是不一样的。windows识别的是\r\n
  • 字节流写数据如何实现追加写入呢?原来我们操作的时候都是覆盖写入。我们可以再创建对象的时候告诉他字节输出流式追加写入数据的。
    在这里插入图片描述
  • 该构造方法:如果第二个参数为true,则字节写入文件的末尾而不是开头
        FileOutputStream fos = new FileOutputStream("基础语法/src/io/fos2.txt",true);

在这里插入图片描述

字节流写数据加异常处理

  • 这里我们的代码有异常,之前是使用throws处理,现在我们是用try … catch…处理。
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo04 {
    public static void main(String[] args)  {
        try {
            FileOutputStream fos = new FileOutputStream("基础语法/src/io/fos3.txt");
            fos.write("hello".getBytes());
            fos.close();
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}
  • 如果程序出现异常,程序就会走到 catch (IOException e) 这里,而fos.close()就没有执行到。系统资源就一直被占用着。为了保证资源一定能被释放,java提供了一个关键字finally。
  • finally:在异常处理时提供finally块来执行所有清除操作,比如说IO流中的释放资源。特点:被finally控制的语句一定会执行,除非JVM退出。
try{
	可能出现异常的代码;
}catch(异常类名  变量名){
	异常的处理代码;
}finally{
	执行所有清除操作;
}
  • 加入finally实现释放资源
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("基础语法/src/io/fos3.txt");
            fos.write("hello".getBytes());
            fos.close();
        } catch (IOException e){
            e.printStackTrace();
        } finally{
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  • 假如路径不存在的时候,会报空指针异常
            fos = new FileOutputStream("/abc/基础语法/src/io/fos3.txt");

在这里插入图片描述

  • 为了健壮性,需要在代码里面加上一个条件,只有他判断不为null,才可以对fos释放资源
finally{
            if(fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值