Java操作文件
import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class Test {
public static void main(String[] args){
WalkFileTreeTest.test();
}
}
/*
2.5 操作文件
2.5.1 Path
Paths.get()方法:
//一个一个部件的写
Path absolute = Paths.get("/home","harry"); :绝对路径/home/harry
Path relative = Paths.get("myprog","conf","user.prop"); :相对路径./mypoog/conf/user.prop
//传入一个包含多个部件的字符串
Path basePath = Paths.get("/opt/myprog/");
path.resolve()方法:
//接受一个Path对象
Path basePath = Paths.get("base");
Path workPath1 = basePath.resolve(new Path(work));
//接受一个字符串
Path workPath2 = basePath.resolve("work2");
path.resolveSibling()方法:
//从path路径的父路径产生temp路径(兄弟路径)
path.resolveSibling("temp");
path.relativize()方法:
//相对的处理(有道翻译)
p.relativize(r),我觉得可以简单的理解为,获得r相对于p的路径。
path.normalize()方法:
//移除所有冗余的.和..部件
/home/cay/../fred/./myprog => /home/fred/myporg
path.toAbsolutePath()方法:
//返回path的绝对路径。
Path将路径断开的各种方法:
Path p = Paths.get("/home","fred","myprog.prop");
Path parent = p.getParent(); //得到/home/fred
Path file = p.getFileName(); //得到最后文件的名称
Path root = p.getRoot(); //得到根路劲
如果需要和遗留系统的API交互,可以使用的是File类。Path接口有一个toFile方法,
而File类有一个toPath方法。
*/
/*
2.5.2 读写文件
byte[] bytes = Files.readAllBytes(path); //读取一个文件的全部内容
String content = new String(bytes,charset); //将文件当做字符串读入
List<String> lines = Files.readAllLines(path,charset) //希望将文件当做行序列读入
Files.write(path,content.getBytes(charset)); //希望写出一个字符串到文件中
Files.write(path,content.getBytes(charset)
,StandOpenOption.Append); //希望在指定的文件后追加内容
Files,write(path,lines) //将一个行的集合,写进文件里
得到相关的流:
InputStream in = Files.newInputStream(path);
OutputStream out = Files.newOutputStream(path);
Reader in = Files.newBufferedReader(path,charset);
Writer out = Files.newBufferedWriter(path,charset);
*/
/*
2.5.3 创建文件和目录
//创建一个空文件
Files.createFile(path)
//除路径最后一个部件外,其他部件都必须存在
Files.createDirectory(path);
//创建路径中的中间目录
Files.createDirectories(path);
用于在给定位置或系统指定位置创建零食文件或目录的方法:
Path newPath = Files.createTimeFile(dir,prefix,suffix);
Path newPath = Files.createTimeFile(prefix,suffix);
Path newPath = Files.createTimeFile(dir,prefix);
Path newPath = Files.createTimeFile(prefix);
*/
/*
2.5.4 复制、移动和删除文件
Files.copy(fromPath,toPath);
Files.copy(fromPath,toPath,
StandCopyOption.REPLACE_EXISTING, //替换已经存在的文件
StandCopyOption.COPY_ATTRIBUTES); //复制所有的文件属性
Files.move(fromPath,toPath);
Files.move(fromPath,toPath,
StandCopyOption.ATOMIC_MOVE); //将移动操作定义为原子性
Files.copy(inputStream,toPath); //将输入流复制到Path中
Files.copy(from,outputStream); //将path复制到输出流
Files.delete(path); //文件删除,会抛出异常
boolean deleted = Files.deleteIfExists(path); //不会抛出异常
*/
/*
StandardOpenOption
------------------------------------------------------------------------------------
| READ 用于文件读取而打开 |
| WRITE 用于文件写入而打开 |
| APPEND 如果用于文件写入而打开,在在文件末尾追加 |
| TRUNCATE_EXISTING 如果用于文件写入而打开,那么移除已有内容 |
| CREATE_NEW 创建新文件,文件存在的情况下会创建失败 |
| CREATE 自动在文件不存在的情况下创建新文件 |
| DELETE_ON_CLOSE 当文件被关闭时,尽可能的删除这个文件 |
| SPARSE 给文件系统一个提示,该文件时稀疏的 |
| DSYN|SYN 要求对文件数据|数据和元数据的每次更新都必须同步写入到存储设备中 |
------------------------------------------------------------------------------------
备注:StandardOpenOption 与 newBufferedWriter newInputStream newOutputStream
write一起使用
StandardCopyOption
------------------------------------------------------------------------------------
| ATOMIC_MOVE 原子性的移动文件 |
| COPY_ATTRIBUTES 复制文件的属性 |
| REPLACE_EXISTIONG 如果目标已存在,则替换它 |
------------------------------------------------------------------------------------
备注:StandardCopyOption 与 copy、move一起使用
LinkOption
------------------------------------------------------------------------------------
| NOFOLLOW_LINKS 不要跟踪符号连接 | |
------------------------------------------------------------------------------------
备注:LinkOption 与 exists isDeicretory isRegularFile一起使用
FileVisitOption
------------------------------------------------------------------------------------
| FLLOW_LINKS 跟踪符号连接 | |
------------------------------------------------------------------------------------
备注:FileVisitOption 与 fink walk walkFileTree一起使用
*/
/*
2.5.5 获取文件信息
检查某个属性的结果:
exists
isHidden
isReadable,isWritable,isExecutable
isRegularFile,isDirectory,isSymbolicLink
size方法将返回文件的字节数:
long fileSize = Files.size(path);
getOwner:
将文件的拥有者作为java.nio.file.attribute.UserPrincipal的一个
实例返回。
所有的文件系统都会报告一个基本属性集,它们被封装在BasicFileAttribute接口中
这部分信息与上述信息有部分重叠。基本文件属性包括:
1.创建文件、最后一次访问以及最后一次修改文件的时间,这些时间都被
表示为java.nio.file.attribute.FileTime
2.文件是常规文件、目录还是符号连接,或者都不是
3.文件尺寸
4.文件主键,这是某种类的对象,具体所属类与文件系统相关,有可能是
文件的唯一标识符,也可能不是。
=>
PosixFileAttribute attributes = Files.readAttributes(
path, BasicFileAttribute.class);
*/
/*
2.5.6 访问目录中的项
try(DirectoryStream<Path> entries = Files.newDirectoryStream(dir)){
for(Path entry : entries){
//Process entries
}
}
可以使用glob模式来过滤文件:
try(DirectoryStream<Path> entries = Files.newDirectoryStream(dir,"*.java"))
============================================================================================
= * = 匹配路径组成部分的0个或多个字符 = *.java匹配当前目录中的所有Java文件 =
= ** = 匹配跨目录边界的0个或多个字符 = **.java匹配在所有目录中的Java文件 =
= ? = 匹配一个字符 = ???.java 匹配所有三个字符的Java文件 =
= [] = 匹配一个字符集合 = Test[0-9A-F]匹配Testx.java,其中x是一个16进制数 =
= {} = 匹配由逗号分割开的多个选项之一 = *.{java,class}匹配所有的Java文件和class文件 =
= \ = 转义字符 = *\**匹配所有文件名中包含*的文件 =
============================================================================================
如果向要访问某个目录的所有子孙成员,可以转而调用walkFileTree方法,并向其传递一个FileVistor类型
的对象。这个对象会得到下列通知:
1.遇到一个文件或目录时:
FileVisitResult visitFile(T path, BasicFileAttribute)
2.在一个目录被处理前:
FileVisitResult preVisitDirectory(T dir, IOException ex)
3.在一个目录被处理后:
FileVisitResult postVisitDirectory(T dir, IOException ex)
4.在试图访问文件或目录时发生错误,例如没有权限打开目录:
FileVisitResult visitFileFailed(path, IOException ex)
对于上述的每种情况,都可以指定是否希望执行下面的操作:
1.继续访问下一个文件:
FileVisitResult.CONTINUE
2.继续访问,但是不再访问这个目录下的任何项了:
FileVisitResult.SKIP_SUBTREE
3.继续访问,但是不再访问这个文件的兄弟文件(和该文件同一目录下的文件)了:
FileVisitResult.SKIP_SIBLINGS
4.终止访问:
FileVisitResult.TERMINATE
*/
class WalkFileTreeTest{
public static void test(){
try{
Files.walkFileTree(Paths.get("."),new SimpleFileVisitor<Path>(){
public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs)
throws IOException{
System.out.println(path);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
return FileVisitResult.SKIP_SUBTREE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
//用于删除目录树
public static void test2(){
try{
Files.walkFileTree(Paths.get("."),new SimpleFileVisitor<Path>(){
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
if(exc!=null)
throw exc;
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
2.5.8 ZIP文件系统
Paths类会在默认的文件系统中查找路径,也可以让其在别的文件系统中查找。
FileSystem fs = FileSystems.newFileSystem(Paths.get(zipname),null);
Files.copy(fs.getPath(sourceName),targetPath);
FileSystem fs = FileSystems.newFileSystem(Paths.get(zipname),null)
Files.walkFileTree(fs.getPath("/",new SimpleFileVsitor<Path>(){
public FileVisitResult visitFile(Path file, BasicFileAttribute attrs)
throws IOException {
System.out.println(file);
return FileVisitResult.CONTINUE;
}});
*/
《Java核心技术卷二》笔记
Java操作文件的更多相关文章
- Java操作文件夹的工具类
Java操作文件夹的工具类 import java.io.File; public class DeleteDirectory { /** * 删除单个文件 * @param fileName 要删除 ...
- java操作文件的创建、删除、遍历
java操作文件的创建.删除.遍历: package test; import java.io.File; import java.io.IOException; import java.util.A ...
- java——操作文件
Java文件操作,共实现了文件复制(单个文件和多层目录文件),文件移动(单个文件和多层目录文件),文件删除(单个文件和多层目录文件),文件压缩 (单个文件),文件解压(单个文件),文件分割(将一个大文 ...
- Java操作文件Util
package io.guangsoft.utils; import java.io.File; import java.io.FileInputStream; import java.io.File ...
- java操作文件常用的 IO流对象
1.描述:流是字节数据或字符数据序列.Java采用输入流对象和输出流对象来支持程序对数据的输入和输出.输入流对象提供了数据从源点流向程序的管道,程序可以从输入流对象读取数据:输出流对象提供了数据从程序 ...
- Java操作文件那点事
刚开始学Java时候,一直搞不懂Java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己结合API来整理一下,有错的话请指正,也希 ...
- Java操作文件转码
package downloadTest; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.F ...
- java操作文件流对象
所有流对象 InputStream 字节流 FileInputStream 字节流 专门读写非文本文件的 BufferedInputStream 高效流 OutPutS ...
- Java删除文件夹和文件
转载自:http://blog.163.com/wu_huiqiang@126/blog/static/3718162320091022103144516/ 以前在javaeye看到过关于Java操作 ...
随机推荐
- MessageBox用法大全
//1.显示提示信息 MessageBox.Show("Hello World!"); //2.给消息框加上标题 MessageBox.Show("Hello World ...
- ORACLE RAC+OGG配置
实验环境主机名 IP地址rac01 192.168.56.10rac02 192.168.56.20rac-scan 192.168.56.30 目标库:ora-ogg 192. ...
- Android零基础入门第77节:Activity任务栈和启动模式
通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的方式来管理Activity的实例.当启动一个应用时,Android就会为之 ...
- [Erlang-0015][Lager] Erlang日志框架Lager简析
项目地址:https://github.com/basho/lager (欢迎任何形式的转载,但请务必注明出处:http://www.cnblogs.com/liangjingyang)
- Qt官方开发环境生成的exe发布方式--使用windeployqt
Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...
- Android消息机制架构和源码解析
http://wangkuiwu.github.io/2014/08/26/MessageQueue/
- ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据(转)
转载来源:https://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...
- 【转】解决Nginx php-fpm配置有误引起的502错误
转自:https://www.centos.bz/2017/07/nginx-php-fpm-502-error/ 在Ubuntu+Nginx+PHP环境下部署好以后,访问网站报错502,在后台ngi ...
- Python自学day-1
一.Python介绍 1.python擅长领域: WEB开发:Django. pyramid. Tornado. Bottle. Flask. WebPy 网络编程:Twisted(牛 ...
- mysql批量update操作时出现锁表
https://www.cnblogs.com/wodebudong/articles/7976474.html 最近遇到一件锁表的情况,发现更新的语句where检索的字段,没有建索引,且是批量操作的 ...