Java基础(十五)——IO流(一)、字节or字符输入输出流

Java基础(十五)——IO流、字节or字符输入输出流

一、File

1、File类下的一些方法的使用(一)

文件操作IO流。File类里面提供了很多方法:
在这里插入图片描述
下面是结果:
在这里插入图片描述

2、File类下的一些方法的使用(二)

a、额外知识:@Test——单元测试的使用和注意

在没有 main 函数的情况下,想要运行文件,或者只想要执行某个方法,可以使用 @Test 单元测试,那么此时就只会运行该部分方法。注意的点是:

1. 方法上添加 @Test。
2. 修饰符不能为 private。
3. 方法不能是静态的。
4. 当前包下不能有 Test 类。
5. 不能使用递归。

在这里插入图片描述

b、创建文件(父目录存在)

在这里插入图片描述
看上图标红线部分,这里会标红,是因为可能会有 File 这层路径不存在的可能,所以这里标红,这里需要抛出 IO 异常:
在这里插入图片描述
当不存在时,创建目录,此时可以发现文件已经创建。

换一种创建形式:
在这里插入图片描述

再换一种创建形式:
在这里插入图片描述

c、创建文件(父目录不存在时)

当要创建的文件的父目录不清楚在不在时,可以看以下代码:
在这里插入图片描述

d、创建文件(多层父目录不存在时)

这里很简单,只需要在上图代码中改动一块地方即可:parentFile.mkdirs():
在这里插入图片描述

e、单层父目录与多层父目录的区别

既然有多层,是否单层没有存在的意义呢?

并不是。mkdir()该方法才是创建的方法,而 mkdirs(),则是调用了递归,主要创建还是在mkdir()方法。而且在确定只缺少一层目录的情况下,mkdir()的效率高。

f、删除文件(只能删除空目录 or 文件)

删除文件,代码很少(只能删除空目录):
e,x_16)

g、打印目录下所有文件和目录的绝对路径

通过递归方式:
在这里插入图片描述

h、删除文件(目录含多个文件或目录)

二、文件字节输入流

1、根据数据的传输方向划分 ——以程序为参照物
输入流 文件 =>程序 读取数据
输出流 程序 =>文件 写出数据

2、根据读写的单位进行划分
字节流 ——单位为字节
字符流 ——单位为字符

3、根据功能进行划分
基础流
包装流

1、字节输入流——读一个字节

文件字节输入流:FileInputStream 抽象父类:InputStream

先写个读文件代码:
在这里插入图片描述
可以看到这里会标红,是因为如果文件不存在,则无法读取文件。所以这里捕获异常:
在这里插入图片描述
接着看读取字节API文档:
在这里插入图片描述

只读一个字节:
在这里插入图片描述
同样的,这里还是有异常,点击第二个,覆盖。然后输出看看:
在这里插入图片描述

在这里插入图片描述

直接上结论:这里是一个字节的读,且显示的是 ASCII 码表里字符对应的数字。 所以这里需要转换 char 数据类型。

这里看看 read()方法:
在这里插入图片描述
如果到达末尾,则会返回 -1。

最后,当所有操作都做完时,需要关闭资源,如果不关闭,则会一直占用资源;但是如果本身不占用资源,就是本身为 null 的状态,不关闭也无所谓。所以可以把关闭的代码放到 finally 里面,这样最后一定会执行这个代码关闭资源占用,所以最终代码为:
在这里插入图片描述

2、字节输入流——每次读取单个字节,循环读完整个文本

大部分代码都是一样,少部分改动:
在这里插入图片描述

3、字节输入流——每次读取一个数组的字节,循环读完整个文本

一个一个读取字节效率太低下,所以可以采用,一批一批的字节存入数组,然后每次读取一整个数组:
在这里插入图片描述
但是这样会有个弊端,数组能容纳1024的字节,但是如果每一行只有少量字符存在,则只有这几个字符是有效的,后面会有很多多余的空间出来:
在这里插入图片描述
所以,最终的代码为:
在这里插入图片描述
偏移量的意思是,如果是1,则从第一个字符开始往后面读取;这里一般都是0。

三、文件字节输出流

程序输出到文件。

1、字节输出流——每次写一个字节

输出流的代码跟输入差别不大,写主要是通过.write()方法:
在这里插入图片描述

所以这里每次运行,文件里面的内容都不会累加,如果要累加,则:
在这里插入图片描述
需要在这里加个 true,这样文件内容就会续写。

注意:
1、如果没有该文件,输出流会自动创建该文件。
2、每次写出单个字节,且每次实例化输出流对象,会把文件内容清空。
3、在构造方法中添加参数 true,代表末尾追加。

2、字节输出流——每次写一个数组

虽然要写入一个数组,但是无需创建数组,因为 String 类里面有个方法可以把字符串转换为字符数组:
在这里插入图片描述

3、拷贝文件——结合输入输出流

a、编写一个工具类

可以发现,输入输出最后在 finally 都需要关闭资源,所以可以写一个工具类,只需要传入对象,就可以执行关闭功能。

要注意,这里需要是 io 底下的方法。 三个点则是可变参数,本质是一个数组:
在这里插入图片描述

然后完整代码:
在这里插入图片描述

b、拷贝文件——使用输入输出流完成

在这里插入图片描述

4、使用字节流拷贝图片:

在这里插入图片描述

四、字符流

字符流的每一个单位都是字符。
字符流适合纯文本。

因为每个字符的单位占 2-4 个单位。所以如果刚好有某个字符卡在临界点,就会导致这个字符不能完整的读取出来,只会读取到乱码,所以需要字符流。

由于字符流跟字节流的代码差距不大,接下来直接贴代码:

1、一次读取单个字符

在这里插入图片描述

2、一次读取一组字符

在这里插入图片描述

3、输出字符

在这里插入图片描述

4、使用字符流拷贝文本

在这里插入图片描述

注意:拷贝图片,视频等不能用字符流,只能用字节流,字节流不会丢失数据。

猜你喜欢

转载自blog.csdn.net/qq_41824825/article/details/121363047
今日推荐