Java 7对原有的NIO进行了重大改进,这个改进主要包括2个方面:
第一,提供了全面的文件IO和文件系统访问支持。
第二,基于异步Channel的IO
IO流的操作在Java中属于一项高级的技能,因为这个知识在很多场景中都需要用到,也是一些公司爱面试的热点话题,可能我们大部分人都很少用到,但它却不无时无刻的伴随在我们的身边,散仙举个比较常见的例子,我们可能每天都要跟数据库打交道,不论你是关系型数据库,Oracle,DB2还是小巧玲珑的mysql,还是一些强大的NOSQL,Hbase,redis,或者cassrdra,也许你也可能使用的是全文检索文件系统lucene,ES或者Solr。
我们可能直接与这些框架进行操作,而这些工具给我们实现了一些底层文件系统的持久功能,所以我们可能感觉不到与磁盘IO或者内存交互了,但是感觉不到并不代表没有,而它们确实时时刻刻存在的。
早期的Java提供了一个File类来访问文件系统,但File类的功能比较有限,比如它不能利用特定文件系统的特性,而且大多数方法在操作出错时仅仅返回失败,而不会提供异常信息,针对这种不足,NIO.2中引入了一个Path接口,Path接口代表一个出平台无关的平台路径,这个在Hadoop的HDFS分布式文件系统中,得到大量使用,相信使用过Java API操作HDFS文件系统的朋友们都很熟悉,除此之外NIO.2中,还提供了Files,Paths两个强大的静态工具类,用来快速操作文件。
下面,开始进入正题,代码如下:
class="java"> Path p=Paths.get("C:","Users");//获取一个文件目录代表C://Users
System.out.println("路径数量:"+p.getNameCount());//返回路径名的数量
System.out.println("path的根路径:"+p.getRoot());//根路径
System.out.println("path的绝对路径:"+p.toAbsolutePath());//绝对路径
输出结果:
路径数量:1
path的根路径:C:\
path的绝对路径:C:\Users
读取一个文件内容的测试:
//使用工具类Files一次性按行读取成List集合存储
List<String> list=Files.readAllLines(Paths.get("D:", "my.txt"), Charset.forName("UTF-8"));
System.out.println(list);//打印结果
输出结果:
[Lucene是一款非常优秀的全文检索框架, 三劫散仙, 我们好, 你们好]
批量写入的方式:
List<String> list=new ArrayList<String>();
list.add("Hadoop生态系统");
list.add("Flume是一个分布式日志收集系统.");
Files.write(Paths.get("d:", "my.txt"), list, Charset.forName("UTF-8"), StandardOpenOption.APPEND);//追加的方式写入
文件内容变更截图:
打印磁盘空间容量:
DecimalFormat ff=new DecimalFormat("0.00");//格式化数字
FileStore f=Files.getFileStore(Paths.get("d:"));//获取存储文件
System.out.println("D盘:");
System.out.println("总空间:"+ff.format(f.getTotalSpace()/1024/1024/1024.0)+"GB");
System.out.println("可用空间:"+ff.format(f.getUsableSpace()/1024/1024/1024.0)+"GB");
输出效果:
D盘:
总空间:126.87GB
可用空间:80.40GB
打印文件大小:
System.out.println(Files.size(Paths.get("D:", "my.txt"))+"字节");
149字节
Files类是一个高度封装的类,提供了大量的工具方法来完成文件拷贝,目录拷贝,删除文件,读取和写入文件等等,散仙在此就不一一列举了。
此外,在java.nio.file.attribute包下提供了大量的工具类,通过这些类开发者可以非常简单的读取修改文件属性。
类名说明AclFileAttributeView文件的权限集,可以同setAcl()修改权限BaseFileAttributeView文件的基本属性,包括最后修改时间,访问时间,创建时间,大小,是否为目录,是否为符号链接DosFileAttributeView文件是否只读,是否隐藏,是否为系统文件,是否存档文件FileOwnerAttributeView返回一个UserPrincipal对象代表文件所有者PosixFileAttributeView获取文件或修改文件的所有者,类似linux上 chmod命令,仅对Unix平台有用UserDefinedFileAttributeView开发者自定义属性。
下面给出一个,UserDefinedFileAttributeView写入私人信息的例子:
/**
* 写入私人信息,
* 此部分信息是隐藏的,
* 只对写入者透明
* **/
UserDefinedFileAttributeView ba=Files.getFileAttributeView(Paths.get("D:", "my.txt"), UserDefinedFileAttributeView.class, LinkOption.values());
ba.write("发行者", Charset.defaultCharset().encode("三劫散仙"));
ba.write("特殊标记", Charset.defaultCharset().encode("烽火连城"));
List<String> list=ba.list();
for(String s:list){
ByteBuffer buf=ByteBuffer.allocate(ba.size(s));//获取buffer
ba.read(s, buf);
buf.flip();
String value=Charset.defaultCharset().decode(buf).toString();//解码字节
System.out.println(s+"===>"+value);
}
输出结果如下:
发行者===>三劫散仙
特殊标记===>烽火连城
- 大小: 30.9 KB
- 大小: 23.6 KB