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操作 ...
随机推荐
- 【Git】打标签
打标签 同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签.人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做.本节我们一起来学习如何列出所有可用的标签,如何新建标签,以 ...
- VS下对Resx资源文件的操作
原文:VS下对Resx资源文件的操作 读取 using System.IO; using System.Resources; using System.Collections; using Syste ...
- 读unp并动手实践
经过三个月的学习,我发现进度比较慢.照这个进度下去,平均一周花费5-6小时,还不知道读完全书需要多久. 现在做个计划,全书除开简介部分分为 基础 和 高级 套接字编程两部分,其中 基础可以分为 TCP ...
- 算法之--字符串反转【python实现】
题目描述 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdefab”.请写一个函数 ...
- Android动画基础——属性动画(Property Animation)
本篇涉及例子下载:Github 本篇讲android 3.0引入的属性动画框架,上篇写视图动画View Animation时就说过ViewAnimation的缺点,那就是动画作用的是view本身的视觉 ...
- JS获取a标签的Href 内容
<script type="text/javascript">function getHref(obj){ alert(obj.href);} </script& ...
- OpenDJ Roadmap
Roadmap https://wikis.forgerock.org/confluence/display/OPENDJ/OpenDJ+Roadmap Forum https://forum.for ...
- 转载 《TypeScript 类型定义 DefinitelyTyped》
快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中. <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...
- 在Qt工程中加Boost
摘要: Boost是一个很强大的C++库,堪比STL,里面有很多非常优秀的类库.我不多介绍,详情见官网:http://www.boost.org/ 要在我们的Qt工程中把这个库加进去应该怎么做呢?我今 ...
- 深入解析Windows窗口创建和消息分发(三个核心问题:怎么将不同的窗口过程勾到一起,将不同的hwnd消息分发给对应的CWnd类去处理,CWnd如何简单有效的去处理消息,由浅入深,非常清楚) good
笔记:争取不用看下面的内容,只看自己的笔记,就能记住这个流程,就算明白了: _tWinMain-->AfxWinMain,它调用四个函数: -->AfxWinInit用于做一些框架的初始化 ...