目录
11.NIO.2 中 Path、Paths、Files类的使用
前言
之前的存储数据都是在内存中进行的。例如:使用集合存数据等。
当JVM关掉之后,这些数据就都没有了。我们需要将数据做持久化,就需要将内存中的数据存到硬盘上。(.txt文件)
由于栈在内存层面,把内存中的数据写入到持久化层面,叫做输出。
将持久化层面的数据读到内存中,就可以在程序中对这些数据进行操作了,叫做输入。
1.File类的使用
当从内存中将数据写到 .txt文件 里,或者从.txt文件把数据读到内存中,需要一个端点,这个端点是一个文件,在Java的内存中需要用一个对象来充当,这个对象就是File类型的。
File类型的对象可以表示 一个文件 或 文件目录(文件夹)。
- java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。
- File能新建、删除、重命名文件和目录,但File不能访问文件内容本身。
- 如果需要访问文件内容本身,则需要使用输入、输出流。
- 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
- File对象可以作为参数传递给流的构造器。
1.1 常用构造器
- public File(String pathname):
- 以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是绝对路径,则默认的当前路径在系统属性user.dir中存储。
- 绝对路径:是一个固定的路径,从盘符开始。
- 相对路径:是相对于某个位置开始。
- public File(String parent,String child):
- 以parent为父路径,child为子路径创建File对象。
- public File(File parent,String child):
- 根据一个父File对象和子文件路径创建File对象。
/**
* File类的使用:
*
* 1.File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)
*
* 2.File类声明在 java.io 包下。
*
*/
public class FileTest {
/**
* 1.如何创建File类的实例
* File(String filePath)
* File(String parentPath,String childPath)
* File(File parentFile,String childPath)
*
* 2.绝对路径:包含盘符在内的文件或文件目录的路径。
* 相对路径:相较于某个路径下,指明的路径。
*
* 3.路径分隔符
* Windows:\\
* unix:/
*/
@Test
public void test1(){
//1.构造器一
File file1 = new File("hello.txt"); //相对于module
File file2 = new File("D:\\IDEAProjects\\Collection_Map\\Generic\\he.txt");
System.out.println(file1);
System.out.println(file2);
//2.构造器二
File file3 = new File("D:\\IDEAProjects","Collection_Map\\Generic");
System.out.println(file3);
//3.构造器三
File file4 = new File(file3,"hi.txt");
System.out.println(file4);
//此时以上三个文件都只是在内存层面的几个对象而已。
//当我们调用toString 方法的时候,只是将文件路径进行输出。
}
}
1.2 路径分隔符
- 路径中的每级目录之间用一个路径分隔符隔开。
- 路径分隔符和系统有关:
- Windows和DOS系统默认使用“\”来表示。
- UNIX和URL使用“/”来表示
- Java程序迟滞跨平台运行,因此路径分隔符要慎用。
- 为了解决这个隐患,File类提供了一个常量。
- public static final String separator。根据操作系统,动态的提供分隔符。
- 举例:
- File file1 = new File("d:\\demo\\info.txt");
- File file2 = new File("d:"+File.separator + "demo" + File.separator + "info.txt");
- 这个方法更通用,在什么操作系统下都可以识别。
- File file3 = new File("d:/demo");
1.3 File类的常用方法
以下方法都是文件本身具有的方法,是在硬盘层面的,也就是将内存中的数据写入到硬盘之后的文件所具有的功能。
- File类的获取功能
- public String getAbsolutePath():获取绝对路径
- public String getPath():获取路径
- public String getName():获取名称
- public String getParent():获取上层文件目录路径。若无,返回null,
- 相对路径创建的文件无法获取。
- public long length():获取文件长度(即:字节数)。不能获取目录的长度。(dest)
- public long lastModified():获取最后一次的修改时间,毫秒值。(dest)
只能遍历出硬盘中真实存在的。(dest)
- public String[] list():获取指定目录下的所有文件或者文件目录的名称数组。
- public File[] listFiles():获取指定目录下的所有文件或者文件目录的File数组。
- File类的重命名功能
- public boolean renameTo(File dest):把文件重命名为指定的文件路径。
- File类的判断功能(dest)
- public boolean isDirectory():判断是否是文件目录
- public boolean isFile():判断是否是文件
- public boolean exists():判断当前对象是否在硬盘中存在
- public boolean canRead():判断是否可读
- public boolean canWrite():判断是否可写
- public boolean isHidden():判断是否隐藏
/**
* public String getAbsolutePath():获取绝对路径
* public String getPath():获取路径
* public String getName():获取名称
* public String getParent():获取上层文件目录路径。若无,返回null
* public long length():获取文件长度(即:字节数)。不能获取目录的长度。
* public long lastModified():获取最后一次的修改时间,毫秒值。
* 如下两个方法适用于文件目录
* public String[] list():获取指定目录下的所有文件或者文件目录的名称数组。
* public File[] listFiles():获取指定目录下的所有文件或者文件目录的File数组。
*
* 都是内存层面的调用,涉及不到要求必须硬盘上存在这个文件。
*/
@Test
public void test2(){
File file1 = new File("hello.txt");
File file2 = new File("d:\\IO\\h1.txt");
System.out.println(file1.getAbsolutePath()); //D:\IDEAProjects\Collection_Map\Generic\hello.txt
System.out.println(file1.getPath()); //hello.txt
System.out.println(file1.getName()); //hello.txt
System.out.println(file1.getParent()); //null
System.out.println(file1.length()); //10
System.out.println(new Date(file1.lastModified())); //0
System.out.println();
System.out.println(file2.getAbsolutePath()); //d:\IO\h1.txt
System.out.println(file2.getPath()); //d:\IO\h1.txt
System.out.println(file2.getName()); //h1.txt
System.out.println(file2.getParent()); //d:\IO
System.out.println(file2.length()); //0
System.out.println(new Date(file2.lastModified()));//0
}
@Test
public void test3(){
File file = new File("D:\\IDEAProjects\\Collection_Map\\Generic");
String[] list = file.list(); //文件名
for (String s : list) {
System.out.println(s);
}
File[] files = file.listFiles(); //绝对路径包含文件名
for (File file1 : files) {
System.out.println(file1);
}
}
/**
* public boolean renameTo(File dest):
* 把文件重命名为指定的文件路径。
* 要想保证返回true,需要file1在硬盘中是存在的,且file2不能在硬盘中存在。
*/
@Test
public void test4(){
File file1 = new File("hello.txt");
File file2 = new File("D:\\IO\\hi.txt");
boolean renameTo = file1.renameTo(file2); //意为将file1的名字改为file2
//如果想撤销改名操作,调换文职即可:file2.renameTo(file1)
System.out.println("renameTo = " + renameTo);
}
/**
* public boolean isDirectory():判断是否是文件目录
* public boolean isFile():判断是否是文件
* public boolean exists():判断是否存在
* public boolean canRead():判断是否可读
* public boolean canWrite():判断是否可写
* public boolean isHidden():判断是否隐藏
*
*/
@Test
public void test5(){
//硬盘中存在hello.txt,如果不存在,则所有输出都是默认值false
File file1 = new File("hello.txt");
System.out.println(file1.isDirectory()); //false
System.out.println(file1.isFile()); //true
System.out.println(file1.exists()); //true
System.out.println(file1.canRead()); //true
System.out.println(file1.canWrite()); //true
System.out.println(file1.isHidden()); //false
}
1.4 File类的创建和删除功能
与硬盘相关的操作,硬盘层面的。
- File类的创建功能
- public boolean createNewFile():创建文件。若文件存在,则不创建,返回false.
- public boolean mkdir():创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
- public boolean mkdirs():创建文件目录。如果上层文件目录不存在,一并创建。
- 注意:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
- File
- public boolean delete():删除文件或者文件夹
- 删除注意事项:
- Java中的删除不走回收站。
- 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。
@Test
public void test7(){
//文件目录的创建,已知目录D:\IO
File file1 = new File("D:\\IO\\IO1");
boolean mkdir = file1.mkdir();
if(mkdir){
System.out.println("创建成功1"); //创建成功1
}
File file2 = new File("D:\\IO\\IO2\\IO3");
boolean mkdirs = file2.mkdirs();
if(mkdirs){
System.out.println("创建成功2");//创建成功2
}
}
初始化目录D:\IO后:
file1创建失败。file2创建成功。
//文件目录的创建,已知目录D:\IO
File file1 = new File("D:\\IO\\IO1\\IO4");
boolean mkdir = file1.mkdir();
if(mkdir){
System.out.println("创建成功1");
}
File file2 = new File("D:\\IO\\IO2\\IO3");
boolean mkdirs = file2.mkdirs();
if(mkdirs){
System.out.println("创建成功2");//创建成功2
}
注意:在硬盘中存在的文件,所有属性都是有值的;而内存层面的file ,其length,isFile,isread等都是默认值。
/** * File类的使用: * * 1.File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹) * 2.File类声明在 java.io 包下。 * 3.File类中涉及到的关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法, * 并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。 * 4.后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的“终点” .用File来表示。 * 当读取或写入内容,这个File的对象代表文件,而不是文件目录。 * */
//要想删除成功,要删除的目录下不能有子目录或文件。
// File file3 = new File("D:\\IO\\IO1");
boolean delete = file1.delete();
System.out.println(delete);
说明:
IDEA中:
如果开发中使用JUINT中的单元测试方法测试,相对路径即为当前Module下。
如果是使用main()测试,相对路径即为当前的Project下。
Eclipse中:
不管使用单元测试方法还是使用main()测试,相对路径都是在Project下。
2.IO流原理及流的分类
Google I/O 寓意为“开放中创新” (Innovation in the Open)
Input/Output 二进制1,0
2.1 Java IO原理
- I/O是Input/Output的缩写,I/O技术是非常使用的技术,用于处理设备之间的数据传输。如:读写文件,网络通讯等。
- Java程序中,对于数据的输入、输出操作以“流(stream)”的方式进行。
- java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
2.2 流的分类
2.2.1按照数据流的流向不同进行分类
输入输出是相对而言的,我们平常都是以程序为参照的,也就是内存。
输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中。
2.2.2按操作数据单位不同进行分类
分为字节流(8 bit)、字符流(16 bit) char
字节流:存放图片,视频等;
字符流:存放文本。
2.2.3按照流的角色不同分为
分为节点流、处理流。
4个抽象基类: