`
qindongliang1922
  • 浏览: 2171552 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117085
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125433
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59508
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71021
社区版块
存档分类
最新评论

来点实用的Java NIO(一)

    博客分类:
  • 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两个强大的静态工具类,用来快速操作文件。


下面,开始进入正题,代码如下:
	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
4
0
分享到:
评论
4 楼 qindongliang1922 2013-11-27  
spjich 写道
Paths  Files 这两个类只有java7才支持么?

嗯!
3 楼 spjich 2013-11-27  
Paths  Files 这两个类只有java7才支持么?
2 楼 qindongliang1922 2013-11-26  
leaow567 写道
写的不错

谢谢 
1 楼 leaow567 2013-11-26  
写的不错

相关推荐

    JavaNIO chm帮助文档

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    java NIO.zip

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...

    Java NIO英文高清原版

    总的来说,Java NIO是一个强大的工具,对于需要处理大量并发连接和数据交换的应用来说,它提供了显著的性能提升。Netty则是NIO的一个高级封装,它进一步降低了使用NIO的复杂性,提高了开发效率。学习和理解Java NIO...

    一个java NIO的例子

    总的来说,Java NIO提供了一种高效、灵活的I/O模型,尤其适合处理高并发的网络应用。这个例子"一个java NIO的例子"是学习和理解Java NIO概念和机制的一个很好的起点。通过分析和运行这个示例,开发者可以更深入地...

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...

    java NIO技巧及原理

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于...

    java NIO实例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...

    java nio 读文件

    总的来说,Java NIO提供了一种更高效、灵活的方式来处理文件读取和其他I/O操作,尤其适合需要处理大量并发I/O请求的场合,例如服务器端编程。通过熟练掌握NIO,开发者可以构建出更加高效的Java应用程序。

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    Java NIO Socket基本

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(同步阻塞I/O)相对。NIO在Java 1.4版本引入,其设计目标是提供一种更高效、更灵活的I/O操作方式,特别适合处理大量并发连接...

    Java NIO系列教程(一) Java NIO 概述

    Java NIO提供了一种高效、灵活的方式来处理大量的并发IO操作。通过使用Channels、Buffers和Selectors,开发者可以构建出更加高性能的应用程序。在后续的文章中,我们将深入探讨每个组件的具体实现细节及其在实际应用...

    Java NIO测试示例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效、灵活的I/O操作方式。NIO与传统的 Blocking I/O(阻塞I/O)模式相比,...

Global site tag (gtag.js) - Google Analytics