大家好,如果您还对深入浅出Java文件操作技巧(第二部分)不太了解,没有关系,今天就由本站为大家分享深入浅出Java文件操作技巧(第二部分)的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
公共最终类路径{
私有路径() { }
公共静态路径获取(字符串第一个,字符串.更多){
返回FileSystems.getDefault().getPath(first, more);
}
public static Path get(URI uri) {/*我们暂时不研究这个方法*/}
}可以看到,我们可以通过Paths的get静态方法获取到一个Path对象。事实上,我们通常通过Paths的get方法来获取Path对象。 (至于如何调用该方法返回的对象,主要是通过调用文件系统的抽象方法来实现)。获得Path对象后,我们就可以调用其中封装的所有方法了。由于方法有很多,我们一一进行。点击查看。
布尔值isAbsolute();
路径getFileName();
路径getParent();
int getNameCount();
路径getName(int index);
路径子路径(int beginIndex, int endIndex);
路径解析(路径其他);
路径resolveSibling(路径其他);
路径相对化(路径其他);
路径到绝对路径();
文件到文件();主要方法就这么多。其中一些功能甚至具体的实现代码与上一篇介绍的File类类似,这里不再赘述。 getFileName方法与File类的getName方法类似,返回路径的文件名(目录名或文件名)。两者的实现原理基本相同。
路径p=Paths.get("a","b","c","d","e");
System.out.println(p.getNameCount());
/*执行代码可以看到输出:5*/
路径p=Paths.get("a/t","b","c","d","e");
System.out.println(p.getNameCount());
/*执行代码输出结果:6*/可以看到,getNameCount方法并没有直接统计构造Path对象时传入的字符串数量。当我们调用Path.get方法并传入一个变量字符串作为路径时,它会将每个独立的字符串视为一个目录名,并使用默认的路径分隔符将这些路径名连接起来形成一个Path路径,而调用getNameCount方法是根据默认的路径分隔符的数量来统计返回。
getName方法需要传入一个int类型的索引。构建路径时,每一层都从根路径开始编号。根目录为0,子目录依次加1,因此getName方法可以获取任意一级目录的名称。
路径p=Paths.get("a","b","c","d","e");
System.out.println(p.getName(1));
/*输出:b*/subpath方法和我们String中的substring类似。给定起始位置和结束位置的索引值,获取它们之间的路径字符串。
路径p=Paths.get("a","b","c","d","e");
System.out.println(p.subpath(1,3));
/*输出结果:b/c*/需要注意一个细节,截取范围[startIndex, endIndex),即endIndex位置的值不会被截取。
solve 方法是一个非常有趣的方法。根据我的理解,这个方法实现了路径组合的操作。 p.resolve(q),如果q是绝对路径,则返回结果为q,如果q是相对路径,则返回结果为p+q,实现拼接组合。
路径p=Paths.get("a","b","c","d","e");
路径q=Paths.get("c:/users");
System.out.println(p.resolve(q));
/*输出:c:/用户*/
路径p=Paths.get("a","b","c","d","e");
路径q=Paths.get("用户");
System.out.println(p.resolve(q));
/*输出结果:abcdeusers*/resolveSibling方法通过解析当前路径的父目录生成兄弟路径。
路径p=Paths.get("a","b","c","d","e");
路径q=Paths.get("用户");
System.out.println(p.resolveSibling(q));
/*输出结果:abcdusers*/将e替换成users,因为e是当前目录,而这个方法是在当前目录下生成一个和他同级的兄弟目录。通常可以用来修改当前目录的目录名。 (生成磁盘文件之前)
接下来我们来说说relativize方法,它是用来生成相对路径的方法。需要传入一个额外的Path 对象。
路径p=Paths.get("a","b","c","d","e");
路径q=Paths.get("用户");
System.out.println(p.relativize(q));
/*输出结果:....users*/
路径p=Paths.get("a","b","c","d","e");
Path q=Paths.get("a","b","c","d","e","f");
System.out.println(p.relativize(q));
/*输出结果:f*/通过对比可以发现,所谓的相对路径生成,实际上是指q是相对于p的。从第二种情况可以看出,整个p可以作为q的父目录,所以相对路径就是当前目录f。第一种情况,因为没有找到公共目录,所以将整个p作为q的父目录。当然,相对于q来说,相对路径是这样的。
最后我还想说几句。 Path中有一个toFile方法。该方法对应于FIle中的toPath。为什么要实现这两种方法呢?其实就是为了兼容旧的File类,方便一些旧系统成功过渡到新系统。 java标准。
二、Files类如上所述,整个FIles类都有静态方法,并且没有实例字段。 (看这个类就是实现对文件的各种操作就够了)首先我们看一下对文件的读写操作。
公共静态InputStream newInputStream(路径路径,OpenOption.选项)
公共静态OutputStream newOutputStream(路径路径,OpenOption.选项)
公共静态BufferedReader newBufferedReader(路径路径,字符集cs)
公共静态BufferedReader newBufferedReader(路径路径)
公共静态BufferedWriter newBufferedWriter
公共静态字节[] readAllBytes(路径路径)
公共静态ListreadAllLines(路径路径)
公共静态路径写入(路径路径,字节[]字节,OpenOption.选项)
公共静态长复制(InputStream in,路径目标,CopyOption.选项)
有许多公共静态长复制(Path source、OutputStream out)方法。我们来看一下。首先有两个方法可以根据Path路径返回InputStream/OutputStream字节流对象。这两个方法为我们下面的一些方法提供了一定的保证。为了方便起见,还有两个方法通过Path 对象返回BufferedReader/BufferedWriter 对象。这些对我们的其他方法很有帮助。
readAllBytes 在内部创建一个InputStream 对象来将所有字节读取到给定的字节数组中并返回它。 readAllLines 在内部创建了一个List 数组,并使用BufferedReader 创建了一个字符缓冲流来逐行读取。最后返回List集合。写操作基本上是读的逆操作,这里不再赘述。
copy方法有多个重载,即:
私有静态长复制(InputStream源,OutputStream接收器)
公共静态长复制(InputStream in,路径目标,CopyOption.选项)
public static long copy(路径源,OutputStream输出)
public static Path copy(Path source, Path target, CopyOption. options) 第一个重载是一个私有方法,它是一个被别人调用的工具方法。主要功能是:从源流中读取所有字节并写入到接收流中,并返回实际读取或写入的字节数。第二个重载通过方法newOutputStream选择Path对象,构造一个OutputStream对象,然后调用第一个重载方法实现复制。完成的功能是:从InputStream流中读取所有字节并写入到指定文件中。第三个重载方法主要从Path文件中读取所有字节并将其写入OutputStream对象流。操作过程类似,不再赘述。最后一个重载方法实现了从一个Path 对象到另一个Path 对象的复制。
//根目录下只有hello.txt文件,没有world文件
路径p=Paths.get("hello.txt");
路径q=Paths.get("world.txt");
文件.copy(p,q);
/*创建world文件,并将hello的内容复制到这里*/对于这个操作,有几点需要注意:如果磁盘位置q处的文件已经存在,则复制操作将无法完成。如果磁盘位置不存在p,则该操作对于相应的文件仍然会失败。如果p是目录文件,则将复制名为world的目录文件。如果q是目录文件,则会创建一个无类型文件(hello中的内容已被复制)。
说完文件的读写操作,我们再来说说文件或目录的创建以及获取文件的基本信息。
公共静态路径createFile(路径路径,FileAttribute? attrs)
公共静态路径createDirectory(路径dir,FileAttribute? attrs)
公共静态路径createDirectories(路径dir,FileAttribute? attrs)
public static Path createTempFile 因为Path路径中存储的路径可以是文件类型,也可以是目录类型。那么在创作的时候就需要区分。 createFile 根据指定路径创建指定类型的文件。 createDirectory 和createDirectories 的区别在于,如果Path 路径上有未创建的目录,则后者会将其全部创建。关于临时文件的创建,由于用得不多,就不讲了。
获取文件信息主要有以下几种方法:
公共静态布尔isSameFile(路径路径,路径路径2)
公共静态布尔isHidden(路径路径)
公共静态字符串probeContentType(路径路径)
public static boolean isDirectory(Path 路径, LinkOption. 选项)
public static boolean isRegularFile(Path 路径, LinkOption. 选项)
public static long size(路径路径)
公共静态布尔存在(路径路径,LinkOption.选项)
公共静态布尔值isReadable(路径路径)
公共静态布尔isWritable(路径路径)
/*这些方法的名称是注释。相信大家一眼就能认出各自的功能*/最后说一下迭代和过滤器。上一篇文章的最后,我们讲到了FIle的过滤和迭代,因为在File类中,通常会一次性返回一个File数组或者String数组,这样往往效率很低。在Files类中,设计了一个方法newDirectoryStream来返回目录流,这样可以显着提高效率。
公共静态DirectoryStreamnewDirectoryStream(路径目录)
公共静态DirectoryStreamnewDirectoryStream(路径dir,字符串glob)
公共静态DirectoryStreamnewDirectoryStream(路径目录,
目录流过滤器? super Pathfilter) 这是三个目录流的重载方法。第一个方法只需要提供一个Path路径,第二个方法提供一个Path对象和一个glob字符串。全局模式:
在这里写下图片描述
第三种方法也在外部指定一个过滤器。具体使用说明请参见下面的代码。
DirectoryStreamd=Files.newDirectoryStream(Paths.get("f:/360"));
对于(路径p : d){
System.out.println(p.getFileName());
}
//输出结果:
360卫士
360sd安装程序
360zip
//这是我的f盘360文件下的所有文件DirectoryStreamd=Files.newDirectoryStream(Paths.get("f:/360"),"*.exe");
对于(路径p : d){
System.out.println(p.getFileName());
}
//输出结果:
360sdSetup.exeDirectoryStreamd=Files.newDirectoryStream(Paths.get("f:/360"),new DirectoryStream.Filter(){
@覆盖
公共布尔接受(路径条目){
return Files.isDirectory(entry)?true:false;
}
});
对于(路径p : d){
System.out.println(p.getFileName());
}
//输出结果:
360卫士
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!
【深入浅出Java文件操作技巧(第二部分)】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这篇文章讲的是写JAVA文件吗?
有5位网友表示赞同!
之前好像没看过Java文件处理相关的教程。期待学习一下。
有10位网友表示赞同!
"(二)"感觉前边还有文章呢!要看的话不知道在哪儿找到。
有17位网友表示赞同!
最近需要自己写Java程序处理一些文件,这篇文章好像挺适合我的需求啊。
有13位网友表示赞同!
java文件操作,是不是主要讲的是读和写的概念?
有12位网友表示赞同!
学习完这篇文章后,我想能自己搞定各种文件操作了!
有10位网友表示赞同!
我一直想深入理解Java的文件处理方式,这篇文章正好可以帮我解决这个问题。
有8位网友表示赞同!
不知道文章里会讲解哪些常用的函数或者方法?
有19位网友表示赞同!
之前用C++做过文件操作,感觉Java的实现应该有很大的区别吧。我很期待学习这种差异之处。
有16位网友表示赞同!
希望这篇文章能够清晰地解释每个概念,让新手也能轻松理解。
有10位网友表示赞同!
我有一个关于文件处理的小问题,不知道这篇文章会解答吗?
有12位网友表示赞同!
看了标题就知道这篇文章肯定会很有用!期待学习学习!
有11位网友表示赞同!
Java在软件开发中用途很广,学会文件操作能让我更加熟练地使用它。
有16位网友表示赞同!
以前处理文件的时候总是遇到各种问题,也许这篇文章能给我一些解决方案。
有6位网友表示赞同!
我想尝试将这篇文章中的知识应用到我的项目中,看看效果如何。
有7位网友表示赞同!
这篇文章是基础教程吗? 感觉挺适合我这种刚接触Java的人学习的。
有19位网友表示赞同!
看了标题,觉得这篇文章应该对文件处理有很好的总结和讲解!
有15位网友表示赞同!
我要好好认真看一篇讲文件操作的文章,提升自己的编程水平。
有5位网友表示赞同!
文件操作是软件开发中很重要的技能,希望能从这篇文章学到很多新的知识。
有5位网友表示赞同!
感谢作者分享这篇关于Java文件操作的文章!
有11位网友表示赞同!