来点实用的Java NIO(一)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 来点实用的Java NIO(一)

来点实用的Java NIO(一)

 2013/11/22 18:31:56  qindongliang1922  程序员俱乐部  我要评论(0)
  • 摘要:Java7对原有的NIO进行了重大改进,这个改进主要包括2个方面:第一,提供了全面的文件IO和文件系统访问支持。第二,基于异步Channel的IOIO流的操作在Java中属于一项高级的技能,因为这个知识在很多场景中都需要用到,也是一些公司爱面试的热点话题,可能我们大部分人都很少用到,但它却不无时无刻的伴随在我们的身边,散仙举个比较常见的例子,我们可能每天都要跟数据库打交道,不论你是关系型数据库,Oracle,DB2还是小巧玲珑的mysql,还是一些强大的NOSQL,Hbase,redis
  • 标签:Java 实用
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
  • 查看图片附件
上一篇: java架构 下一篇: 基于weka的优化算法
发表评论
用户名: 匿名