JAVA核心技术I---JAVA基础知识(文件系统及java文件基本操作)

时间:2022-06-01 21:32:44

一:文件概述

文件系统是由OS(操作系统)管理的
文件系统和Java进程是平行的,是两套系统
文件系统是由文件夹和文件递归组合而成
文件目录分隔符
–Linux/Unix 用/隔开
–Windows用\隔开,涉及到转义,在程序中需用/或\\代替
文件包括文件里面的内容和文件基本属性
文件基本属性:名称、大小、扩展名、修改时间等

二:文件类File

java.io.File是文件和目录的重要类(JDK6及以前是唯一)
–目录也使用File类进行表示
File类与OS无关,但会受到OS的权限限制
常用方法
–createNewFile,delete,exists, getAbsolutePath, getName,
getParent,getPath, isDirectory, isFile, length, listFiles, mkdir, mkdirs
注意:File不涉及到具体的文件内容只涉及属性

(一)常用方法实现

    public static void main(String[] args) {
File d = new File("D:\\MyJava\\Code\\JH15\\bin");
if (!d.exists()) { //用于判断是否存在目录/文件
System.out.println("dir not exists");
}else {
System.out.println("dir exists");
} File f = new File("D:\\MyJava\\Code\\JH15\\bin\\test.c");
if(!f.exists()) {
System.out.println("file not exist");
try {
f.createNewFile(); //创建文件必须捕获异常
}catch(IOException e) {
System.out.println("file create fail"+e.getMessage());
}
} File dd = new File("D:\\MyJava\\Code\\JH15\\bin\\aa\\bb\\cc");
if(!dd.exists()) {
System.out.println("create dirs");
dd.mkdirs(); //mkdir创建一级目录 mkdirs创建多级目录
} File fs[] = d.listFiles(); //listFiles返回目录下的所有文件(对象)
for(File fitem : fs) {
//getPath获取文件的绝对路径,getName获取文件名,length获取文件大小,lastModified获取文件最后一次修改时间(时间戳)
System.out.println(fitem.getPath()+" "+fitem.getName()+" "+fitem.length()+" "+fitem.lastModified());
}
}

三:新的文件系统类(补充File类)

–是java.io.File的有益补充
• 文件复制和移动
• 文件相对路径
• 递归遍历目录
• 递归删除目录
• .......

(一)Path, Files

1.Path接口类:Path 和 java.io.File 基本类似

Path表示路径,可以是文件的路径,也可以是目录的路径
可用于在文件系统中定位文件的对象。 它通常表示系统相关的文件路径。 
Path是接口,无法实例化对象,借助辅助类Paths来实现
Files中所有成员都是静态方法,通过路径实现了对文件的基本操作。
FIles类和Path接口。他们两封装了用户对文件的所有可能的操作,相比于File类来说,使用起来方便很多。

接口方法:

int compareTo(Path other)              比较两个抽象的路径词典。
boolean endsWith(Path other) 测试此路径是否以给定的路径结束。
boolean endsWith(String other) 测试此路径是否以 Path结束,通过转换给定的路径字符串,完全按照 endsWith(Path)方法指定的方式构建。
boolean equals(Object other) 测试此路径与给定对象的相等性。
Path getFileName()             将此路径表示的文件或目录的名称返回为 Path对象。
FileSystem getFileSystem()        返回创建此对象的文件系统。
Path getName(int index)          返回此路径的名称元素作为 Path对象。
int getNameCount()             返回路径中的名称元素的数量。
Path getParent()              返回 父路径 ,或 null如果此路径没有父。
Path getRoot()                返回此路径的根组分作为 Path对象,或 null如果该路径不具有根组件。
int hashCode()               计算此路径的哈希码。
boolean isAbsolute()           告诉这条路是否是绝对的。
Iterator<Path> iterator()        返回此路径的名称元素的迭代器。
Path normalize()              返回一个路径,该路径是冗余名称元素的消除。
Path relativize(Path other)       构造此路径和给定路径之间的相对路径。
Path resolve(Path other)         根据这条路径解决给定的路径。
Path resolve(String other)        一个给定的路径字符串转换为 Path并解析它针对此 Path在完全按规定的方式 resolve方法。
Path resolveSibling(Path other)     根据此路径的 parent路径解决给定的路径。
Path resolveSibling(String other)   将给定的路径字符串转换为 Path ,并按照 resolveSibling方法指定的方式将其解析为该路径的 parent路径。
boolean startsWith(Path other)     测试此路径是否以给定的路径开始。
boolean startsWith(String other)    测试此路径是否以 Path ,通过转换给定的路径字符串,按照 startsWith(Path)方法指定的方式构建。
Path subpath(int beginIndex, int endIndex) 返回一个相对的 Path ,它是该路径的名称元素的子序列。
Path toAbsolutePath()          返回表示此路径的绝对路径的 Path对象。
File toFile()               返回表示此路径的File对象。
Path toRealPath(LinkOption... options) 返回现有文件的 真实路径。
String toString()             返回此路径的字符串表示形式。
....

2.补充Paths类

和Path接口相关的还有一个类Paths,这个类非常简单,只有两个方法加一个私有构造方法。

JAVA核心技术I---JAVA基础知识(文件系统及java文件基本操作)

public static Path get(String first, String... more)
将路径字符串或从路径字符串连接起来的一系列字符串转换为Path 。 
如果more没有指定任何元素,那么first参数的值是要转换的路径字符串。
如果more指定一个或多个元素,则每个非空字符串(包括first )被认为是名称元素的序列(参见Path ),并且被连接以形成路径字符串。
关于字符串如何连接的细节是提供者特定的,但通常它们将使用name-separator作为分隔符进行连接。
例如,如果名称分隔符为“ / ”并调用getPath("/foo","bar","gus") ,则路径字符串"/foo/bar/gus"将转换为Path 。
一个Path表示空路径如果返回first是空字符串, more不包含任何非空字符串。
参数
  first - 路径字符串或路径字符串的初始部分
  more - 要连接的附加字符串以形成路径字符串
结果
  结果 Path

3.Files

该类只包含对文件,目录或其他类型文件进行操作的静态方法。 
整个FIles类中,都是静态方法,没有一个实例域。
这个类就是为了实现对文件的各种操作

java 文件操作(二)---Files和Path

(二) DirectoryStream, FileVisitor,FileSystem

DirectoryStream

一个对象来迭代目录中的条目。 目录流允许方便地使用for-each结构来遍历目录。 
Path dir = ...
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
for (Path entry: stream) {
...
}
}

FileVisitor

文件访问者 该接口的实现被提供给Files.walkFileTree方法来访问文件树中的每个文件。 

FileSystem

文件系统的工厂方法。 该类定义了getDefault方法来获取默认文件系统和工厂方法来构建其他类型的文件系统。 

(三)方法实现

1.Path

        // 获得path方法一,c:/temp/abc.txt
Path ph = FileSystems.getDefault().getPath("D:\\MyJava\\Code\\JH16\\bin", "CD.class");
System.out.println(ph.getFileName()); // 获得path方法二,用File的toPath()方法获得Path对象
File fl = new File("D:\\MyJava\\Code\\JH16\\bin\\CD.class");
Path phOth = fl.toPath();
System.out.println(phOth.getFileName());
// 0,说明这两个path是相等的
System.out.println(ph.compareTo(phOth)); // 获得path方法三
Path phOth2 = Paths.get("D:\\MyJava\\Code\\JH16\\bin", "CD.class");
System.out.println(phOth2.getFileName()); //合并两个path
Path phOth3 = Paths.get("D:\\MyJava\\Code\\JH16\\bin");
System.out.println("Path4:"+phOth3.resolve("CD.class")); if(Files.isReadable(ph)) {
System.err.println("file is readable");
}else {
System.err.println("file is not readable");
}
CD.class
CD.class
0
CD.class
Path4:D:\MyJava\Code\JH16\bin\CD.class
file is readable

2.Files类

public class FilesTest {

    public static void main(String[] args) {
// TODO Auto-generated method stub
moveFile();
fileAttributes();
createDirectory();
} private static void createDirectory() {
// TODO Auto-generated method stub
Path ph = Paths.get("D:\\MyJava\\Code\\JH16\\test\\aa\\bb");
try {
//创建文件夹
if(Files.notExists(ph)) {
Files.createDirectories(ph); //递归创建
System.out.println("create dir");
}else {
System.out.println("dir exists");
} //设置文件路径
Path f1 = ph.resolve("A.java");
Path f2 = ph.resolve("B.jpg");
Path f3 = ph.resolve("C.txt");
Path f4 = ph.resolve("D.c"); Files.createFile(f1);
Files.createFile(f2);
Files.createFile(f3);
Files.createFile(f4); //不加条件遍历,变量目录路径下的所有文件
DirectoryStream<Path> paths = Files.newDirectoryStream(ph);
for(Path p: paths) {
System.out.println(p.getFileName());
} System.out.println("========"); //加上条件过滤,过滤文件一java txt结尾文件
DirectoryStream<Path> pathFielter = Files.newDirectoryStream(ph,"*.{java,txt}");
for(Path p: pathFielter) {
System.out.println(p.getFileName());
} }catch(IOException e) {
e.printStackTrace();
}
} private static void fileAttributes() {
// TODO Auto-generated method stub
Path path = Paths.get("D:\\MyJava"); //获取路径 System.out.println(path.isAbsolute()); //判断是否为绝对路径
System.out.println(Files.isDirectory(path)); try {
//获取文件属性
//不需要遵循符号链接NOFOLLOW_LINKS
BasicFileAttributes attrs = Files.readAttributes(path,BasicFileAttributes.class,LinkOption.NOFOLLOW_LINKS);
//读取文件的属性作为批量操作。
System.out.println(attrs.isDirectory());
System.out.println(attrs.lastModifiedTime());
System.out.println(attrs.lastModifiedTime().toMillis());
System.out.println(new Date(attrs.lastModifiedTime().toMillis())); //时间戳转时间
System.out.println(new Date(attrs.lastModifiedTime().toMillis()).toLocaleString());
}catch(IOException e) {
e.printStackTrace();
}
} private static void moveFile() {
// TODO Auto-generated method stub
Path form = Paths.get("D:\\MyJava","test.txt");
Path to = form.getParent().resolve("Code\\JH17\\tt.txt"); //注意这个路径后面是加上新的文件名 try {
//path获取文件名 Files。size获取文件大小
System.out.println(form.getFileName()+": "+Files.size(form));
//Files.move移动文件 Files.copy拷贝文件
Files.copy(form, to,StandardCopyOption.REPLACE_EXISTING);
}catch(IOException e) {
System.err.println(e.getMessage());
}
} }
test.txt:
true
true
true
--09T02::.085042Z --
2019年1月9日 上午10::
dir exists
D:\MyJava\Code\JH16\test\aa\bb\A.java
A.java
B.jpg
C.txt
D.c
========
A.java
C.txt