在上一个博客说了File的字节流是以两种方法来实现的,这篇博客就说一下这两种方法的用法,
一,FileInputStream
先说一下InputStream里面包含的方法
但要注意这个InputSteam不能实例化,我们现在只从文件关注,所以只看FileInputStream
1.概述![](https://img-blog.csdnimg.cn/direct/6d9310c4a3974138a23c822e56f721a6.png)
如何使用这两个方法呢:
1.填写字符串表示的文件路径(绝对/相对路径均可)
2.填写File对象
InputStream inputStream = new FileInputStream("./hello");
这先是打开文件,如果没有出现异常打开成功,接下来就是读取文件内容
通过read方法来读取文件,总共有三种方法:
版本一:无参的
一次读取一个字节,通过返回值来表示了,但要注意,这里的返回值是int。
此处返回int也是有原因的:
1.因为读取文件结尾是-1,所以要有额外的地方来表示这个-1。
2.确保读到的字节都是正数,byte字节有符号,通过int就把它按照无符号来处理了。
版本二:有一个参数,byte[]
这个版本用的比较少,代码如下:
byte[] bytes = new byte[1024];
inputStream.read();
要先规定好空的数组,然后把方法执行完毕之后,填写到byte数组中去。一次取多少,是按照你数组的长度来的,read会尽量把数组填满,最后不够也就能填多少填多少。
版本三:指定填充多大
也就是版本二的进阶版,可以指定填充多大的,从offset下标开始,最多填充len这么长。
也就是在网络中比如前面的报头需要填充一部分,后面的载荷有需要填充另一部分,所以也是很实用的。
2.无参vs有一个参数的
那写完了之后,无参的传输快还是有参数的传输快呢,第一个read()频次高,但一次只能读取一个字节,而read(byte[])频次一般,但一次读取的内容还是非常丰富的,而且调用read都是需要系统api访问硬盘的,访问硬盘肯定会导致效率变慢,所以肯定是带有一个参数的更快一点。
3.close
关闭文件也是一个很重要的操作,如果一直打开文件还不关闭文件,在后面堆积起来,就是一个定时炸弹。
在打开文件的时候,会操作系统内核,给文件描述符添加一个元素,当执行close的时候,就会释放这个文件描述符所对应的元素,如果一直没有关闭,导致占满了,就会导致文件打不开的情况发生。
二,Outputstream
先说一下它的方法:
这里面和上面对应,也是三种方法,这里在概述一下
1.概述
版本一,一次write一个字节,参数是int类型
版本二,一次write若干个字节,会把参数数组中的所有字节写入文件中。
版本三,一次write若干个字节,把数组offset下标开始,连续写len个字节。
这里要注意,OutputStream直接默认打开是会清空文件内容的,代码如下:
public static void main(String[] args) throws IOException {
try (OutputStream outputStream = new FileOutputStream("./hello.txt")){
}
}
这样打开之后,就会清空文件夹,要不想清空,就要以追加写的方式打开,也就是增加一句true。
public static void main(String[] args) throws IOException {
try (OutputStream outputStream = new FileOutputStream("./hello.txt",true)){
}
}
2.读取
这边的read分了四个,我们只需要看前两个就可以了,第一个和上面一样,一次读取一个字节。
第二个是有一个参数char[] 这种的。
3.write
第一个是往里写一个字节,第二个往里写一个字符串,第三个往里写一个字符数组,第四个和第五个往里写的有限制一次写多少。
重点关注第二个就行了,简单。
代码如下:
public static void main(String[] args) throws IOException {
try (Writer writer = new FileWriter("./hello.txt",true)){
writer.write("你好世界");
}
}