首页 > 其他分享 >回顾IO流(字节流和字符流)

回顾IO流(字节流和字符流)

时间:2023-03-18 16:15:16浏览次数:54  
标签:字符 字节 文件 read fos char IO new

IO流

1.什么是IO流

存储和读取数据的解决方案

2.IO流的作用

用于读写数据(本地,网络)

3.IO流按照流向可以分为哪两种?

程序->文件 (Input)

文件->程序(Output)

4.IO流按照操作文件的类型可以分为哪两种?

字节流:操作所有类型文件

字符流:智能操作纯文本文件(txt,md,xml等)

IO流的体系

字节流

  • InputStream

FileInputStream(文件字节输入流)

流程:

创建对象

参数是字符串表示的路径或者File对象都可以

如果路径文件不存在会报错

new .FileIntputStream()

写数据

fos.read()

一次读一个字节,读出来的是ASCII上对应的字符

读到文件末尾,read方法返回-1

循环读取

int b;

read读一次移动一次指针,用一个中间值作为返回值载体

while((b=fis.read())!=-1){

System.out.println((char)b)

}

释放资源

每次使用完必须释放资源

fis.close()

  • OutputStream

FileOutputStream(文件字节输出流)

流程:

创建对象

 

new .FileOutputStream()

参数是字符串表示的路径或者File对象都可以

如果文件不存在会创建一个新文件,但父级路径必须纯在

如果文件已存在会清空

写数据

三种方式

1个字节

fos.write(byte)

1个数组

fos.write(byte[])

1个数组的部分

fos.write(byte[],起始索引,个数)

写到本地文件中的是整数在ASCII对应的字符

释放资源

fos.close()

每次使用完流都要释放资源

两个补充:

如果不想清空已有文件,需要把续写开关打开(创建对象时加入一个参数true,默认不写是false)

如果想要换行可以写入\r\n进行换行.

 文件拷贝流程

1.创建输入输出流

2.创建byte数组来控制每次读取的大小

3.用len记录每次的读取长度

4.边读边写,读多少,写多少

5.释放资源

 

public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("aaa.txt");
FileOutputStream fos=new FileOutputStream("bbb.txt");
int len;
byte [] bytes=new byte[1024*1024*5];
while ( (len=fis.read(bytes))!=-1){

fos.write(bytes,0,len);
}
fis.close();
fos.close();
}

 

 

字符流

字符集

1.计算机中任意数据都是以二进制的形式来存储的

2.计算机中最小的存储单元是一个字节

3ASCII中,一个英文占一个字节

4.简体中文Windos,默认使用GBK字符集

5.GBK完全兼容ASCII

一个英文一个字节,开头是0

一个中文占两个字节,高位字节开头是1

6.UTF-8

一个英文一个字节,开头是0,转换成十进制是正数

一个中文三个字节,格式为1110xxxx 10xxxxxx 10xxxxx

7.为什么会有乱码

原因一:没有读取完整的汉字

原因二:编码解码方式不统一

解决办法:

不要用字节流读取文本文件

编码解码用同一种方式

 

  • Reader

FileReader(文件字节输入流)

流程:

创建对象

参数是字符串表示的路径或者File对象都可以

如果路径文件不存在会报错

new .FileReader()

写数据

fr.read()无参

默认一次读一个字节,遇到中文一次读写多个,GBK一次两字节,UTF-8一次三个字节(默认)

读到文件末尾,read方法返回-1

循环读取

int b;

read读一次移动一次指针,用一个中间值作为返回值(二进制转换成的十进制数据)载体

while((b=fis.read())!=-1){

System.out.println((char)b)

}

 

frread(char{})有参

char [] chars=new char[2].;

int len;

read读一次移动一次指针,用一个中间值作为返回值(二进制转换成的十进制数据)载体

while((len=fr.read(chars))!=-1){

System.out.println(new String(chars,起始索引,len))

}

释放资源

每次使用完必须释放资源

fr.close()

  • writer

FileWriter(文件字符输出流)

流程:

创建对象

 

new .FileOutputStream()

参数是字符串表示的路径或者File对象都可以

如果文件不存在会创建一个新文件,但父级路径必须存在在

如果文件已存在会清空

写数据

五种方式

先进行编码,编码后再写到文件中(默认UTF-8)

1个字符

fw.write(int)//

1个字符串

fw.write(String)

1个字符串的部分(String,起始索引,个数)

1个char数组

fw.write(char[])

1个char数组的部分(char[],起始索引,个数)

写到本地文件中的是整数在ASCII对应的字符

释放资源

fw.close()

每次使用完流都要释放资源

两个补充:

如果不想清空已有文件,需要把续写开关打开(创建对象时加入一个参数true,默认不写是false)

如果想要换行可以写入\r\n进行换行.

 

字符输入流底层原理

创建对象

关联文件,并创建一个缓冲区(长度为8192字节的数组)

提取数据

1.判断缓冲区是否有数据可读

2.缓冲区没有数据,就从文件中获取数据装入缓冲区,每次尽可能装满,文件也没有了返回-1

3.缓冲区有数据,从缓冲区中读取

空参,一次读一个字节,中文读多个字节,并把字节解码并转成十进制返回

有参,把读取,解码,强转三步合一,强转之后的字符放到数组中

字符输出流底层原理

在文件中写入操作前会将文件中的数据转换成字节并存入缓冲区中每次尽可能装满.

1.装满了,自动写入

2.未装满,利用flush刷新就会写入文件,刷新后还可以继续进行写入

3.未装满,利用close回收资源,此时会将缓冲区中的内容写入文件并结束这次输出.

 

标签:字符,字节,文件,read,fos,char,IO,new
From: https://www.cnblogs.com/zlsame/p/17230959.html

相关文章

  • Apache Commons Connection
    目录CollectionCollectionStringstr=null;Listlist1=Arrays.asList(newString[]{"1","2","3"});Listlist2=Arrays.asList(newString[]{"1","2","4"});......
  • sklearn.model_selection.train_test_split
    参考:sklearn.model_selection.train_test_split(*arrays,test_size=None,train_size=None,random_state=None,shuffle=True,stratify=None)目的:将数组或矩阵分割为随......
  • Vue3 + go + axios 的前后端交互
    下载npminstallaxiosaxios全局配置创建一个js文件用于保存axios设置,配置文件自行搜索在main.js中使用保存好的axios设置```jsimportaxiosfrom'@/plugins/axi......
  • axios
    axiosaxios可以局部导入和全局导入首先要下载axios插件全局导入当把axios挂载到mainjs中,就是全局了,在其他的组件中就不需要再导入了①main.js导入axiosimportaxios......
  • Cookie和Session
    cookie与session的简介网站的发展史刚开始的网站没有保存用户的功能的需求,所有用户访问返回的结果都是一样的(eg:新闻、博客、文章...)后来出现了一些需要保存用户信息的......
  • storybook插件说明: integrations与addons推荐
    官方的:https://storybook.js.org/integrations/https://github.com/storybookjs/storybook/blob/master/ADDONS_SUPPORT.md 我所推荐的的三个: yarn add -D @stor......
  • java中判断字符串是否为数字的三种方法
    1用JAVA自带的函数publicstaticbooleanisNumeric(Stringstr){for(inti=str.length();--i>=0;){if(!Character.isDigit(str.charAt(i))){returnfalse;......
  • PaginationSupport加强版的分页代码
    PaginationSupport.java,这个类网上有,我把它加强了一下,看下面importjava.util.ArrayList;importjava.util.List;publicclassPaginationSupport......
  • 【开发环境】IntelliJ IDEA 中的 Gradle 工程处理 JSON 字符串
    文章目录​​一、创建Gradle工程​​​​二、导入org.json:json依赖​​​​三、处理JSON字符串​​一、创建Gradle工程在IntelliJIDEA中,选择"菜单栏|Fi......
  • 第十三届蓝桥杯省赛 Java B 组 C题——字符统计(AC)
    目录​​1.字符统计​​​​1.题目描述​​​​2.输入格式​​​​3.输出格式​​​​4.数据范围​​​​5.原题链接​​​​2.解题思路​​​​3.Ac_code​​1.字符统计1.......