【InputStream, OutputStream 的用法】

文章介绍了Java中的字节流和字符流,包括Reader、InputStream、Writer和OutputStream的区别和使用。重点讲述了如何通过FileInputStream和FileOutputStream进行文件的读写操作,强调了文件关闭的重要性,以及如何使用try-with-resources语句自动关闭流。同时,提到了read()和write()的不同形式及其功能。
摘要由CSDN通过智能技术生成

1.字节流字符流

针对文本文件,提供了一组类,称为“字符流”(典型代表 Reader ,Writer)
针对二进制文件,提供一组类,称为“字节流”(典藏代表 InputStream,OutputStream)

字符流=》读写的基本单位是字符
字节流=》读写的基本单位是字节

流:Stream,是一个类别,对于字节流而言,如果想从文件中读取100个字节,那我们可以一次直接读取100个或一个读取50个,分2次读取或一个读取20个,分5次读取有很多方法。

每一种流对象,又分为两种(咋们讨论的输入输出,都是以cpu为基准的)
输入:Reader ,InputStream
输出:Writer,OutputStream

2.Reader和InputStream

查看InputStream源代码可以知道,这是一个抽象类,要是用的话需要一个实现类,我们最常用到的输入输出都是在文件上进行操作的,因此我们常用FileInputStream
在这里插入图片描述
因此我们在使用的时候,我们需要先找一个实现类

InputStream inputStream=new FileInputStream("d:/test.txt");
//大家注意,我们是new FileInputStream()
//里面指定一个文件路径,inputStream要打开这个文件的意思
//让当前的变量和这个文件关联起来

作为文件而言,我们有打开那么就一定会有关闭
inputStream.close();这个文件关闭十分重要,千万不要忘记
文件这里的资源吗,主要是以“文件描述符”,进程是使用PCB这样的结构来表示的(1.pid 2.内存指针,3.文件描述符),文件描述符就记载了进程打开了那些资源,没打开一个资源,就会在表中申请一个位置,,但是这个表是有程度限制的,一旦满了继续打开就会失败,导致咋们的代码/进程出现问题,这个问题是十分严重的。
所以大家一定要记得关闭文件。

那我们每一次都要手动关闭文件吗?其实不用,我们知道InputStream实现了一个特定的接口,那我们使用try语句来关闭

try(InputStream inputStream=new FileInputStream("d:/test.txt"))
        {
        //这样我们就不用手动关闭了,代码在出try语句的时候,会自动关闭文件
           //执行语句
        }

我们的读入有三个类型
read()无参数的read,相当于每一次读取一个字节
read(byte[] buffer)将读到的内容放到参数buffer数组中,此时的返回值是读到的字节数
read(byte[] buffer,int offset,int length)将读到的内容放到参数buffer数组中,但不是从头放,是从offest位置开始放,最多放length这么多内容,此时的返回值是实际读到的字节数

byte的范围是-128=》+127,或者是0-255,当文件读取完毕的时候,再次read就会返回-1,
在这里插入图片描述
大家看下面这个代码
当我们的文件写入abc,然后读取的会出现61,62,63,也就是abc的ASCII

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class Deno5 {
    public static void main(String[] args) throws IOException {
        try(InputStream inputStream=new FileInputStream("d:/test.txt"))
        {
            while(true)
            {
                int b=inputStream.read();
                if(b==-1)
                {
                    break;
                }
                System.out.printf("%x\n",b);
            }
            inputStream.read();
        }
    }
}

在这里插入图片描述
对于字符流来说Reader(输出),也是一样的
Reader Filereader
Writer FileWriter
构造方法打开文件
read方法来读(依次读一个char或者char[ ])
writer方法来写(一次写一个char或者char[]或者String)
close关闭

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Demo7 {
    public static void main(String[] args) {
        try (Reader reader = new FileReader("d:/test.txt")){
        while(true)
            {
                int c=reader.read();
                if(c==-1)
                {
                    break;
                }
                char ch=(char)c;
                System.out.println(ch);

            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

在这里插入图片描述

3.writer和OutputStream

其实OutputStream和InputStream的功能差不多,并且大部分是一样的,不过一个是输入一个是输出。
查看OutputStream源代码可以知道,这是一个抽象类,要是用的话需要一个实现类,我们最常用到的输入输出都是在文件上进行操作的,因此我们常用FileIOutputStream。
同样OutputStream,也需要关闭文件,同样我们使用try语句来自动关闭文件。

try (OutputStream outputStream=new FileOutputStream("d:/test.txt"))

并且outputStream.writer也有三种形式
在这里插入图片描述

void write(int b) 写入要给字节的数据
void write(byte[] b) 将 b 这个字符数组中的数据全部写入 os 中
int write(byte[] b, int off, int len)将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个。

这个代码就是把ASCII为99,100,98的字节写到文件中

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

public class Demo6 {
    public static void main(String[] args) throws FileNotFoundException {
        try (OutputStream outputStream=new FileOutputStream("d:/test.txt"))
        {
            outputStream.write(99);
            outputStream.write(100);
            outputStream.write(98);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

4.基本步骤

1.创建对象(打开文件),指定文件路径 =》绝对路径:从盘符开始
相对路径:以 .或 … 开头,必须要有一个基准目录/工作目录
2.读/写文件 read/writer,读完会以-1结束
3.关闭文件close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值