(一) java.io.File类
1.1基础知识
- 此类是文件和目录的抽象表示形式。
- java把电脑中的文件和文件夹(目录)封装为了一个File类,我们可以使用File类对文件和文件夹进行操作。
- 我们可以使用File类的方法创建一个文件或文件夹,删除/获取/判断是否存在/对文件进行遍历/获取文件大小。
- File类是一个与系统无关的类,任何操作系统都可以使用类中 的方法。
- 重点记住三个单词:file:文件;directory:文件夹/目录;path:路径。
1.2File类中静态成员变量
package JavaIO;
import java.io.File;
public class Demo1File {
public static void main(String[] args) {
String pathSeparator= File.pathSeparator;
System.out.println(pathSeparator);//路径分隔符,windows是分号,Linux是冒号
String separator=File.separator;
System.out.println(separator);//文件名称分隔符,windows是反斜杠\,Linux是正斜杠/
}
}
- 操作路径一般不能写死了,因为不同的操作系统用到分隔符不同。
- C:\develop\a\a.txt windows版本。
- C:/develop/a/a.txt Linux版本。
- 应该这样写:C:“+File.separator+”develop“+File.separator+”a“+File.separator+”a.txt 。
1.3绝对路径与相对路径
。
- 绝对路径:是一个完整的路径,以盘符开始的路径
- 相对路径:是一个简化的路径,相对指的是当前项目的根目录。(C:\User\IdeaProject\Test),如果使用当前项目根目录。C:\User\IdeaProject\Test\123.txt,路径可以简化书写123.txt(可省略项目根目录)。
- 注意:路径不区分大小写,路径名中的分隔符Windows中是反斜杠,反斜杠表示转义字符,两个反斜杠表示一个普通的反斜杠。
1.4File类的构造方法(只列了常用的一种)
- **File file=new File(String pathname);**通过将给定文件名字符串转换成抽象路径名来创建一个新的File实例。
- 路径可以以文件结尾,也可以是文件夹。
- 路径可以是绝对路径也可以是相对路径。
- 路径可以真实存在,也可以不存在。
- 创建File对象只是将路径字符串封装给了File对象,并不关心路径真假情况。
public Demo1File() {
File file = new File("D:\\Test_Mario\\Test\\a.txt");
System.out.println(file);
}
(二)IO概述
2.1什么是IO流
- 我们将数据的传输看作一种数据的流动,按照流动的方向,以内存为基准,分为输入input和输出output,即流向内存是输入流,反之是输出流。
- Java中IO操作主要是指是应用Java.io包的内容,进行输入输出操作,输入也叫读取数据,输出叫写出数据。
- 硬盘存储:永久性的
- 内存存储:临时性的
- 1.将硬盘中数据读到内存中属于读取(输入)2.将内存中的数据写入硬盘中保存(写入)
输入流 | 输出流 |
---|---|
字节输入流:InputStream | 字节输出流OutputStream |
字符输入流:Reader | 字符输出流:Writer |
– | – |
2.2一切皆为字节
- 一切文件数据(文档,图片,视频等)在存储时,都是以二进制数字形式保存的,都是一个个字节,传输时一样如此,所以字节流可以传输任意文件数据。
2.3字节流 输出流OutputStream(最顶层的类)
- 由于OutputStream类是由abstract修饰的抽象类,所以无法直接new对象,只能继承其子类(多个)
2.4字节输入流 写数据到文件
- 利用子类FileoutputStrame类将数据从内存写入硬盘
- 写入数据原理:Java程序–>JVM(java虚拟机)–>OS(操纵系统)–>OS调用写数据方法–>把数据写入文件。
- 字节输出流的使用步骤:1.创建一个FileOutputStream对象,构造方法中传递数据写入数据目的地(文件)2.调用对象的writer方法将数据写入到文件3.释放资源(流使用会占用一定的字节,使用完要把内存清空)
package JavaIO;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class OutputStreameDemo {
public static void main(String[] args) throws IOException {
//1.创建对象并传入目的地
FileOutputStream fos =new FileOutputStream("D:\\Test_Mario\\Test\\a.txt");
//写入
fos.write(99);
//3.释放资源
fos.close();
}
}
(三)属性集Properties
3.1概述
- Properties类表示了一个持久的属性集,Properties可保存在流中或从流中加载。
- Properties集合是一个唯一和IO流相结合的集合。
- 可以使用Properties集合中的store方法将集合中临时数据持久化的写入硬盘中存储。
- 可以使用Properties集合中的Load方法,把硬盘中保存的文件(键值对)读取到集合中使用。
- 属性列表中每个键及其对应的值都是一个字符串:Properties集合是一个双列集合,key和value都是字符串。
3.2使用Properties集合存数据,并去除数据
package JavaIO;
import java.util.Properties;
import java.util.Set;
public class DemoProperties {
public static void main(String[] args) {
show01();
}
//使用Properties集合存储数据,遍历取出Properties集合中数据。
private static void show01() {
//创建对象
Properties properties = new Properties();
//使用setProperties方法往集合中加数据
properties.setProperty("赵丽颖1","168");
properties.setProperty("赵丽颖2","169");
properties.setProperty("赵丽颖3","170");
//使用stringPropertyNames()将Properties中键取出,存储到string集合中
Set<String> strings = properties.stringPropertyNames();
//遍历string集合,
for (String key:strings){
String value=properties.getProperty(key);
System.out.println(key+"="+value);
}
}
}
3.3Store()方法,两种参数
- 用Store()方法将Properties集合中临时数据持久化写到硬盘中存储。
- store(OutputStream out, String comments):字节输出流,不能写入中文。
- store(Writer writer, String comments):字符输出流,可以中文。
- comments用来解释说明保存的文件是做什么用的。不可用中文
- 使用步骤:1.创建Properties对象,添加数据2.创建字节输出流./字符输出流对象,构造方法中绑定要输出的目的地3.使用Proerties集合中的Store()将集合中临时数据持久化写到硬盘中存储。4.释放资源(关闭流)。
- 创建字符流:
package JavaIO;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;
public class DemoProperties {
public static void main(String[] args) throws IOException {
show01();
}
private static void show01() throws IOException {
//1创建对象,添加数据
Properties properties = new Properties();
properties.setProperty("赵丽颖1","168");
properties.setProperty("赵丽颖2","169");
properties.setProperty("赵丽颖3","170");
//2字符输出流对象,构造方法中绑定要输出的目的地
FileWriter fileWriter = new FileWriter("D:\\Test_Mario\\Test\\a.txt");
//3使用Proerties集合中的Store()将集合中临时数据持久化写到硬盘中存储
properties.store(fileWriter,"save data");
//关闭流
fileWriter.close();
}
}
- 创建字节流
3.4Load()
- 将硬盘中数据以键值对读到集合中使用
- load(InputStream inStream) 字节输入流,不能读含有中文的键值对
- load(Reader reader) 字符输入流,能读取中文键值对
- 使用步骤:1.创建Properties对象2.使用对象中load方法读取键值对文件3.遍历properties集合看有没有读入
- 注意:1.存储键值对的文件中,键与值连接符号可以使用=,空格(其他)2.存储键值对文件中可以使用#进行注释,被注释的键值对不会被读取
3.键值对文档中,键值默认是字符串,不用加引号
package JavaIO;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;
public class LoadProperties {
public static void main(String[] args) throws IOException {
show2();
}
public static void show2() throws IOException {
//1创建对象
Properties properties = new Properties();
//2.使用load()读取,方法参数需要传入一个流
properties.load(new FileReader("D:\\Test_Mario\\Test\\a.txt"));
//properties.load(new FileInputStream("D:\\Test_Mario\\Test\\a.txt"));
//3.遍历集合
Set<String> strings = properties.stringPropertyNames();
for (String key:strings){
String value= properties.getProperty(key);
System.out.println(key+"="+value);
}
}
}
(四)缓冲流BufferedInputStream
4.1概述
- 缓冲流:也叫高效流, 能够高校读取的缓冲流,相当于对基础的四种流对象FileXXXX(字节输入\输出流,字符输入\输出流)进行加强,所以也是四个流,都是在基础的流对象上创建而来
- 字节缓冲流: BufferedInputStream,BufferedOutputStream,
- 字符缓冲流: BufferedReader,BufferedWriter
- 缓冲流的基本原理:在创建流对象的时候,会创建一个内置默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写效率。
- 就像快递小哥送快递,送5个快递,基本的流要一个个送,从快递站取一个送一次,共重复5次。而缓冲流给基本字节输入流增加一个缓冲区(数组),将所有快递一次性读完放数组中,然后一起送。
- BufferedInputStream(new FileInputStream);
4.2字节缓冲流
- BufferedInputStream
- BufferedOutputStream 继承 OutputStream,字节缓冲输出流,继承父类的共性成员方法。
package JavaIO;
//使用方法:1.创建FileOutputStream对象,构造方法中你绑定要输出的目的地
// 2.创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象
//3.使用BufferedOutputStream对象的方法将数据写入到内部缓冲区
//4.使用BufferedOutputStream对象中flush方法,将缓冲区数据刷新到文件中
//5.释放资源(会先调用flush方法刷新数据,第四部可以省略)
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DemoBufferedOpS {
public static void main(String[] args) throws IOException {
// 1.创建FileOutputStream对象,构造方法中你绑定要输出的目的地
FileOutputStream fileOutputStream = new FileOutputStream("E:\\Idea-project\\Test1\\src\\JavaIO\\b.txt");
// 2.创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
bufferedOutputStream.write("将数据写入内部缓冲区".getBytes());
bufferedOutputStream.flush();
}
}
- 注:未写这句bufferedOutputStream.flush();的时候只是创建了文件,但是由于数据在缓冲区,b.txt中并无东西。
4.3 close和flush方法区别
- close():先刷新缓冲区,将缓冲区数据刷新到文件中然后通知系统释放资源,流对象不可在被使用
- flush():刷新缓冲区,将缓冲区数据刷新到文件中,流对象可以继续使用