目录

  • 1.字节流字符流
  • 2.Reader和InputStream
  • 3.writer和OutputStream
  • 4.基本步骤


1.字节流字符流

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

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

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

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

2.Reader和InputStream

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

java InputStreamReader 自动读取所有 inputstream读取字节_开发语言


因此我们在使用的时候,我们需要先找一个实现类

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,

java InputStreamReader 自动读取所有 inputstream读取字节_开发语言_02


大家看下面这个代码

当我们的文件写入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();
        }
    }
}

java InputStreamReader 自动读取所有 inputstream读取字节_字符流_03


对于字符流来说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();
        }

    }
}

java InputStreamReader 自动读取所有 inputstream读取字节_开发语言_04

3.writer和OutputStream

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

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

并且outputStream.writer也有三种形式

java InputStreamReader 自动读取所有 inputstream读取字节_c++_05

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();
        }
    }
}

java InputStreamReader 自动读取所有 inputstream读取字节_字符流_06

4.基本步骤

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