4-4 Java IO
文章目录
一、java.io.File
(1)是文件和目录路径名的抽象表示,有4种构造方法


(2)delete()方法可以删除文件,删了就真的无了,不会进入回收站;
createNewFile()可以创建新文件,创建成功返回true,如果该文件已经存在则返回false,表示创建失败

mkdir()表示文件不存在的时候创建文件夹

renameTo(), 重命名并放置在新的位置,原文件不存在了

需要注意的是,前面我们是路径分隔符是斜杆,虽然我们的Java是跨平台的,但是对于路径分隔符和名称分隔符来说,不同系统是不一样的,比如windows的路劲分隔符是斜杆,但是linux不认识,所以程序会运行不了。需要使用linux的分隔符,如下打印,上面是路径分隔符,下面是名称分隔符

二、文件遍历
如下代码表示输出e盘下所有的.avi文件的绝对路径
listFiles()表示遍历该层目录的所有文件和文件夹


也可以对其进行大小判断,以下表示100MB

三、文件过滤器(了解)
前面我们利用for循环实现了文件的过滤,但其实java是有直接的过滤器可以使用的哈哈哈哈,气不气。这里使用的是匿名内部类,其实就是listFiles()其实还有一个传入filter对象的构造方法,return true表示不从files数组中删除该文件注意不是真的删除

四、IO流

1.java.io.OutputStream
OutputStream是一个抽象类,我们一般使用它的子类
2.FileOutputStream
你肯定会说,不对呀,我输出的不是65吗,这里我们需要注意,我们前面说过了OutputStream是字节流,A的ASCII码就是65

其实我们还可以一次性写入一个数组,注意我们之前已经写入了一个A,我们这里再写入的是会先清空之前文件的内容再写入这次的内容

想使用追加模式的话加一个true就可以了

写数字太麻烦了,我们可以直接写字符然后转换成字节数组,但其实没有必要,因为我们真的要输出字符的时候我们会使用字符流

我们还能对write的范围进行限定,第二个参数表示从第几个下标开始写,第三个下标表示写入的字符的长度

2.java.io.InputStream
每次训话读取一个字节,当读取不到内容时返回-1, fis.read()加强制类型装换是因为fis.read()的防护类型为int

我们还能一次性读取多个数据,这里我们定义的是一次读取一个长度为10的数组,a.txt存的是26个字母。我们可以发现确实能正确运行,可以问题在于我们只有26个字母,字母还多补了几个红线处的字母。其实也很好理解,就是每次我们的数组会被传入10个字母,第二次读取传入的字母是klmnopqrst,由于第三次我们只有6个字母传入,所以数组只有前6位被修改

其实也很好解决,只需要获取读取的长度,并在输出时进行限定即可,划线处第二个参数表示从第几个下标开始读,第3个参数表示读取的长度

五、文件加密和解密
利用异或进行简单的加密和解密

六、字符输出流Writer
字节流在存储中文等非英文的时候,由于一个字符不止一个字节,这个时候使用字节流可能会导致一个字符只读取了一半,这是非常严重的。因此我们引入字符流,一次读取一个字符就不会出现这种问题
我们还是使用它的子类FileWriter

也可以利用append进行连续追加,注意文件是否追加和append没有关系,主要还是取决于之前的true,append其实和write类似,只不过可以连续输出多次而已

七、字符输入流Reader
一次读一个字符

一次读入一组字符

八、flush刷新缓存
在进行字符输出的时候会存在一个缓存用来暂存输出的字符,只有用flush刷新字符才会被写出在文件中。你可能会问之前我们没有用flush不是也输出成功了吗,原因是在close时会默认执行flush

九、字节流转换为字符流
输入

输出
十、打印流

或者

也可以用打印流的方式实现字节流到字符流的转换,输入输出同理

FileReader可以转换为BufferedReader,用以一次读取一行

十一、收集异常日志

十二、properties

注释中第一行是因为java默认properties文件中的不能出现汉子,默认转为unicode,其实在新的版本中已经可以出现了

当然也可以读取内容,其实properties就是利用map进行存储,所以红线处也可以利用get进行读取,getProperty是properties类特有的方法

十三、序列化与反序列化
所谓序列化就是将对象信息存储在文件中,注意一定要实现Serializable才能进行序列化,这是一个标记接口,里面没有任何抽象方法

反序列化就是再把对象信息从文件拿出来呗

十四、try-with-resources
我们想要读取一个字符需要进行下面一堆操作,非常麻烦

改进如下,jdk1.7之前,我们可以把文件对象的创建放在try里面,这个时候文件的关闭会自动在finally中执行

上面的方法看起来很nice,但是我们的对象是在try里面定义的,如果我们后面还要使用这个对象呢,用不了,于是在jdk1.9对其进行了优化。甚至可以传入多个对象,妙啊

当然我们也可以自定义类,但一定要实现Closeable接口

本文围绕 Java IO 展开,介绍了 java.io.File 的构造与操作,如文件创建、删除、重命名等;阐述了文件遍历、过滤方法;详细讲解了 IO 流,包括 OutputStream、InputStream 等,还涉及文件加密解密、字符流、字节流转换、打印流等内容,最后提及异常日志收集、序列化与反序列化等。

423

被折叠的 条评论
为什么被折叠?



