Java IO流详讲

本文详细介绍了Java中的IO流,包括File类的使用、字节流和字符流的操作,以及特殊操作流如标准输入输出、打印流、对象序列化流和随机访问流。内容涵盖文件的创建、判断、获取和删除,字节流的读写及缓冲,字符流的转换和编码处理,以及异常处理和文件复制。此外,还探讨了不同操作系统下的换行问题和乱码解决方案。
摘要由CSDN通过智能技术生成

前言

流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出

一、File

1.File类的概述和构造方法

在这里插入图片描述

在这里插入图片描述

通过如上的图相信对文件打的相关应用已经有了初步的认识,因为封装的不是真正存在的文件,仅仅是一个路径名而已,所以没有那个路径的文件也可以写,不会报错,将来是把不存在的转换为具体存在的。

2.File类创建功能

在这里插入图片描述

这里需要注意的是:不能根据目录来判断是创建的文件还是目录,而是通过调用的方法来判断的,路径那个只是名字而已,文件和目录的名字也不能是一样的

3.File类判断和获取功能

在这里插入图片描述

4.File类删除功能

在这里插入图片描述

二、字节流 

1.IO流的概述和分类

概述

在这里插入图片描述

分类

在这里插入图片描述

2.字节流写数据

在这里插入图片描述

注: 记得一定要释放资源 

3.字节流写数据的两个小问题

字节流写数据如何换行?

在这里插入图片描述

不同的操作系统的换行是不一样的 

字节流写数据如何实现追加写入?

在这里插入图片描述

值得注意的是是在文件的后面添加,而原来的数据还是有的,所以在用的时候就要考虑一下是怎样使用自己的文件的 .

4.字节流写入数据假异常处理

在这里插入图片描述

就是简单的异常处理而已,如果不使用处理的话就抛出就可以了

5.字节流读数据(重点) 

一次读一个字节的数据

在这里插入图片描述

标准的代码格式就是这样的

在这里插入图片描述

一次读一个数组的数据

在这里插入图片描述

在这里插入图片描述

字节流读数据其实很简单,这里需要注意的是字节流读数据的话可以有两种方法,至于使用怎样的方法就得取决于自己得使用就行了

6.字节缓冲流

在这里插入图片描述

在这里插入图片描述

缓冲流读取的原理是

使用BufferedInputStream的read()方法读取硬盘上的字节数据时,实际上调用的是FileInputStream的read(byte[] b)方法,把读取的数据先存放到一个字节数组中(byte[]),也就是字节流缓冲区中.再从字节数组(字节流缓冲区)取出字节数据,BufferedInputStream的read()方法读取字节数据时,一次只能从缓冲区读取一个字节,每次读取一个字节数据,指针(pos)会后移一位,字节数组存储数据数量(count)减一,当字节数组为空,即count = 0时,缓冲区的数据已经全部取出,此时指针pos指向字节数组最后一位。然后根据count = 0 判断字节数组数据已取出完,再从硬盘上读取数据存储到字节数组中,此时要将指针pos重置到字节数组的首位,然后依次循环,当硬盘数据全部读取完后,count的值为-1

缓冲流写入数据原理:

每一次写是先写到缓冲区中, 如果缓冲区满了(或者调用了刷新的方法flush() / close() 方法), 则在写到文件中, 目的也是减少io次数, 来加快读写效率.

7.如何选择怎样得数据读取呢?

在这里插入图片描述

从图中可以看出字节缓冲流得读取比基本得字节读取要快很多,如果要节省时间得话就可以考虑用字节缓冲流来进行字节流得读取 

三、字符流()

1.为什么会出现字符流?

在这里插入图片描述

所以他的底层操作的实质还是字节流

编码表

在这里插入图片描述

 这里需要注意的是用的什么编码就必须用对应的解码,否则就会出现乱码的情况

2.字符串中的编码解码问题

在这里插入图片描述

在这里插入图片描述

3.如何实现解决编译解码的问题

InputStreamReader和OutputStreamWriter也被称为转换流(字节流和字符流之间的转换)

在这里插入图片描述

其实写的时候是写在了缓冲区,并没写在文件里,可以刷新,也可以关闭流它会自动的刷新 

代码理解

在这里插入图片描述

4.字符流写数据的方法

在这里插入图片描述

在这里插入图片描述

5.字符流读数据的方法

在这里插入图片描述

在这里插入图片描述

字节流与字符流的读数据的思想是一样的只不过一个是字符,一个是字节而已

6.字符流复制文件

其方法和字节流的方法一样,只是一个是字节一个是字符而已
方法一:一个一个的字符进行的复制
方法二:一个字符数组一个字符数组的复制

准换流
OutputStreamWriter 他又一个子类是:FileWriter
InputStreamReader 它有一个子类是: FileReader
我们在复制文件等相关操作的时候可以用他的子类进行操作,书写更加的简单,但是,在进行编码问题解决的时候还是得用转换流才可以

7.字符缓冲流

在这里插入图片描述

在这里插入图片描述

 字符缓冲流的特有功能

在这里插入图片描述

那么可以做什么呢?
我们可以通过其中特有的功能进行文件的复制等
需要注意的是readline只是读的是内容,不读其他的 

8.字节,字符流小结

在这里插入图片描述

 字符流

关于乱码的问题
个人认为出现乱码是因为如果用的是字节流的话用char来强制转换显示的话就是只有其中的一部分并没有把一个汉字的那个文字表达组如(【-1,23,36】)表达完整,但是如果用new String()来显示的话会表达完整(可能是里面有相应的方法,具体不清楚,知道就行了),如果用的是字符流的话就是用的默认的编码以及你相应要求的编码来表达,所以就不会出现乱码的问题了

9.复制文件的异常处理

在这里插入图片描述

在这里插入图片描述

四、特殊操作流 

1.标准输入流

在这里插入图片描述

在这里插入图片描述

 2.标准输出流

在这里插入图片描述

在这里插入图片描述

3.打印流

字节打印流

在这里插入图片描述

在这里插入图片描述

字符打印流

在这里插入图片描述

在这里插入图片描述

4.对象序列化流与对象反序列化流(它是基于字节流上的)

对象序列化流

在这里插入图片描述

在这里插入图片描述

对象反序列化流

在这里插入图片描述

在这里插入图片描述

还有一些其它的方法:

(1); writeInt();

(2): writeBoolean();

(3): flush();

(4): close();

5.解决对象序列化流的三个问题

在这里插入图片描述

在这里插入图片描述

注: private static final long serialVersionUID = 42L;作用是

由于不同版本的JVM是不能加载不同版本的对象的,因此用这个ID来标识他。

6.随机流

RandomAccessFile类支持随机访问的方式, 程序可以直接跳到文件任意地方进行读写支持访问文件的部分内容.

相应的构造器

(1)RandomAccessFile(File file, String mode);

(2)RandomAccessFile(String filename, String mode);

注; mode参数可以指定RandomAccessFile的访问模式

(1) r :   只读方式打开

(2)rw:   打开以便读取和写入

(3)rwd: 打开以便读取和写入, 同步文件内容的更新

(4)rws: 打开以便读取和写入, 同步操作内容和原数据更新;

读操作

写操作

注: 如果加入到文件中有一些特殊符号, 则会导致文件内容出现混乱, 因为它是已固定的字节数转换成相应的字符串, 而有些符号并不是用2个字节来表示..

其它一些相应的方法:

(1) getFilePointer(): 获取文件记录指针的当前位置

(2) seek(long pos): 讲文件记录指针定位到指定的pos位置

(3) close(): 关闭流

拓展知识: Java获取系统默认的编码的两种写法

(1)System.out.println(System.getProperty("file.encoding"));

(2)System.out.println(charset.defaultcharset());

7.数据流

为了方便操作Java语言的基本数据类型和String类型

(1): DataInputStream

(2): DataOutputStream

具体用法直接看代码吧

 一些响应的方法

8.Properties

在这里插入图片描述

代码理解(properties作为map集合的使用)

在这里插入图片描述

properties作为集合特有的方法

在这里插入图片描述

第一个是写数据进入集合
第二个是根据键得到值
第三个是得到键得集合

在这里插入图片描述

Properties和IO流结合的方法

集合数据写到文件

在这里插入图片描述

文件写到集合

在这里插入图片描述

参考文章: https://www.jb51.net/article/221207.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值