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操作 ...
随机推荐
- DLL中类的显式链接(用虚函数进行显式链接)
DLL的显式链接在某些时候比隐式链接具有更大的灵活性.比如,如果在运行时发现DLL无法找到,程序可以显示一个错误信息并能继续运行.当你想为你的程序提供插件服务时,显式链接也很有用处. 显式链接到全局C ...
- jconsole远程监控logstash agent
在logstash的jvm.options文件末尾添加: -Dcom.sun.management.jmxremote.port=9999 //指定jmx端口-Dcom.sun.managemen ...
- QT使用MySql的配置(使用addLibraryPath载入插件),编译QT的MySql驱动问题及解决方案(自己使用libmysql.lib进行编译mysql.pro,万不得已可以查看Makefile.Debug以解决问题)
2010/04/23:Fixes : 更新批处理,以兼容WIN7. 第一次系统地玩QT,于是诞生了此预备式: [QT版本4.6.0(VS2008编译版),开发平台推荐使用Qt Creator(最新1. ...
- Qt信号量QSemaphore(在线程里使用,结合生产者消费者的问题)
Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源.acquire()函数用于获取n个资源,当 ...
- 自己动手写jQuery插件---Tip(提示框)
对jQuery相信很多同学和我一样平时都是拿来主义,没办法,要怪只能怪jQuery太火了,各种插件基本能满足平时的要求.但是这毕竟不是长久之道,古人云:“授之以鱼,不如授之以渔”. 为了方便之前没有接 ...
- android 写文件到sd卡问题小记
android 写文件到sd卡问题小记 事情是这样子的.... 这天我开始编写项目调试工具,高大上不?-----其实就是记录实时网络请求和崩溃日志相关等的小工具(此处一个会心的微笑). 然后我是这样写 ...
- C语言实现常用数据结构——堆
#include<stdio.h> #include<stdlib.h> #define CAPACITY 20 /*堆有两个性质: * 1.结构性:堆必须是一颗完全二叉树 * ...
- Java算法-求最大和的子数组序列
问题:有一个连续数组,长度是确定的,它包含多个子数组,子数组中的内容必须是原数组内容中的一个连续片段,长度不唯一,子数组中每个元素相加的结果称为子数组的和,现要求找出和最大的一个子数组. 具体算法如下 ...
- sentinel 核心概念
编者注:前段时间笔者在团队内部分享了sentinel原理设计与实现,主要讲解了sentinel基础概念和工作原理,工作原理部分大家听了基本都了解了,但是对于sentinel的几个概念及其之间的关系还有 ...
- 跟我学SpringCloud | 第一篇:介绍
首先讲一下我为什么要写这一系列的文章,现在网上大量的springcloud相关的文章,使用的springboot和springcloud的版本都相对比较老,很多还是在使用springboot1.x的版 ...