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的版 ... 
