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
分享到:
相关推荐
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...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...
总的来说,Java NIO是一个强大的工具,对于需要处理大量并发连接和数据交换的应用来说,它提供了显著的性能提升。Netty则是NIO的一个高级封装,它进一步降低了使用NIO的复杂性,提高了开发效率。学习和理解Java NIO...
总的来说,Java NIO提供了一种高效、灵活的I/O模型,尤其适合处理高并发的网络应用。这个例子"一个java NIO的例子"是学习和理解Java NIO概念和机制的一个很好的起点。通过分析和运行这个示例,开发者可以更深入地...
Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...
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(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...
总的来说,Java NIO提供了一种更高效、灵活的方式来处理文件读取和其他I/O操作,尤其适合需要处理大量并发I/O请求的场合,例如服务器端编程。通过熟练掌握NIO,开发者可以构建出更加高效的Java应用程序。
java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(同步阻塞I/O)相对。NIO在Java 1.4版本引入,其设计目标是提供一种更高效、更灵活的I/O操作方式,特别适合处理大量并发连接...
Java NIO提供了一种高效、灵活的方式来处理大量的并发IO操作。通过使用Channels、Buffers和Selectors,开发者可以构建出更加高性能的应用程序。在后续的文章中,我们将深入探讨每个组件的具体实现细节及其在实际应用...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效、灵活的I/O操作方式。NIO与传统的 Blocking I/O(阻塞I/O)模式相比,...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种I/O模型,旨在提供一种更高效、更具弹性的I/O处理方式。相比于传统的BIO( Blocking I/O)模型,NIO在处理高并发和大...