Java文件IO操作应该抛弃File拥抱Paths和Files
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<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-rw-rw-"); // FileAttribute<Set<PosixFilePermission>> 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<Path> stream = Files.newDirectoryStream(dir)){for(Path e : stream){System.out.println(e.getFileName());}}catch(IOException e){}
try (Stream<Path> stream = Files.list(Paths.get("C:/"))){Iterator<Path> 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<Path> result = new LinkedList<Path>();Files.walkFileTree(startingDir, new FindJavaVisitor(result));System.out.println("result.size()=" + result.size()); }private static class FindJavaVisitor extends SimpleFileVisitor<Path>{private List<Path> result;public FindJavaVisitor(List<Path> result){this.result = result;}@Overridepublic 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\\20141206List<Path> result = new LinkedList<Path>();Files.walkFileTree(startingDir, new FindJavaVisitor(result));System.out.println("result.size()=" + result.size()); System.out.println("done.");}private static class FindJavaVisitor extends SimpleFileVisitor<Path>{private List<Path> result;public FindJavaVisitor(List<Path> result){this.result = result;}@Overridepublic 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\\20141206List<Path> result = new LinkedList<Path>();Files.walkFileTree(startingDir, new FindJavaVisitor(result));System.out.println("result.size()=" + result.size()); System.out.println("done.");}private static class FindJavaVisitor extends SimpleFileVisitor<Path>{private List<Path> result;public FindJavaVisitor(List<Path> result){this.result = result;}@Overridepublic 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<PosixFilePermission> 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();}} }
场景是,sql server导出数据时,会将 datatime 导成16进制的binary格式,形如:, CAST(0x0000A2A500FC2E4F AS DateTime))
所以上面的程序是将最后一个 datatime 字段导出的 , CAST(0x0000A2A500FC2E4F AS DateTime) 删除掉,生成新的不含有datetime字段值的sql 脚本。用来导入到mysql中。
做到半途,其实有更好的方法,使用sql yog可以很灵活的将sql server中的表以及数据导入到mysql中。使用sql server自带的导出数据的功能,反而不好处理。
Java文件IO操作应该抛弃File拥抱Paths和Files相关推荐
- Java 文件 IO 操作
文章目录 1. File类 2. RandomAccessFile类 3. 流类 3.1 字节流 3.2 字符流 3.3 管道流 3.4 ByteArrayInputStream.ByteArrayO ...
- java 文件io操作_java文件IO操作。
public static void main(String[] args) { String filename = "F:/zhangming_test/test.txt"; S ...
- Java文件读写操作(c站最全!一篇就够了)
写在前面 你们好,我是小庄.很高兴能和你们一起学习Java.如果您对Java感兴趣的话可关注我的动态. 写博文是一种习惯,在这过程中能够梳理和巩固知识. Java文件读写操作 一.File类 ...
- java安全编码指南之:文件IO操作
文章目录 简介 创建文件的时候指定合适的权限 注意检查文件操作的返回值 删除使用过后的临时文件 释放不再被使用的资源 注意Buffer的安全性 注意 Process 的标准输入输出 InputStre ...
- import java文件,java 文件夹操作,java文件夹,import java.
java 文件夹操作,java文件夹,import java.import java.io.File; import java.io.FileInputStream; import java.io.F ...
- NIO详解以及NIO的文件IO操作
一.NIO概述 java.nio全称java non-blockingIO,是指JDK1.4开始提供的新API.从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,被统称为NIO(即Ne ...
- python和R文件IO操作对比及dataframe创建方式对比:read_csv、to_csv、write.csv、 data.frame、pd.DataFrame
python和R文件IO操作对比及dataframe创建方式对比 很多工程师可能刚开始的时候只熟悉python或者R其中的一个进行数据科学相关的任务. 那么如果我们对比这学习可以快速了解语言设计背后的 ...
- Java - 文件(IO流)
Java - 文件 (IO) 流的分类: > 文件流:FileInputStream | FileOutputStream | FileReader | FileWriter & ...
- python io操作有什么_Python笔记:文件IO操作
读取文件 使用open()打开文件,文件不存在会抛出IOError错误. try: f = open('/path/to/file', 'r') print(f.read()) finally: if ...
最新文章
- 来客推商城V3多用户uni-app商城源码如何搭建?盈利模式怎么样的?
- Win32汇编数组编程图解
- 和lua的效率对比测试_Unity游戏开发Lua更新运行时代码!
- Java线程面试题,值得一看!
- php火车订票系统设计论文,基于JSP的火车票订票系统 JSP146(毕业设计+论文)
- chart控件做实时曲线显示_「Qt」利用QChart实现实时动态的曲线数据展示(进化版)
- Linux学习笔记005----CentOS7 vi模式保存并退出
- YYText源码解读-YYText同步/异步渲染流程(一)—UIView与CALayer
- 前端javascript解压zip文件[zip.js] 附上可用demo
- ArcGis10.2详细安装步骤
- 心理学入门必读好物,《亲密关系》精华版
- [ffmpeg][issues] bit_equal_to_one out of range: 0, but must be in [1,1]
- java 报表工具_最好用的5款java web免费报表工具
- 视频分割技巧,把视频分割成多段进行保存
- 程序员的那些搞笑牛逼注释
- 网易微专业IOS开发工程师教程(完整)
- 离散实验 判断集合之间是单射,满射还是双射
- (转帖)物流行业:JIT,VMI模式
- html中如何定义斜框,html表格单元格添加斜下框线的方法
- 重要的表格数据误删了,用EasyRecovery快速恢复!