基于java Files类和Paths类的用法(详解)
Java7中文件IO发生了很大的变化,专门引入了很多新的类:
importjava.nio.file.DirectoryStream; importjava.nio.file.FileSystem; importjava.nio.file.FileSystems; importjava.nio.file.Files; importjava.nio.file.Path; importjava.nio.file.Paths; importjava.nio.file.attribute.FileAttribute; importjava.nio.file.attribute.PosixFilePermission; importjava.nio.file.attribute.PosixFilePermissions;
......等等,来取代原来的基于java.io.File的文件IO操作方式.
1.Path就是取代File的
APathrepresentsapaththatishierarchicalandcomposedofasequenceofdirectoryandfilenameelementsseparatedbyaspecialseparatorordelimiter.
Path用于来表示文件路径和文件。可以有多种方法来构造一个Path对象来表示一个文件路径,或者一个文件:
1)首先是final类Paths的两个static方法,如何从一个路径字符串来构造Path对象:
Pathpath=Paths.get("C:/","Xmp");
Pathpath2=Paths.get("C:/Xmp");
URIu=URI.create("file:///C:/Xmp/dd");
Pathp=Paths.get(u);
2)FileSystems构造:
Pathpath3=FileSystems.getDefault().getPath("C:/","access.log");
3)File和Path之间的转换,File和URI之间的转换:
Filefile=newFile("C:/my.ini");
Pathp1=file.toPath();
p1.toFile();
file.toURI();
4)创建一个文件:
Pathtarget2=Paths.get("C:\\mystuff.txt");
//Setperms=PosixFilePermissions.fromString("rw-rw-rw-");
//FileAttribute>attrs=PosixFilePermissions.asFileAttribute(perms);
try{
if(!Files.exists(target2))
Files.createFile(target2);
}catch(IOExceptione){
e.printStackTrace();
}
windows下不支持PosixFilePermission来指定rwx权限。
5)Files.newBufferedReader读取文件:
try{
//Charset.forName("GBK")
BufferedReaderreader=Files.newBufferedReader(Paths.get("C:\\my.ini"),StandardCharsets.UTF_8);
Stringstr=null;
while((str=reader.readLine())!=null){
System.out.println(str);
}
}catch(IOExceptione){
e.printStackTrace();
}
可以看到使用Files.newBufferedReader远比原来的FileInputStream,然后BufferedReader包装,等操作简单的多了。
这里如果指定的字符编码不对,可能会抛出异常MalformedInputException,或者读取到了乱码:
java.nio.charset.MalformedInputException:Inputlength=1 atjava.nio.charset.CoderResult.throwException(CoderResult.java:281) atsun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339) atsun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) atjava.io.InputStreamReader.read(InputStreamReader.java:184) atjava.io.BufferedReader.fill(BufferedReader.java:161) atjava.io.BufferedReader.readLine(BufferedReader.java:324) atjava.io.BufferedReader.readLine(BufferedReader.java:389) atcom.coin.Test.main(Test.java:79)
6)文件写操作:
try{
BufferedWriterwriter=Files.newBufferedWriter(Paths.get("C:\\my2.ini"),StandardCharsets.UTF_8);
writer.write("测试文件写操作");
writer.flush();
writer.close();
}catch(IOExceptione1){
e1.printStackTrace();
}
7)遍历一个文件夹:
Pathdir=Paths.get("D:\\webworkspace");
try(DirectoryStreamstream=Files.newDirectoryStream(dir)){
for(Pathe:stream){
System.out.println(e.getFileName());
}
}catch(IOExceptione){
}
try(Streamstream=Files.list(Paths.get("C:/"))){ Iterator ite=stream.iterator(); while(ite.hasNext()){ Pathpp=ite.next(); System.out.println(pp.getFileName()); } }catch(IOExceptione){ e.printStackTrace(); }
上面是遍历单个目录,它不会遍历整个目录。遍历整个目录需要使用:Files.walkFileTree
8)遍历整个文件目录:
publicstaticvoidmain(String[]args)throwsIOException{
PathstartingDir=Paths.get("C:\\apache-tomcat-8.0.21");
Listresult=newLinkedList();
Files.walkFileTree(startingDir,newFindJavaVisitor(result));
System.out.println("result.size()="+result.size());
}
privatestaticclassFindJavaVisitorextendsSimpleFileVisitor{
privateListresult;
publicFindJavaVisitor(Listresult){
this.result=result;
}
@Override
publicFileVisitResultvisitFile(Pathfile,BasicFileAttributesattrs){
if(file.toString().endsWith(".java")){
result.add(file.getFileName());
}
returnFileVisitResult.CONTINUE;
}
}
来一个实际例子:
publicstaticvoidmain(String[]args)throwsIOException{
PathstartingDir=Paths.get("F:\\upload\\images");//F:\\upload\\images\\2\\20141206
Listresult=newLinkedList();
Files.walkFileTree(startingDir,newFindJavaVisitor(result));
System.out.println("result.size()="+result.size());
System.out.println("done.");
}
privatestaticclassFindJavaVisitorextendsSimpleFileVisitor{
privateListresult;
publicFindJavaVisitor(Listresult){
this.result=result;
}
@Override
publicFileVisitResultvisitFile(Pathfile,BasicFileAttributesattrs){
StringfilePath=file.toFile().getAbsolutePath();
if(filePath.matches(".*_[1|2]{1}\\.(?i)(jpg|jpeg|gif|bmp|png)")){
try{
Files.deleteIfExists(file);
}catch(IOExceptione){
e.printStackTrace();
}
result.add(file.getFileName());
}returnFileVisitResult.CONTINUE;
}
}
将目录下面所有符合条件的图片删除掉:filePath.matches(".*_[1|2]{1}\\.(?i)(jpg|jpeg|gif|bmp|png)")
publicstaticvoidmain(String[]args)throwsIOException{
PathstartingDir=Paths.get("F:\\111111\\upload\\images");//F:\111111\\upload\\images\\2\\20141206
Listresult=newLinkedList();
Files.walkFileTree(startingDir,newFindJavaVisitor(result));
System.out.println("result.size()="+result.size());
System.out.println("done.");
}
privatestaticclassFindJavaVisitorextendsSimpleFileVisitor{
privateListresult;
publicFindJavaVisitor(Listresult){
this.result=result;
}
@Override
publicFileVisitResultvisitFile(Pathfile,BasicFileAttributesattrs){
StringfilePath=file.toFile().getAbsolutePath();
intwidth=224;
intheight=300;
StringUtils.substringBeforeLast(filePath,".");
StringnewPath=StringUtils.substringBeforeLast(filePath,".")+"_1."
+StringUtils.substringAfterLast(filePath,".");
try{
ImageUtil.zoomImage(filePath,newPath,width,height);
}catch(IOExceptione){
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(IOExceptione){
e.printStackTrace();
}
注意创建目录和文件Files.createDirectories和Files.createFile不能混用,必须先有目录,才能在目录中创建文件。
2)文件复制:
从文件复制到文件:Files.copy(Pathsource,Pathtarget,CopyOptionoptions);
从输入流复制到文件:Files.copy(InputStreamin,Pathtarget,CopyOptionoptions);
从文件复制到输出流:Files.copy(Pathsource,OutputStreamout);
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(IOExceptione){
e.printStackTrace();
}
3)遍历一个目录和文件夹上面已经介绍了:Files.newDirectoryStream,Files.walkFileTree
4)读取文件属性:
Pathzip=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)读取和设置文件权限:
Pathprofile=Paths.get("/home/digdeep/.profile");
PosixFileAttributesattrs=Files.readAttributes(profile,PosixFileAttributes.class);//读取文件的权限
SetposixPermissions=attrs.permissions();
posixPermissions.clear();
Stringowner=attrs.owner().getName();
Stringperms=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;
publicclassStringTools{
publicstaticvoidmain(String[]args){
try{
BufferedReaderreader=Files.newBufferedReader(Paths.get("C:\\Members.sql"),StandardCharsets.UTF_8);
BufferedWriterwriter=Files.newBufferedWriter(Paths.get("C:\\Members3.txt"),StandardCharsets.UTF_8);
Stringstr=null;
while((str=reader.readLine())!=null){
if(str!=null&&str.indexOf(",CAST(0x")!=-1&&str.indexOf("ASDateTime)")!=-1){
StringnewStr=str.substring(0,str.indexOf(",CAST(0x"))+")";
writer.write(newStr);
writer.newLine();
}
}
writer.flush();
writer.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}
场景是,sqlserver导出数据时,会将datatime导成16进制的binary格式,形如:,CAST(0x0000A2A500FC2E4FASDateTime))
所以上面的程序是将最后一个datatime字段导出的,CAST(0x0000A2A500FC2E4FASDateTime)删除掉,生成新的不含有datetime字段值的sql脚本。用来导入到mysql中。
做到半途,其实有更好的方法,使用sqlyog可以很灵活的将sqlserver中的表以及数据导入到mysql中。使用sqlserver自带的导出数据的功能,反而不好处理。
以上这篇基于javaFiles类和Paths类的用法(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。