博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java文件IO操作应该抛弃File拥抱Paths和Files
阅读量:4990 次
发布时间:2019-06-12

本文共 10907 字,大约阅读时间需要 36 分钟。

Java7中文件IO发生了很大的变化,专门引入了很多新的类:

import java.nio.file.DirectoryStream;

import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;

......等等,来取代原来的基于java.io.File的文件IO操作方式.

1. Path就是取代File的

Path represents a path that is hierarchical and composed of a sequence of directory and file name elements separated by a special separator or delimiter.

Path用于来表示文件路径和文件。可以有多种方法来构造一个Path对象来表示一个文件路径,或者一个文件:

1)首先是final类Paths的两个static方法,如何从一个路径字符串来构造Path对象:

Path path = Paths.get("C:/", "Xmp");        Path path2 = Paths.get("C:/Xmp");                URI u = URI.create("file:///C:/Xmp/dd");                Path p = Paths.get(u);

2)FileSystems构造:

Path path3 = FileSystems.getDefault().getPath("C:/", "access.log");

3)File和Path之间的转换,File和URI之间的转换:

File file = new File("C:/my.ini");        Path p1 = file.toPath();        p1.toFile();        file.toURI();

4)创建一个文件:

Path target2 = Paths.get("C:\\mystuff.txt");//      Set
perms = PosixFilePermissions.fromString("rw-rw-rw-");// FileAttribute
> attrs = PosixFilePermissions.asFileAttribute(perms); try { if(!Files.exists(target2)) Files.createFile(target2); } catch (IOException e) { e.printStackTrace(); }

windows下不支持PosixFilePermission来指定rwx权限。

5)Files.newBufferedReader读取文件:

try {//            Charset.forName("GBK")            BufferedReader reader = Files.newBufferedReader(Paths.get("C:\\my.ini"), StandardCharsets.UTF_8);            String str = null;            while((str = reader.readLine()) != null){                System.out.println(str);            }        } catch (IOException e) {            e.printStackTrace();        }

可以看到使用 Files.newBufferedReader 远比原来的FileInputStream,然后BufferedReader包装,等操作简单的多了。

这里如果指定的字符编码不对,可能会抛出异常 MalformedInputException ,或者读取到了乱码:

java.nio.charset.MalformedInputException: Input length = 1    at java.nio.charset.CoderResult.throwException(CoderResult.java:281)    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)    at java.io.InputStreamReader.read(InputStreamReader.java:184)    at java.io.BufferedReader.fill(BufferedReader.java:161)    at java.io.BufferedReader.readLine(BufferedReader.java:324)    at java.io.BufferedReader.readLine(BufferedReader.java:389)    at com.coin.Test.main(Test.java:79)

6)文件写操作:

try {            BufferedWriter writer = Files.newBufferedWriter(Paths.get("C:\\my2.ini"), StandardCharsets.UTF_8);            writer.write("测试文件写操作");            writer.flush();            writer.close();        } catch (IOException e1) {            e1.printStackTrace();        }

7)遍历一个文件夹:

Path dir = Paths.get("D:\\webworkspace");        try(DirectoryStream
stream = Files.newDirectoryStream(dir)){ for(Path e : stream){ System.out.println(e.getFileName()); } }catch(IOException e){ }
try (Stream
stream = Files.list(Paths.get("C:/"))){ Iterator
ite = stream.iterator(); while(ite.hasNext()){ Path pp = ite.next(); System.out.println(pp.getFileName()); } } catch (IOException e) { e.printStackTrace(); }

上面是遍历单个目录,它不会遍历整个目录。遍历整个目录需要使用:Files.walkFileTree

8)遍历整个文件目录:

public static void main(String[] args) throws IOException{        Path startingDir = Paths.get("C:\\apache-tomcat-8.0.21");        List
result = new LinkedList
(); Files.walkFileTree(startingDir, new FindJavaVisitor(result)); System.out.println("result.size()=" + result.size()); } private static class FindJavaVisitor extends SimpleFileVisitor
{ private List
result; public FindJavaVisitor(List
result){ this.result = result; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs){ if(file.toString().endsWith(".java")){ result.add(file.getFileName()); } return FileVisitResult.CONTINUE; } }

来一个实际例子:

public static void main(String[] args) throws IOException {        Path startingDir = Paths.get("F:\\upload\\images");    // F:\\upload\\images\\2\\20141206        List
result = new LinkedList
(); Files.walkFileTree(startingDir, new FindJavaVisitor(result)); System.out.println("result.size()=" + result.size()); System.out.println("done."); } private static class FindJavaVisitor extends SimpleFileVisitor
{ private List
result; public FindJavaVisitor(List
result){ this.result = result; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs){ String filePath = file.toFile().getAbsolutePath(); if(filePath.matches(".*_[1|2]{1}\\.(?i)(jpg|jpeg|gif|bmp|png)")){ try { Files.deleteIfExists(file); } catch (IOException e) { e.printStackTrace(); } result.add(file.getFileName()); } return FileVisitResult.CONTINUE; } }

将目录下面所有符合条件的图片删除掉:filePath.matches(".*_[1|2]{1}\\.(?i)(jpg|jpeg|gif|bmp|png)")

 

public static void main(String[] args) throws IOException {        Path startingDir = Paths.get("F:\\111111\\upload\\images");    // F:\111111\\upload\\images\\2\\20141206        List
result = new LinkedList
(); Files.walkFileTree(startingDir, new FindJavaVisitor(result)); System.out.println("result.size()=" + result.size()); System.out.println("done."); } private static class FindJavaVisitor extends SimpleFileVisitor
{ private List
result; public FindJavaVisitor(List
result){ this.result = result; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs){ String filePath = file.toFile().getAbsolutePath(); int width = 224; int height = 300; StringUtils.substringBeforeLast(filePath, "."); String newPath = StringUtils.substringBeforeLast(filePath, ".") + "_1." + StringUtils.substringAfterLast(filePath, "."); try { ImageUtil.zoomImage(filePath, newPath, width, height); } catch (IOException e) { e.printStackTrace(); return FileVisitResult.CONTINUE; } result.add(file.getFileName()); return FileVisitResult.CONTINUE; } }

 

为目录下的所有图片生成指定大小的缩略图。a.jpg 则生成 a_1.jpg

 

2. 强大的java.nio.file.Files

1)创建目录和文件:

try {            Files.createDirectories(Paths.get("C://TEST"));            if(!Files.exists(Paths.get("C://TEST")))                    Files.createFile(Paths.get("C://TEST/test.txt"));//            Files.createDirectories(Paths.get("C://TEST/test2.txt"));        } catch (IOException e) {            e.printStackTrace();        }

注意创建目录和文件Files.createDirectories 和 Files.createFile不能混用,必须先有目录,才能在目录中创建文件。

2)文件复制:

从文件复制到文件:Files.copy(Path source, Path target, CopyOption options);

从输入流复制到文件:Files.copy(InputStream in, Path target, CopyOption options);

从文件复制到输出流:Files.copy(Path source, OutputStream out);

try {            Files.createDirectories(Paths.get("C://TEST"));            if(!Files.exists(Paths.get("C://TEST")))                    Files.createFile(Paths.get("C://TEST/test.txt"));//          Files.createDirectories(Paths.get("C://TEST/test2.txt"));            Files.copy(Paths.get("C://my.ini"), System.out);            Files.copy(Paths.get("C://my.ini"), Paths.get("C://my2.ini"), StandardCopyOption.REPLACE_EXISTING);            Files.copy(System.in, Paths.get("C://my3.ini"), StandardCopyOption.REPLACE_EXISTING);        } catch (IOException e) {            e.printStackTrace();        }

3)遍历一个目录和文件夹上面已经介绍了:Files.newDirectoryStream , Files.walkFileTree

4)读取文件属性:

Path zip = Paths.get(uri);            System.out.println(Files.getLastModifiedTime(zip));            System.out.println(Files.size(zip));            System.out.println(Files.isSymbolicLink(zip));            System.out.println(Files.isDirectory(zip));            System.out.println(Files.readAttributes(zip, "*"));

5)读取和设置文件权限:

Path profile = Paths.get("/home/digdeep/.profile");            PosixFileAttributes attrs = Files.readAttributes(profile, PosixFileAttributes.class);// 读取文件的权限            Set
posixPermissions = attrs.permissions(); posixPermissions.clear(); String owner = attrs.owner().getName(); String perms = PosixFilePermissions.toString(posixPermissions); System.out.format("%s %s%n", owner, perms); posixPermissions.add(PosixFilePermission.OWNER_READ); posixPermissions.add(PosixFilePermission.GROUP_READ); posixPermissions.add(PosixFilePermission.OTHERS_READ); posixPermissions.add(PosixFilePermission.OWNER_WRITE); Files.setPosixFilePermissions(profile, posixPermissions); // 设置文件的权限

Files类简直强大的一塌糊涂,几乎所有文件和目录的相关属性,操作都有想要的api来支持。这里懒得再继续介绍了,详细参见 jdk8 的文档。

 

一个实际例子:

import java.io.BufferedReader;import java.io.BufferedWriter;import java.nio.charset.StandardCharsets;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;public class StringTools {    public static void main(String[] args) {        try {            BufferedReader reader = Files.newBufferedReader(Paths.get("C:\\Members.sql"), StandardCharsets.UTF_8);            BufferedWriter writer = Files.newBufferedWriter(Paths.get("C:\\Members3.txt"), StandardCharsets.UTF_8);            String str = null;            while ((str = reader.readLine()) != null) {                if (str != null && str.indexOf(", CAST(0x") != -1 && str.indexOf("AS DateTime)") != -1) {                    String newStr = str.substring(0, str.indexOf(", CAST(0x")) + ")";                    writer.write(newStr);                    writer.newLine();                }            }            writer.flush();            writer.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

转自:https://www.cnblogs.com/digdeep/p/4478734.html

转载于:https://www.cnblogs.com/yixiu868/p/8004397.html

你可能感兴趣的文章
【bzoj4552/Tjoi2016&Heoi2016】排序——二分+线段树/平衡树+线段树分裂与合并
查看>>
Windows Internals学习笔记(八)IO系统
查看>>
sql插件,SQLPrompt
查看>>
Objetive-C 属性和线程安全
查看>>
mybatis pagehelper实现分页
查看>>
很牛的javascript日期转换函数
查看>>
javascript格式化json显示
查看>>
Redis 在 SNS 类应用中的最佳实践有哪些?
查看>>
关于Unity 动画绘制原理
查看>>
django-xadmin后台开发
查看>>
Canvas链式操作
查看>>
学渣乱搞系列之网络流学习
查看>>
Acdream A - Unique Attack
查看>>
java遍历List的多种方法
查看>>
【投票】你心目中的Excel催化剂价值有多大(附主流国内外收费插件供参考)?...
查看>>
算法复习——半平面交(bzoj2618凸多边形)
查看>>
关于在Intellij Idea中使用JSTL标签库报错的问题
查看>>
如何用自己电脑做服务器,绑定域名建一个个人网站
查看>>
.ds_store是什么文件
查看>>
递归C++
查看>>