NIO Files工具对文件操作

2018-08-13 15:09:32
863次阅读
0个评论
Files工具类——文件操作

Files工具类负责文件的各种操作:

1. 文件内容的读写操作

使用这些方法我们可以直接获取文件的IO流对象(传统IO)或文件管道(NIO),这很大程度方便了我们的编程。



// 创建文件输入流
public static InputStream newInputStream(Path path, OpenOption... options) throws IOException
{
    return provider(path).newInputStream(path, options);
}
// 创建文件输出流
public static OutputStream newOutputStream(Path path, OpenOption... options) throws IOException
{
    return provider(path).newOutputStream(path, options);
}
// 创建字节管道(FileChannel)
public static SeekableByteChannel newByteChannel(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs) throws IOException
{
    return provider(path).newByteChannel(path, options, attrs);
}
public static SeekableByteChannel newByteChannel(Path path, OpenOption... options) throws IOException
{
    Set<OpenOption> set = new HashSet<OpenOption>(options.length);
    Collections.addAll(set, options);
    return newByteChannel(path, set);
}

2. 拷贝和移动


// 将源文件拷贝到指定路径
public static Path copy(Path source, Path target, CopyOption... options);
// 将源文件移动到指定路径
public static Path move(Path source, Path target, CopyOption... options);

OpenOption与CopyOption

OpenOption:用于配置如何打开或创建一个文件

CopyOption:用于配置如何拷贝或移动一个文件

LinkOption:定义如何处理符号链接


3. 列举目录下的文件


// 非递归迭代目录下的文件(一层)
public static DirectoryStream<Path> newDirectoryStream(Path dir);
// glob:可使用通配符,如:*,?等。
public static DirectoryStream<Path> newDirectoryStream(Path dir, String glob);
// filter:过滤器
public static DirectoryStream<Path> newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter);

示例:


public static void main(String[] args) {
        Path path = Paths.get("C:/");
        try {
            DirectoryStream<Path> ds;
            ds = Files.newDirectoryStream(path);  // 默认
            for (Path p : ds) {
                System.out.println(p);
            }
            System.out.println("-------------------");
            ds = Files.newDirectoryStream(path, "*Win*");  // 通配符
            for (Path p : ds) {
                System.out.println(p);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

运行结果:


C:\$GetCurrent
C:\$Recycle.Bin
C:\$WINRE_BACKUP_PARTITION.MARKER
C:\AVScanner.ini
C:\Boot
C:\bootmgr
C:\BOOTNXT
C:\BOOTSECT.BAK
C:\Documents and Settings
C:\hiberfil.sys
C:\inetpub
C:\Intel
C:\pagefile.sys
C:\Program Files
C:\Program Files (x86)
C:\ProgramData
C:\Recovery
C:\swapfile.sys
C:\System Volume Information
C:\Users
C:\Windows
C:\Windows10Upgrade
-------------------
C:\$WINRE_BACKUP_PARTITION.MARKER
C:\Windows
C:\Windows10Upgrade

4. 创建与删除


// 创建文件,并指定相应的文件属性
public static Path createFile(Path path, FileAttribute<?>... attrs);
// 创建目录(父目录不存在会抛出异常)
public static Path createDirectory(Path dir, FileAttribute<?>... attrs);
// 创建多级目录(父目录不存在会创建父目录)
public static Path createDirectories(Path dir, FileAttribute<?>... attrs);
// 创建临时文件
// dir指定目录;
// prefix指定前缀,可以为空;
// suffix指定后缀,可以为空,默认为.tmp
public static Path createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>... attrs);
public static Path createTempFile(String prefix, String suffix, FileAttribute<?>... attrs);
// 创建临时目录
public static Path createTempDirectory(Path dir, String prefix, FileAttribute<?>... attrs);
public static Path createTempDirectory(String prefix, FileAttribute<?>... attrs)
// 创建一个符号链接,如果JVM权限不够可能会抛出异常
public static Path createSymbolicLink(Path link, Path target, FileAttribute<?>... attrs);
// 创建一个硬链接,如果JVM权限不够可能会抛出异常
public static Path createLink(Path link, Path existing);
// 删除文件或目录,如果目录不为空会抛出异常
public static void delete(Path path);
// 如果文件存在就删除
public static boolean deleteIfExists(Path path);


5. 其他


// 读取符号链接指向的路径
public static Path readSymbolicLink(Path link);
// 获取该路径的FileStore对象
public static FileStore getFileStore(Path path);
// 判断两个路径是否指向同一个文件
public static boolean isSameFile(Path path, Path path2);
// 该路径所指向的文件是否为隐藏文件
public static boolean isHidden(Path path);
// 判断文件类型,无法判断则返回null
public static String probeContentType(Path path);

FileStore示例:


public static void main(String[] args) {
        Path path = Paths.get("C:/");
        try {
            FileStore fs = Files.getFileStore(path);
            System.out.println("TotalSpace: " + fs.getTotalSpace());
            System.out.println("UnallocatedSpace: " + fs.getUnallocatedSpace());
            System.out.println("UsableSpace: " + fs.getUsableSpace());
            System.out.println("Name: " + fs.name());
            System.out.println("Type: " + fs.type());
            System.out.println("ReadOnly: " + fs.isReadOnly());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

运行结果:


TotalSpace: 117369143296
UnallocatedSpace: 49184604160
UsableSpace: 49184604160
Name: 操作系统
Type: NTFS
ReadOnly: false


ContentType示例:


public static void main(String[] args) {
        Path path = Paths.get("D:/sort.txt");
        try {
            // 对于大部分文件该方法还是无法判断文件内容类型
            System.out.println(Files.probeContentType(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

运行结果:

text/plain
6. 属性访问
tic Path setOwner(Path path, UserPrincipal owner);
/**该文件是否为符号链接文件**/
public static boolean isSymbolicLink(Path path);
/**该文件是否为目录文件**/
public static boolean isDirectory(Path path, LinkOption... options);
/**是否为常规文件**/
public static boolean isRegularFile(Path path, LinkOption... options);
/**查看文件上次修改的时间**/
public static FileTime getLastMo

7. 可访问性


/**文件是否存在**/
public static boolean exists(Path path, LinkOption... options);
/**文件是否不存在**/
public static boolean notExists(Path path, LinkOption... options);
/**文件是否可读**/
public static boolean isReadable(Path path);
/**文件是否可写**/
public static boolean isWritable(Path path);
/**文件是否可执行**/
public static boolean isExecutable(Path path);


收藏00

登录 后评论。没有帐号? 注册 一个。