文件
什么是文件:
文件对我们并不陌生,是保存数据的地方,比如大家经常使用的word文档,txt文件,excel文件...都是文件。它既可以保存一张图片,也可以保存视频,声音。
文件流:
文件在程序中是以流的形式操作的
![](https://img-blog.csdnimg.cn/img_convert/521659bf3bc1a1fbbf084ec5d85950f8.png)
流:数据在数据源(文件)和程序(内存)之间经历的路程
输入流:数据从数据源(文件)到程序(内存)的路程
输出流:数据从程序(内存)到数据源(文件)的路程
常用文件操作
创建文件相关构造器和方法:
相关方法:
① new File(String pathname) //根据路径构建一个File对象
② new File(File parent, String child) //根据父目录文件 + 子路径构建
③new File(String parent, String child) //根据父目录 + 子路径构建
createNewFile //创建新文件
![](https://img-blog.csdnimg.cn/img_convert/0a68fdfa5c3ba4809a1fe942edf449cf.png)
System.out.println("文件名字" + file.getName());
System.out.println("文件绝对路径" + file.getAbsoluteFile());
System.out.println("文件父级目录" + file.getParent());
System.out.println("文件大小(字节)" + file.length());
System.out.println("文件是否存在" + file.exists());
System.out.println("是不是一个文件" + file.isFile());
System.out.println("是不是一个目录" + file.isDirectory());
目录的操作和文件的删除
mkdir创建一级目录,mkdirs创建多级目录,delete删除空目录或文件
public class Directory_ {
public static void main(String[] args) {
}
//判断D盘下d:\\news1.txt是否存在,存在就删除
@Test
public void m1(){
String filePath = "e:\\news2.txt";
File file = new File("e:\\news2.txt");
if(file.exists()){
if (file.delete()){
System.out.println(file.getName() + "删除成功");
}else {
System.out.println(file.getName() + "删除失败");
}
}else {
System.out.println("该文件不存在");
}
}
// 判断 D:\\demo02 是否存在,存在就删除,否则创建一个
//在Java编程中目录也可以当成一种特殊的文件
@Test
public void m2(){
String filePath = "e:\\demo\\a\\b\\c";
File file = new File(filePath);
if(file.exists()){
System.out.println("has demo");
}else {
file.mkdirs();
}
}
}
IO流原理及其分类
Java IO流原理
1.I/O 是 input/output 的缩写,I/O 技术是非常实用的技术,用于处理数据传输.如读写/文件,网络通讯等
2.Java程序中,对于数据的输入和输出我们是按 “流” 的方式进行
3.java.io包下提供了各种 “ 流” 的类和接口,用以获取不同种类的数据,并通过方法输入和输出数据
4.输入input:读取外部数据(磁盘,光盘等存储设备的数据)到程序(内存)中
5.输出output:将程序(内存)数据输出到磁盘,光盘等存储设备中
流的分类
按操作数据单位不同分为:字节流(8 bit)二进制,字符流(按字符)文本文件
按照数据流向不同分为:输入流,输出流
按流的角色不同分为:节点流,处理流/包装流
![](https://img-blog.csdnimg.cn/img_convert/c7ce4e632fcdada6f751898e1cd16f07.png)
IO流体系图 - 常用类
IO流体系图
![](https://img-blog.csdnimg.cn/img_convert/9d2b70690cfe6d5b506c5b6dccdc06f7.png)
文件vs流
流是传输工具
![](https://img-blog.csdnimg.cn/img_convert/65dbe4be746c4e0900177f0dfdf16847.png)
InputStream字节输入流:
InputStream抽象类是所有类字节输入流的超类
InputStream 常用的子类
1.FileInputStream:文件输入流
2.BufferedInputStream:缓冲字节输入流
3.ObjectInputStream:对象字节输入流
FileInputStream介绍
![](https://img-blog.csdnimg.cn/img_convert/672f364edc7503bc796248761932d5f4.png)
FileOutputStream介绍
![](https://img-blog.csdnimg.cn/img_convert/f495baab0398405f8b116e4804dffee9.png)
public class FileOutputStream_ {
public static void main(String[] args) {
}
@Test
public void writeFile() throws IOException {
//创建一个FileOutputStream对象
FileOutputStream fileOutputStream = null;
String filePath = "e:\\a.txt";
try {
//new FileOutputStream(filePath)创建方式,当写入内容时,会覆盖原来内容
//new FileOutputStream(filePath, true)创建方式,当写入内容时,追加到文件末尾
fileOutputStream = new FileOutputStream(filePath, true);
//写入一个字节
// fileOutputStream.write('H');
//写入字符串
String str = "Hello Word";
//str.getBytes()将字符串改为字节类型数组
// fileOutputStream.write(str.getBytes());
fileOutputStream.write(str.getBytes(), 0, str.length());
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
fileOutputStream.close();
}
}
}
文件拷贝
package OutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) throws IOException {
//完成文件拷贝,将文件将e:\\hello.txt 拷贝到 c盘
//思路分析
//1.创建文件输入流,将文件读入到程序
//2.创建文件输出流,将读取到的文件数据,写入指定文件夹
String srcFilePath = "e:\\hello.txt";
String destFilePath = "e:\\hello132465.txt";
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(srcFilePath);
fileOutputStream = new FileOutputStream(destFilePath);
//创建字节数组提高读取效率
byte[] buf = new byte[104];
int readLen = 0;
while ((readLen = fileInputStream.read(buf)) != -1){
//读取后就写入文件
fileOutputStream.write(buf, 0 ,readLen);
}
//拷贝成功
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
if(fileInputStream != null) {
fileInputStream.close();
}
if (fileOutputStream != null){
fileOutputStream.close();
}
}
}
}
FileReader 和 FileWriter介绍
都是字符流,即按照字符操作IO
![](https://img-blog.csdnimg.cn/img_convert/7167f088890911a39f2a1ab9128d3ff9.png)
FileReader相关方法:
1.new FileReader(File/String)
2.read:每次读取单个字符,返回该字符,如果到文件末尾,返回 -1
3.read(char[]):批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾,返回 -1
相关API:
new String(char[]):将char[]转换成String
new String(char[], off, Len):将char[]的指定部分转化成String
![](https://img-blog.csdnimg.cn/img_convert/e64fb4358e003713adfad47c11ee2ce8.png)
FileWriter常用方法
1.new FileWriter(File/String):覆盖模式,相当于流的指针在首端
2.new FileWriter(File/String, true):追加模式,相当于流的指针在尾端
3.write(int):写入单个字符
4.write(char[]):写入指定数组
5.write(char[], off, Len):写入指定数组的指定部分
6.write(string):写入指定字符串
7.write(string, off, Len):写入指定字符串的指定部分
相关API:
String类:toCharArray:将String转换成char[]
注意
FileWriter使用后,必须要关闭(close)或刷新(flush),否则无法写入到指定文件
节点流和处理流
基本介绍
1.节点流可以从一个特定数据源(存放数据的地方)读取数据,如FileReader,FileWriter
![](https://img-blog.csdnimg.cn/img_convert/c80fbb305d5eda4a6bea980fba53585d.png)
2.处理流(也叫包装流)是"连接"在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,也更加灵活。如BuffereredReader,Buffered Writer
![](https://img-blog.csdnimg.cn/img_convert/40b1de1d56b86e5839a049f0a4d2ebe5.png)
注:BufferReader 类中,有属性Reader,即可以封装一个节点流,该节点流是任意的,只要是Reader子类
![](https://img-blog.csdnimg.cn/img_convert/817f14f6dd71e7382b8704331c891065.png)
节点流和处理流的区别和联系
1.节点流是底层流/低级流,直接和数据源相接
2.处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供方便的方法来完成输入和输出
3.处理流(包装流)对节点流进行包装,使用了修饰器模式,不会直接与数据源相连
处理流的功能主要体现在以下两个方面:
1.性能的提高:主要以增加缓冲的方式来提高输入和输出的效率
2.操作的便捷:处理流可能提供了一系列便捷的方式来一次输入输出大批量的数据,使用更加灵活方便
处理流BufferedReader 和 BufferedWriter
1.BufferedReader 和 BufferedWriter 属于字符流,是按照字符来读取数据的
2.关闭时,只需关闭外层流即可(关闭包装流,底层自动关闭被包装的节点流)
BufferedInputStearm 和 BufferedOutputStream
1.BufferedInputStearm:
![](https://img-blog.csdnimg.cn/img_convert/dae44408bb2f964b904ad91aa99d05f9.png)
BufferedInputStream 是字节流,在创建BufferedInputStream时,会创建一个内部缓冲数组
2.BufferedOutputStream:
BufferedOutputStream是字节流,实现缓冲的输入流,可以将多个字节写入底层输入流中,而不必对每次字节写入调用底层系统
![](https://img-blog.csdnimg.cn/img_convert/f77d74ef7cb3cb010eb896bce6eb7212.png)
对象流-ObjectInputStream 和 ObjectOutputStream
序列化和反序列化:
1.序列化就是在保存数据时,保存数据的值和数据类型
2.反序列化就是在恢复数据时,恢复数据的值和数据类型
3.需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现下列两个接口之一:
①Serializable //是一个标机接口(没有方法)
②Externalizable //该接口有方法需要实现,所以一般使用Serializable接口
基本介绍
![](https://img-blog.csdnimg.cn/img_convert/61eeafb6ca8278d06bf9bd8b7cfb436c.png)
![](https://img-blog.csdnimg.cn/img_convert/dbd37fc9a7b17c7aaa80150e26e9fc6f.png)
1.功能:提供了对基本类型或者对象类型的序列化和反序列化的方法
2.ObjectInputStream提供是序列化功能, ObjectOutputStream提供反序列化功能
注意事项和细节说明
1.读写顺序要一直
2.要求序列化或反序列化对象,需要实现 Serializable
3.序列化的类建议添加SerialVersionUID,为了提高版本兼容性
4.序列化对象时,默认将里面所有属性都进行序列化,但除了static 或 transient 修饰的成员
5.序列化对象时,要求里面属性的类型也需要实现序列化接口
6.序列化具备可继承性,也就是如果某类已经实现了序列化,则它所有子类也已经默认实现了序列化
标准输入和标准输出
介绍:
System.in——是InputStream类型——默认设备:键盘
System.out——是PrintStream类型——默认设备:显示器
转换流-InputStreamReader 和 OutputStreamWriter
介绍:
1.InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成Reader(字符流)
![](https://img-blog.csdnimg.cn/img_convert/5209fb07e8e903e56bdff3a96b302d4d.png)
2.OutputStreamWriter:Writer的子类,可以将OutputStream(字节流)包装成Writer(字符流)
![](https://img-blog.csdnimg.cn/img_convert/a68d71b25c3017b518658ffd875d2994.png)
3.当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换为字符流
4.可以在使用时指定编码格式(比如 utf-8, gbk, gb2312, ISO8859 - 1 等)
打印流- PrintStream 和 PrintWriter
打印流没有输入流,只有输出流
![](https://img-blog.csdnimg.cn/img_convert/683ead41c384d7c09a232f7c181cc057.png)
![](https://img-blog.csdnimg.cn/img_convert/44b8522e3ba0fdc5ea18a1a53fecf823.png)
Properties类
基本介绍
1.专门用于读写配置文件的集合类
配置文件的格式:
键 = 值
键 = 值
2.注意:键值对不需要有空格,值不需要用引号括起来。默认类型String
3.Properties的常见方法
load:加载配置文件的键值对到Properties对象
list:将数据显示到指定设备
getProperty(key):根据键获取值
setProperty(key, value):设置键值对到Properties对象
store:将Properties中的键值对存储到配置文件,在idea中保存信息到配置文件,如果含有中文,则会存储中文对应的unicode码