1. 简介
之前的程序,数据都存储在内存中,一旦运行结束,数据消失。
数据持久化存储:将内存中的数据存储到内存以外的持久化设备中(硬盘,光盘、U盘等)。
OS中,数据都保存文件存放在相应的文件夹。
集合只能在内存中临时存储数据,要长期存储需要用到IO流。
1.1 IO
输出(写)output:需把内存中的数据存储到持久化设备中
输入(读)input:把持久化设备上的数据读到内存中
1.2 Java IO流
流可被看做一组有序的字节集合,本质是数据传输,根据处理数据类型的不同,流可分为:
- 字节流:以字节(8 bit)为单位,包含两个抽象类:
- InputStream(输入流)
- OutputStream(输出流)
- 字符流:以字符(16 bit)为单位,根据码表映射字符,一次可以读多个字节,包含两个抽象类:
- Reader(输入流)
- Writer(输出流)
字节流在处理输入输出时不会用到缓存,而字符流用到了缓存。
流向 | ||||
输入流 | 读数据 | FileReader | Reader | |
输出流 | 写数据 | FileWriter | Writer | |
数据类型 | ||||
字节流 | ||||
字节输入流 | 读数据 | InputStream | ||
字节输出流 | 写数据 | OutputStream | ||
字符流 | ||||
字符输入流 | 读数据 | Reader | ||
字符输出流 | 写数据 | Writer |
JavaIO设计时采用了Decorator(装饰者)设计模式。
其中ByteArrayInputStream、StringBufferInputStream、FileInputStream和PipedInputStream是Java提供的最基本的对流进行处理的类。
FilterInputStream为一个封装类的基类,可以对基本的IO类进行封装。
使用这种设计模式好处:可以在运行时动态地给对象添加一些额外的职责,与使用继承的设计方法相比该方法具有很好的灵活性。
2. File类
io包中
File类的实例不可改变
它是File文件和目录路径名的抽象表示。Java中,把文件或目录(文件夹)都封装成了File对象。
2.1 创建File对象
用构造函数
File(String pathname):将指定的路径名转换为一个File对象
File(String parent,String child):根据指定的父路径和文件名(文件路径)创建File对象
File(File parent,String child):根据父路径对象和文件路径创建对象
String pathName="e:\\java_code\\hello.java";
File f1=new File(pathName);
//创建了一个File对象f1指向了一个路径;
//若hello.java存在,不会创建它只是指向路径
File f2=new File("e:\\java_code\\hello.java");
File dir=new File("e:\\java_code");
File f3=new File(dir,"hello.java");
2.2 常用方法
1、获取文件的绝对路径,即全路径:getAbsolutePath()
String abspath=f1.getAbsolutePath();
- 绝对路径:以盘符开头,固定,不可改变的路径
- 相对路径:不能以盘符开头,相对某个参照物的。在eclipse中相对于当前项目的根目录,与src平级。
2、获取File封装的路径:getPath()
String path=f1.getPath();
3、获取文件名称和文件夹名称:getName()
String fileName=f1.getName();
4、获取文件大小(字节数):length()——bytes
long size=fi.length();
2.3 File类操作
File file=new File("e:\\file.txt");
1、创建文件:createNewFile()
- 若文件不存在,创建,返回true
- 若文件存在,不创建,返回false
- 路径错误,IOException
boolean b1=file.createNewFile();
2、删除文件夹(不去回收站):delete()
boolean b2=file.delete();
3、判断文件是否存在:exists()
boolean b3=file.exists();
4、对目录的操作
①创建单个目录:mkdir()
File dir=new File("e:\\abd");
boolean b4=dir.mkdir();
和createFile()类似。
②创建多个目录:mkdirs()
File dir=new File("a\\b\\c");
boolean b5=dir.mkdirs();
"a\\b\\c"父路径不存在时也会创建
③删除:delete()
boolean b5=dir.delete();
只有将目录中的内容都删除,保证目录为空,才能删除此目录。
5、判断时文件还是目录
file.exists();
file.isFile();
file.isDictionary();
以上三个方法都返回的是boolean值。
6、获取目录下的当前文件以及文件夹的名字:list()
File dir=new File("e:\\java");
String[] names=dir.list();
for(String name:names){
System.out.println(name);
}
7、获取目录下当前文件以及文件对象:listFiles()
File[] files=dir.listFiles();
for(File file:files){
System.out.println(file);
}
注:6、7中,获取时需确定目录存在,而且指定的必须是目录。
否则易返回null,出现NullPointerException