IO流(输入输出流)

本文介绍了Java中的IO流,包括字节流和字符流的使用。详细讲解了FileOutputStream和FileInputStream的创建及数据写入和读取方式,以及FileWriter和FileReader的构造方法和读写方法。文章还解析了字符流的工作原理,并提到了包装器BufferedReader的作用,增强了数据读写的效率。
摘要由CSDN通过智能技术生成

IO流

1.什么是I0流?
存储和读取数据的解决方案l: input0: output

​ 流:像水流一样传输数据

2.IO流的作用?
用于读写数据 (本地文件,网络)

3.IO流按照流向可以分类哪两种流?
输出流: 程序->文件
输入流: 文件->程序
4.IO流按照操作文件的类型可以分类哪两种流?字节流: 可以操作所有类型的文件字符流:只能操作纯 文本文件
5.什么是纯文本文件?用windows系统自带的记事本打开并且能读懂的文件txt文件,md文件,xml文 件,lrc文件等

一、字节文件输入和输出流对象

1.字节输出流(FileOutputStream)
(1)创建对象
// 创建对象
FileOutputStream fos=new FileOutputStream("E:\\1111\\1111\\test\\bbb.txt");
// 写入数据
fos.write(97);
// 释放资源
fos.close();
  • 参数表示的路径或者是File对象都可以
  • 如果文件不存在,则会创建一个新的文件,但是要保证父级路径是存在的
  • 如果文件已经存在,则会覆盖原来文件中的数据
(2)FileOutputStream写数据的3种方式
方法含义
void write(int b)一次写一个字节数据
void write(byte[] b)一次写一个字节数组数据
void write(byte[] b,int off,int len)一次写一个字节数组的部分数据
  • void write(byte[] b) 将字节数组中的所有数据全部写入文件中
FileOutputStream fos=new FileOutputStream("E:\\1111\\1111\\test\\bbb.txt");
byte[] b1= {97,98,99};
fos.write(b1);
  • void write(byte[] b,int off,int len)
FileOutputStream fos=new FileOutputStream("E:\\1111\\1111\\test\\bbb.txt");
byte[] b1= {97,98,99};
fos.write(b1,1,2);

byte[] b:表示传入的目标数组

int off:从数组的 off 位置开始

int len:需要传入的个数

2.字节输入流(FileInputStream)

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中去

(1)创建对象
// 创建对象
FileInputStream fis=new FileInputStream("E:\\1111\\1111\\test\\bbb.txt");
// 读取数据
fos.read(97);
// 释放资源
fos.close();
  • 如果文件不存在,就直接报错
  • 一次读一个字节,读出来的是数据在ASCII上对应的数字
  • 读到文件末尾了,read方法返回-1
  • 每次使用完流必须要释放资源
(2)FileInputStream循环读取数据
FileInputStream fis=new FileInputStream("E:\\1111\\1111\\test\\bbb.txt");
int b;
while((b=fis.read()) != -1){
	System.out.printli(b);
}
fis.close()

二、字符文件输出和输入流对象

1、字符输出流(FileWriter)
构造方法含义
public FileWriter(File file)创建字符输出流并关联本地文件
public FileWriter(String pathname)创建字符输出流并关联本地文件
public FileWriter(File file,boolean append)创建字符输出流并关联本地文件,续写
public FileWriter(String pathname,boolean appnd)创建字符输出流并关联本地文件,续写

若文件存在,则清空文件,若不存在,则新建文件

成员方法含义
void write(int c)写出一个字符
void write(String str)写出一个字符串
void write(String,int off,int len)写出一个字符串的一部分
void write(char[] cbuf)写出一个字符数组
void write(char[] cnuf,inty off,int len)写出一个字符数组的一部分
void flush()将缓冲区中是的数据,全部输出到文件中,并清空缓冲区
2、字符输入流(FileReader)
(1)创建对象
构造方法含义
public FileReader(File file)创建字符输入流关联本地文件
public FileReader(String pathName)创建字符输入流关联本地文件

如果读取文件不存在,则直接报错

(2)读取数据
成员方法含义
public int read()读取数据,读到末尾返回 -1
public int read(char[] buffer)读取多个数据,读到末尾返回 -1

按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数

1.read()
FileReader fr=new FileReader("E:\\1111\\1111\\test\\fileReaderDemo01.txt");
int len;
while((len=fr.read())!=-1) {
	System.out.print((char)len);
}
fr.close();

注意

  • read()默认也是 一个一个字节读取,如果遇到中文就会一次读多个字节
  • 在读取之后,方法的底层还会进行解码并转成十进制,最终把这个十进制作为返回值
  • 这个十进制也表示在字符集上的数字
2.read(char[] buffer)
FileReader fr1=new FileReader("E:\\1111\\1111\\test\\fileReaderDemo01.txt");
char[] chars=new char[2];
while((len=fr1.read(chars))!=-1) {
	System.out.println(len);
	System.out.println(new String(chars,0,len));
}

注意

  • 有参构造方法在底层进行了读取数据、解码、强制类型转换,并把强转后的数据存放在数组中
3、字符流原理解析

①创建字符输入流对象

​ 底层:关联文件,并创建缓冲区 (长度为8192的字节数组)

②读取数据

​ 底层:1、**判断缓冲区中是否有数据可以读取 **

​ 2、缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区

​ 如果文件中也没有数据了,返回-1

​ 3、缓冲区有数据:就从缓冲区中读取

空参的read方法:一次读取一个字节遇到中文一次读多个字节,把字节解码并转成十进 制返回

有参的read方法:把读取字节,解码、强转三步合并了,强转之后的字符放到数组中

当使用FileWriter创建对象时,往本地文件中写数据时,先会写到缓冲区,当缓冲区写满后,会将缓冲区内的数据一并写入本地文件,若缓冲区未满,则使用flush方法进行处理

4、包装器(BufferedReader)

相当于功能扩展器,并自带一个缓冲区,使得效率更高

方法含义
void readLine()一次读取一行
void flush(0)将缓冲区中是的数据,全部输出到文件中,并清空缓冲区
void newLine()跨平台换行

三、字节流和字符流的使用场景

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Kⅈꫛᧁ269

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值