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的

A 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 = 1at 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) throwsIOException{

Path startingDir= Paths.get("C:\\apache-tomcat-8.0.21");

List result = new LinkedList();

Files.walkFileTree(startingDir,newFindJavaVisitor(result));

System.out.println("result.size()=" +result.size());

}private static class FindJavaVisitor extends SimpleFileVisitor{private Listresult;public FindJavaVisitor(Listresult){this.result =result;

}

@OverridepublicFileVisitResult visitFile(Path file, BasicFileAttributes attrs){if(file.toString().endsWith(".java")){

result.add(file.getFileName());

}returnFileVisitResult.CONTINUE;

}

}

来一个实际例子:

public static void main(String[] args) throwsIOException {

Path startingDir= Paths.get("F:\\upload\\images"); //F:\\upload\\images\\2\\20141206

List result = new LinkedList();

Files.walkFileTree(startingDir,newFindJavaVisitor(result));

System.out.println("result.size()=" +result.size());

System.out.println("done.");

}private static class FindJavaVisitor extends SimpleFileVisitor{private Listresult;public FindJavaVisitor(Listresult){this.result =result;

}

@OverridepublicFileVisitResult 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());

}returnFileVisitResult.CONTINUE;

}

}

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

public static void main(String[] args) throwsIOException {

Path startingDir= Paths.get("F:\\111111\\upload\\images"); //F:\111111\\upload\\images\\2\\20141206

List result = new LinkedList();

Files.walkFileTree(startingDir,newFindJavaVisitor(result));

System.out.println("result.size()=" +result.size());

System.out.println("done.");

}private static class FindJavaVisitor extends SimpleFileVisitor{private Listresult;public FindJavaVisitor(Listresult){this.result =result;

}

@OverridepublicFileVisitResult 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();returnFileVisitResult.CONTINUE;

}

result.add(file.getFileName());returnFileVisitResult.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

的文档。

一个实际例子:

importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.nio.charset.StandardCharsets;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;public classStringTools {public static voidmain(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();

}

}

}

移动,复制和删除文件

移动文件树是复制和删除的文件树的结合。实际上,有两种方式来完成文件的移动。

一种是使用Files.move(),Files.copy(), 和Files.delete() 这三个方法;

另一种是只使用Files.copy(),Files.delete()方法。基于你的选择,在实现FileVisitor接口中对应的方法完成文件树的移动。

下面是一些注意事项。

在移动任何目录或文件之前,首先要移动目录本身。因为不为空的目录不能被移动。你需要在PReVisitDirectory()方法中你使用 Files.copy()方法用拷贝文件来代替。

visitFile()是用来移动每个文件最合适的方式。你一可以使用Files.move()或联合使用Files.copy()和Files.delete()方法。

当你移动完所有的源目录到目标目录后,使用Files.delete()来删除源目录,此时应该已经为空。这些操作应该在postVisitDirectory()方法中完成。

当你拷贝目录或文件时,你需要决定使用REPLACE_EXISTING 和 COPY_ATTRIBUTES选项。同时,当你移动文件或目录时,决定是否要使用ATOMIC_MOVE选项。

如果你想保留源目录的属性,你需要在文件移动以后在postVisitDirectory()做这些操作。一些属性例如 lastModifiedTime 应该在preVisitDirectory()方法中提取直到在postVisitDirectory()方法中设置好后保存。这是因为你在从源目录移动完文件以后,文件内容已经更改,最初的最近修改时间已经被新的日期覆盖了。

如果文件不能访问,你自己来决定来使用FileVisitResult.CONTINUE 或 TERMINATE 选项。

你也可以使用FOLLOW_LINKS选项来跟踪符号链接文件,需要注意的是,只会移动符号链接本身文件,不会影响到它指向的实际文件。

下面的代码把C:\rafaelnadal目录移动到C:\ATP\players\rafaelnafal目录。

import

java.io.IOException;

import java.nio.file.FileVisitOption;

import java.nio.file.FileVisitResult;

import java.nio.file.FileVisitor;

import java.nio.file.Files;

import java.nio.file.Path;

import java.nio.file.Paths;

import

java.nio.file.attribute.BasicFileAttributes;

import java.nio.file.attribute.FileTime;

import java.util.EnumSet;

import static

java.nio.file.StandardCopyOption.REPLACE_EXISTING;

import static

java.nio.file.StandardCopyOption.COPY_ATTRIBUTES;

import static

java.nio.file.StandardCopyOption.ATOMIC_MOVE;

class

MoveTree implements FileVisitor {

private final Path

moveFrom;

private final Path

moveTo;

static FileTime time =

null;

public MoveTree(Path moveFrom,

Path moveTo) {

this.moveFrom = moveFrom;

this.moveTo = moveTo;

}

static void moveSubTree(Path

moveFrom, Path moveTo) throws IOException {

try {

Files.move(moveFrom, moveTo, REPLACE_EXISTING,

ATOMIC_MOVE);

} catch (IOException e) {

System.err.println("Unable to move " + moveFrom +

" [" + e + "]");

}

}

@Override

public FileVisitResult

postVisitDirectory(Object dir, IOException

exc)

throws IOException {

Path newdir =

moveTo.resolve(moveFrom.relativize((Path) dir));

try {

Files.setLastModifiedTime(newdir, time);

Files.delete((Path) dir);

} catch (IOException e) {

System.err.println("Unable to copy all attributes

to: " + newdir+" [" + e + "]");

}

return FileVisitResult.CONTINUE;

}

@Override

public FileVisitResult

preVisitDirectory(Object dir, BasicFileAttributes

attrs)

throws

IOException {

System.out.println("Move

directory: " + (Path) dir);

Path newdir =

moveTo.resolve(moveFrom.relativize((Path) dir));

try {

Files.copy((Path) dir, newdir, REPLACE_EXISTING,

COPY_ATTRIBUTES);

time = Files.getLastModifiedTime((Path)

dir);

} catch (IOException e) {

System.err.println("Unable to move " + newdir + "

[" + e + "]");

return FileVisitResult.SKip_SUBTREE;

}

return FileVisitResult.CONTINUE;

}

@Override

public FileVisitResult

visitFile(Object file, BasicFileAttributes

attrs)

throws

IOException {

System.out.println("Move file:

" + (Path) file);

moveSubTree((Path) file,

moveTo.resolve(moveFrom.relativize((Path) file)));

return

FileVisitResult.CONTINUE;

}

@Override

public FileVisitResult

visitFileFailed(Object file, IOException

exc)

throws

IOException {

return

FileVisitResult.CONTINUE;

}

}

class Main

{

public static void

main(String[] args) throws IOException {

Path moveFrom =

Paths.get("C:/rafaelnadal");

Path moveTo =

Paths.get("C:/ATP/players/rafaelnadal");

MoveTree walk = new MoveTree(moveFrom,

moveTo);

EnumSet opts =

EnumSet.of(FileVisitOption.FOLLOW_LINKS);

Files.walkFileTree(moveFrom, opts,

Integer.MAX_VALUE, walk);

}

}

你也可以使用其他的方法来完成Files.move()

相同的工作,因为每一次移动就是一对拷贝删除操作。所以,你可以重写moveSubTree()方法。

static

void moveSubTree(Path moveFrom, Path moveTo) throws IOException

{

try {

Files.copy(moveFrom, moveTo, REPLACE_EXISTING,

COPY_ATTRIBUTES);

Files.delete(moveFrom);

} catch (IOException e) {

System.err.println("Unable to move " + moveFrom +

" [" + e + "]");

}

}

java files_Java NIO Files 操作文件相关推荐

  1. Java操作文件Path 和 Paths 及Files类介绍

    我们平时操作文件时可能要写一大堆代码.JDK1.7引入了好用的Path 和 Paths类. 创建文件,删除文件,复制文件,查找文件,查找文件个数等,只需要调一个Api就能解决,下面开始进行介绍. 1. ...

  2. nio java 内核拷贝_大文件拷贝,试试NIO的内存映射

    最近项目里有个需求需要实现文件拷贝,在java中文件拷贝流的读写,很容易就想到IO中的InputStream和OutputStream之类的,但是上网查了一下文件拷贝也是有很多种方法的,除了IO,还有 ...

  3. java流与文件——操作文件

    [0]README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件--操作文件 的相关知识: 0.2) for source code, please vi ...

  4. Java 7:使用NIO.2进行文件过滤–第2部分

    大家好. 这是使用NIO.2系列进行文件过滤的第2部分. 对于那些尚未阅读第1部分的人 ,这里有个回顾. NIO.2是自Java 7起JDK中包含的用于I / O操作的新API.使用此新API,您可以 ...

  5. Java 7:使用NIO.2进行文件过滤–第3部分

    大家好. 这是使用NIO.2系列进行文件过滤的第3部分. 对于那些尚未阅读第1 部分或第2部分的人 ,这里有个回顾. NIO.2是自Java 7起JDK中包含的用于I / O操作的新API.使用此新A ...

  6. Java 7:使用NIO.2进行文件过滤-第1部分

    NIO.2是自Java 7起JDK中包含的用于I / O操作的新API.使用此新API,您可以执行与 java.io以及许多出色的功能,例如:访问文件元数据和监视目录更改等. 显然,由于向后兼容,ja ...

  7. Java 7:使用NIO.2进行文件过滤-第2部分

    大家好. 这是使用NIO.2系列进行文件过滤的第2部分. 对于那些尚未阅读第1部分的人 ,这里有个回顾. NIO.2是自Java 7起JDK中包含的用于I / O操作的新API.使用此新API,您可以 ...

  8. Java 7 – NIO文件革命

    Java 7("项目代币")已于去年7月问世. 此版本中的新增功能很有用,例如,尝试使用资源–从try块自动处理可关闭的资源,switch语句中的字符串,用于异常的multicat ...

  9. Java操作文件的方法大全

    标题 最新工作涉及到文件操作的内容,顺带花点时间把各种业务场景的方法都总结出来,供大家参考 对应Maven依赖.这块提醒千万别倒错包,这块的方法本人都亲测过,如果报错看下依赖是否正确 <depe ...

最新文章

  1. 深度学习--TensorFlow(5)BP神经网络(混淆矩阵、准确率、精确率、召回率、F值)
  2. NFV — Overview
  3. sklearn中的fit_transform和transform以及什么时候使用
  4. “读书”频道的一些链接错误
  5. 剑指 Offer 27. 二叉树的镜像【无取巧解法,易于理解!】
  6. 学习笔记(47):Python实战编程-pack布局
  7. 针对服务器操作系统安全,浅谈等级保护中的服务器操作系统安全
  8. TCP三次挥手四次握手
  9. iOS----------获取通知状态并跳转设置界面设置
  10. arcgis中将地理坐标转换为投影坐标 / 经纬度坐标转换
  11. excel公式编辑器_【软件】公式编辑神器:墨迹公式
  12. 微服务拆分以及之间的远程调用
  13. 【深度】谈谈我对于5G的理解
  14. android拼音转汉字,安卓汉字转拼音库 – TinyPinyin
  15. 都挺好 苏大强C位出道的不只表情包 还有大眼袋
  16. Li‘s 影像组学视频学习笔记(25)-查看准确度、灵敏度、特异度及混淆矩阵
  17. WinBUGS对多元随机波动率模型:贝叶斯估计与模型比较
  18. pxe装linux系统出现dracut,关于PXE网络安装linux系统中碰到的个别问题
  19. canvas签名插件 jSignature 移动,PC都适用
  20. 近期对战体会 [20170102]

热门文章

  1. [勇者闯LeetCode] 1. Two Sum
  2. UML在软件开发各个阶段的应用
  3. 【C++】栈中实例化对象与堆中实例化对象
  4. 冰河浅析 - 揭开***的神秘面纱
  5. 《软件构造》之多线程
  6. 写了一个美篇图片爬虫,已开源
  7. CS + MSF 联动
  8. 推荐算法评价指标(ACC、查全率、查准率、F1-Score、ROC、AUC,P-R)
  9. JS正则验证密码 英文大小写+数字+特殊符号 的表达式。
  10. 关于光纤传播速度比铜线快的误解