JAVA——IO流

目录

1.概述

字节流:

2.分类

3.输入文件数据

1.创建对象

2.写出数据

3.释放资源

4.读出文件数据

1.创建对象

2.读取数据

3.释放资源

5.字符集

a.ASCII

b.GBK

c.Unicode

6.乱码

7.编码、解码常见方法

a.编码方法

1.默认方式编码

2.指定方式编码

b.解码方式

1.默认方式解码

2.指定方式解码

字符流:

8.概述

8.读取文件数据

a.创建字符输入流对象

b.读取数据

c.释放资源

9.输入文件数据

a.创建字符输出流对象

b.写入数据

c.释放资源

10.字符输入流原理

a.创建字符输入流对象

c.读取数据

11.字符输出流原理


1.概述

存储和读取数据的解决方案,用于读写文件,或网络中的数据

字节流:

2.分类

流的方向:

操作文件类型:

**纯文本文件:**用windows系统自带的记事本打开并且能读懂的文件

3.输入文件数据

1.创建对象

续写:

**注意:**如果想续写,打开续写开关即可,第二个参数为开关的位置,默认false为关闭续写,反之,true为打开续写,此时创建对象不会清空文件

不续写:

注意:

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

2.如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

3.如果文件已经存在,则会清空文件

2.写出数据

off:起始索引 len:个数

**注意:**write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

换行符:

windows: \r\n

Linux: \n

Mac: \r

3.释放资源

**注意:**每次使用完流之后都要释放资源

4.读出文件数据

1.创建对象

**注意:**如果文件不存在,就直接报错

2.读取数据

**注意:**一次读一个字节数组的数据,每次读取会尽可能把数组填满

注意:

1.一次读一个字节,读出来的是数据在ASCII上对应的数字

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

3.释放资源

单字节拷贝vs多字节拷贝

单字节拷贝

java 复制代码
import java.io.*;
class Main {
    public static void main(String[] args) throws IOException {
        //输出文件对象
        FileInputStream fileInputStream = new FileInputStream("D:\\bbbb\\975a37e67072125d093411fa609c7ef9.mp4");
        //输入文件对象
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\aaaa\\新建.mp4");
        int b;//取出数据
        long l = System.currentTimeMillis();
        while ((b=fileInputStream.read())!=-1){
            fileOutputStream.write(b);
        }
        long l1 = System.currentTimeMillis();
        fileOutputStream.close();
        fileInputStream.close();
        System.out.println(l1-l);


    }
}

运行结果

复制代码

多字节拷贝

java 复制代码
import java.io.*;
class Main {
    public static void main(String[] args) throws IOException {
        //输出文件对象
        FileInputStream fileInputStream = new FileInputStream("D:\\bbbb\\975a37e67072125d093411fa609c7ef9.mp4");
        //输入文件对象
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\aaaa\\新建.mp4");
        int len;//取出数据
        byte [] b1=new byte[1024*1024*5];
        long l = System.currentTimeMillis();
        while ((len=fileInputStream.read(b1))!=-1){
            fileOutputStream.write(b1,0,len);
        }
        long l1 = System.currentTimeMillis();
        fileOutputStream.close();
        fileInputStream.close();
        System.out.println(l1-l);


    }
}

运行结果

5.字符集

a.ASCII

b.GBK

注意:

1.汉字两个字节存储

2.高位字节二进制一定以1开头,转成十进制之后是一个负数

3.英文一个字节存储,兼容ASCII,二进制前面补0

c.Unicode

UTF-8(编码方式):

ASCII 1个字节

拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文 2字节

中日韩文字、东南亚文字、中东文字 3字节

**注意:**编码中文时,第一个字节的首位是1

6.乱码

产生原因:

1.读取数据时未读完整个汉字

**字节流:**一次读取一个字节

2.编码和解码时的方式不统一

处理方法:

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

2.编码解码时使用同一个码表,同一个编码方式

7.编码、解码常见方法

a.编码方法

1.默认方式编码

2.指定方式编码

b.解码方式

1.默认方式解码

2.指定方式解码

字符流:

8.概述

**字符流:**字符流的底层其实就是字节流

特点:

**输入流:**一次读一个字节,遇到中文时,一次读多个字节

**输出流:**底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中

**使用场景:**对于纯文本文件进行读写操作

8.读取文件数据

a.创建字符输入流对象

b.读取数据

**字符读入数组:**进行了强制类型转换

注意:

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

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

c.释放资源

9.输入文件数据

a.创建字符输出流对象

注意:

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

2.如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

3.如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关

b.写入数据

**注意:**如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符

c.释放资源

10.字符输入流原理

a.创建字符输入流对象

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

c.读取数据

底层:

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

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

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

**3.缓冲区有数据:**就从缓冲区中读取。

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

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

11.字符输出流原理

内存中也存在一个缓冲区(长度为8192的字节数组),从内存中的缓冲区向目的地文件中写出数据需要满足三种情况之一:

**情况一:**缓存区装满了

**情况二:**flush()刷新

**情况三:**close()关流

相关推荐
weixin_4624284711 分钟前
使用 Caffeine 缓存并在业务方法上通过注解实现每3到5秒更新缓存
java·缓存
程序媛小果13 分钟前
基于java+SpringBoot+Vue的桂林旅游景点导游平台设计与实现
java·vue.js·spring boot
骑鱼过海的猫12315 分钟前
【java】java通过s3访问ceph报错
java·ceph·iphone
杨充21 分钟前
13.观察者模式设计思想
java·redis·观察者模式
Lizhihao_23 分钟前
JAVA-队列
java·开发语言
喵叔哟32 分钟前
重构代码之移动字段
java·数据库·重构
喵叔哟32 分钟前
重构代码之取消临时字段
java·前端·重构
fa_lsyk35 分钟前
maven环境搭建
java·maven
远望清一色41 分钟前
基于MATLAB边缘检测博文
开发语言·算法·matlab
何曾参静谧1 小时前
「Py」Python基础篇 之 Python都可以做哪些自动化?
开发语言·python·自动化