文章目录
- 1. I/O
- 1.1 常用API
- 1.2 I/O流
- 1.2.1 字节流
- 1.2.2 try-catch-finally和try-with-resource
- 1.2.3 字符流
- 1.2.4 其他的一些流
- 2. I/O框架
- 3. 特殊文件
- 3.1. Properties
- 3.2 XML
1. I/O
1.1 常用API
// 1. 创建文件对象File file = new File("E:\\ComputerScience\\java\\IO\\test.txt");// 2. 是否存在路径System.out.println(file.exists());// 3. 判断是否是文件System.out.println(file.isFile());// 4. 判断是否是文件夹System.out.println(file.isDirectory());// 5. 获取文件的名称(包括后缀)System.out.println(file.getName());// 6. 获取文件大小System.out.println(file.length());// 7. 获取文件最后修改时间System.out.println(file.lastModified());// 8. 获取创建文件对象时,使用的路径System.out.println(file.getPath());// 9. 获取绝对路径System.out.println(file.getAbsolutePath());File[] files = file.listFiles();for (File file : files) {System.out.println(file);}
1.2 I/O流
- I称为输入流:负责把数据读到内存中去
- O称为输出流:负责写数据出去
按流中数据的最小单位:
- 字节流:适合操作所有类型的文件
- 字节输入流:
InputStream
- 字节输出流:
OutputStream
- 字节输入流:
- 字符流:只适合操作纯文本文件
- 字符输入流:
Reader
- 字符输出流:
Writer
- 字符输入流:
1.2.1 字节流
FileInputStream
把磁盘文件中的数据以字节的形式读入到内存中去。
FileOutputStream
1.2.2 try-catch-finally和try-with-resource
finally是用于在程序执行完后进行资源释放的操作,即便出现了异常,也会执行finally的代码(专业级做法)
IDEA的快捷键是ctrl + alt + t
try {test4();
} catch (Exception e) {e.printStackTrace();
} finally {System.out.println("执行结束");
}
try-with-resource
是JDK7后有的,更加简洁,不需要写finally这个臃肿的代码块。即不需要我们去写一些close代码了,只需要在try的时候放到小括号里面。
static void test4() throws Exception {// 注意,括号里面只能放置资源对象try (OutputStream os = new FileOutputStream("test2.txt", true);) {byte[] bytes = "我爱你中国".getBytes();os.write(97);os.write(bytes);// 换行os.write("\r\n".getBytes());} catch (IOException e) {throw new RuntimeException(e);}}
1.2.3 字符流
字节流适合复制文件,但不适合读写文本文件;而字符流更适合读写文本文件内容。
字符流读文件,会把每一个字母、函字看成一个字符,所以不会出现乱码的问题。
FileReader(文件字符输入流)
static void test1() {try (Reader fr = new FileReader("test.txt");) {// 1. 一个一个的读取
// int c; // 记住每次读取的字符编号
// while ((c = fr.read()) != -1) {
// System.out.print((char) c);
// }// 2. 读取多个字符int len;char[] buf = new char[3];while((len = fr.read(buf)) != -1) {System.out.print(new String(buf, 0, len));}} catch (Exception e) {e.printStackTrace();}}
FileWriter
字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效!!!
1.2.4 其他的一些流
还有一些其他的流,就不一一列举了。
- 字节缓冲流
- 作用:提高字节流读写数据的性能
- 原理:字节缓冲输入流自带了8KB缓冲池,字节缓冲输出流自带了8KB缓冲池
- 转换流
InputStreamReader/OutputStreamWriter
- 作用:解决不同编码时,字符流读取文本内容乱码的问题
- 解决思路:先获取文件的原始字节流,再将其按照真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了
- 打印流
PrintStream/PrintWriter
- 作用:可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去
- 数据流
DataInputStream/DataOutputStream
- 允许把数据和其类型一并写出去
- 序列化流
- 对象序列化:把Java对象写入到文件中去
- 对象反序列化:把文件里的Java对象读出来
- 注意:对象如果要参与序列化,必须实现序列化接口(
java.io.Serializable
)
2. I/O框架
Commons-io是apache提供的一组有关IO操作的小框架,目的是提高IO流的开发效率。需要去Apache官网下载。
3. 特殊文件
3.1. Properties
- 是一个Map集合(Json类似)
- 核心作用:Properties用来代表属性文件,通过Properties可以读写属性文件里的内容
public class Properties_Demo1 {public static void main(String[] args) throws Exception {// 1. 创建一个Properties对象Properties properties = new Properties();// 2. 加载属性文件的键值对到对象中properties.load(new FileReader("src\\users.properties"));System.out.println(properties);// 3. 根据键取值System.out.println(properties.getProperty("张无忌"));properties.forEach((k, v) -> {System.out.println(k + " " + v);});}
}
3.2 XML
- XML本质是一种数据格式,可以存储复杂的数据结构,和数据关系。
- 应用场景:经常用来作为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。
<?xml version="1.0" encoding="UTF-8" ?>
<!--以上抬头声明必须放在第一行,必须有!-->
<!--根标签只能有一个-->
<users><user id = "1"><name>JehanRio</name><sex>男</sex><password>123456</password></user><user id = "2"><name>Bjergsen</name><sex>男</sex><password>654321</password></user>
</users>