147 lines
4.9 KiB
Markdown
147 lines
4.9 KiB
Markdown
# Java文件操作
|
||
|
||
* ## Path路径
|
||
* path路径可分为绝对路径和相对路径,绝对路径从根路径开始,而相对路径则不是
|
||
* Path类的api如下:
|
||
```java
|
||
/*
|
||
* 获取路径,其会将参数中的给定字符串连接起来,创建路径
|
||
* 如果不是文件系统中的合法路径,会抛出InvalidPathException
|
||
* Paths.get并不要求文件系统中一定存在对应的文件
|
||
*/
|
||
Paths.get(String first,String... more)
|
||
|
||
// 解析路径
|
||
// 如果path2是绝对路径,则会返回path2
|
||
// 否则,以path1为基本路径,返回path2想对于path1产生的路径
|
||
path1.resolve(path2)
|
||
path1.resolve(String)
|
||
|
||
// 将path1父路径作为基本路径解path2的析兄弟路径
|
||
path1.resolveSibling(path2)
|
||
path1.resolveSibling(String)
|
||
|
||
// 以path1为基本路径,返回path2想对于path1的相对路径
|
||
path1.relativize(path2)
|
||
|
||
// 移除.和..等多余元素
|
||
path1.toAbsolutePath()
|
||
|
||
// 获取文件名称
|
||
path1.getFileName()
|
||
|
||
// 获取根路径
|
||
path1.getRoot()
|
||
|
||
// 获取父路径,如果当前文件没有父路径,返回null
|
||
path1.getParent()
|
||
|
||
// 以当前路径创建元素
|
||
path1.toFile()
|
||
|
||
# 上述操作都不要求path所对应的文件在文件系统中已经存在
|
||
|
||
```
|
||
|
||
* ## 文件读写
|
||
* Files类相关文件操作的api
|
||
```java
|
||
// 读取路径所对应文件的所有字节
|
||
Files.readAllBytes(path)
|
||
|
||
// 按行读入文件的内容,并且将文件的行保存在字符串的集合中
|
||
Files.readAllLines(path,charset)
|
||
|
||
// 向文件中写入数据
|
||
// 可以通过StandardOpenOpition来指定数据是append还是覆盖
|
||
Files.write(path,bytes,charset,StandardOpenOpition.xxx)
|
||
Files.write(path,lines,charset,StandardOpenOption.xxx)
|
||
|
||
// 通过FIles类获取输入输出流
|
||
Files.newInputStream(path,options)
|
||
Files.newOutputStream(path,options)
|
||
FIles.newBufferedReader(path,charset)
|
||
Files.newBufferedWriter(path,charset,options)
|
||
|
||
|
||
```
|
||
|
||
* ## 创建文件和目录
|
||
```java
|
||
// 通过Files类创建目录
|
||
// 其中,createDirectory方法中path路径中的中间目录都应该已
|
||
// 存在,而且当想要创建的目录已经存在时会抛出异常
|
||
// 而createDirectories方法中中间路径可以不存在,在通过path创
|
||
// 建目录时会联通中间路径一起创建,但是,此方法在想要创
|
||
// 建的目录已经存在时不会抛出异常
|
||
Files.createDirectory(path)
|
||
Files.createDirectories(path)
|
||
# 注意,其中createDirecotry(path)操作是原子的
|
||
# 但是createDirectories()不是原子的,多进程条件下可能存在竞争
|
||
|
||
// 通过FIles类创建文件
|
||
// 当文件已经存在时,会抛出一场
|
||
// 该创建文件的操作是原子的
|
||
Files.createFile(path)
|
||
|
||
// 创建临时文件和临时文件夹
|
||
Files.createTempFile(basedir,prefix,suffix)
|
||
FIles.createTempFile(prefix,suffix)
|
||
Files.createTempDirecotry(basedir,prefix)
|
||
FIles.createTempDirectory(prefix)
|
||
|
||
# 可以为生成的临时文件调用deleteOnExit方法来让临时文件在进程退出时删除
|
||
# 在linux环境下,临时文件和目录生成在/tmp目录下
|
||
|
||
```
|
||
|
||
* ## 移动、复制、删除文件
|
||
```java
|
||
// 移动、复制文件
|
||
Files.copy(from,to)
|
||
FIles.move(from,to)
|
||
|
||
# 对于move和copy操作,如果目标路径已经存在,那么操作将失败并抛出异常
|
||
# 可以指定REPLACE_EXISTING来覆盖已经存在的路径
|
||
# 默认情况下,移动和复制都不是原子的,可以通过ATOMIC_MOVE来指定移动操
|
||
# 作是原子的,但是复制操作并不支持原子性操作
|
||
# 可以将输入流中的内容复制到path对应的文件中,也可以将path对应文件的
|
||
# 内容输出到流中
|
||
|
||
// 删除文件
|
||
// 若该文件不存在,会抛出异常
|
||
// 删除操作并不是原子的,由于要检查该文件是否是目录
|
||
// 如果文件是目录,只有当该目录为空时才能删除成功
|
||
Files.delete(path)
|
||
|
||
```
|
||
|
||
* ## 获取文件属性
|
||
```java
|
||
// 文件是否存在
|
||
Files.exists()
|
||
// 文件是否是隐藏文件爱你
|
||
Files.isHidden()
|
||
// 对文件是否有读写执行权限
|
||
Files.isReadable()
|
||
Files.isWritable()
|
||
FIles.isExecutable()
|
||
// 文件类型是否是目录、普通文件、符号链接
|
||
Files.isRegularFIle()
|
||
FIles.isDirectory()
|
||
FIles.isSymbolicLink()
|
||
// 获取文件长度
|
||
FIles.size()
|
||
|
||
```
|
||
|
||
* ## 访问目录中的项
|
||
```java
|
||
// 将目录中的项以Stream的形式返回
|
||
// Files.list并不会递归的列出子目录中的项
|
||
Files.list(dirPath)
|
||
|
||
// 递归列出子目录的项
|
||
// 可以通过指出depth来指定遍历的深度
|
||
FIles.walk(rootPath,depth)
|
||
``` |