- 浏览: 379450 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (213)
- 面试题目 (9)
- 设计模式 (7)
- Core Java (28)
- 杂记 (10)
- 代码模板 (6)
- 数据库 (6)
- oracle plsql (2)
- strut2 study note (1)
- Oracle Database 10g SQL开发指南学习笔记 (7)
- Unix.Shell编程(第三版) 学习笔记 (1)
- Servlet (1)
- Hibernate (1)
- 敏捷开发 (1)
- Linux (13)
- Velocity (1)
- webx (1)
- Svn (2)
- 页面html,css (2)
- English (4)
- Astah usage (1)
- UML与设计思考 (2)
- JavaScript (3)
- 读书 (4)
- 好的网址 (1)
- 网址 (0)
- JMS (1)
- 持续集成环境 (1)
- 生活 (1)
- Spring (3)
- Tomcat Server (1)
- MySQL (2)
- 算法与数据结构 (6)
- Oracle数据库 (1)
- 分布式计算 (1)
- Maven (1)
- XML (2)
- Perl (2)
- 游戏 (1)
最新评论
-
chen_yi_ping:
请问楼主,怎么测试?String filePath = arg ...
使用多线程模拟多用户并发访问一个或多个tomcat,测试性能 -
adam_zs:
好,谢谢分享。
ArrayDeque实现Stack的功能 -
zjfgf:
int.class==Integer.class 返回fals ...
Class study -
kimmking:
xslt太难写的。
在java中调用xls格式化xml
http://blog.csdn.net/biexf/article/details/5897255
读写操作是I/O操作的基本行为;NIO中从Channel中读数据非常简单:创建一个buffer;通过一个channel完成buffer的数据读入;写数据同样简单:创建一个buffer;向其中填充数据;然后通过一个channel完成buffer的数据写入;
下面通过java的实际例子进行说明:
NIO读操作:
原来的IO中需要先创建一个FileInputStream然后完成读操作;
NIO读数据时因为数据最终都驻留在buffer中,所以你只需要从channel中读取数据到buffer对象中;
NIO中读取数据的步骤:1)从FileInputStream中得到Channel对象;2)创建一个buffer对象;3)从Channel中读数据到Buffer中;
javaCode:
-------------------------------------------------------------------------------------------------------------------------
//从FileInputStream中获取channel对象
FileInputStream fis = new FileInputStream(new File("D://1.txt"));
FileChannel fc = fis.getChannel();
//生成一个偏移量为0,容量和最大容量都为1024的ByteBuffer
ByteBuffer bb = ByteBuffer.allocate(1024);
//fc向buffer中读入数据
fc.read(bb);
--------------------------------------------------------------------------------------------------------------------------
你可能会注意到这里我们并不需要要求channel对象读入多少buffer数据,每个buffer对象内部有一个复杂的计数系统来跟踪已经读取的数据和剩余可读的buffer数据空间;
NIO写数据:
javacode:
--------------------------------------------------------------------------------------------------------------------------
//从FileOutputStream中获取一个文件流;
FileOutputStream fos = new FileOutputStream("D:/1.txt");
FileChannel fc = fos.getChannel();
//创建一个buffer并把准备写的数据填充进去;
ByteBuffer bb = ByteBuffer.allocate(1024);
//数据源
byte[] message = {1,2,42,'a',3};
bb.put(message);
bb.flip();
//一定得有,如果没有,就是从文件最后开始读取的。通过这个语句,就能把buffer的当前位置更改为buffer缓冲区的第一个位置。这样就可以从buffer开头,对该buffer进行遍历(读取)了。
//实际的写操作;
fc.write(bb); -----------------------------------------------------------------
这里同样的,我们不需要告诉Channel对象我们将要写入多少个字节,buffer内部有自己的计数系统来跟踪记录已经包含的数据和还可以写入数据的空间;
NIO的同时读操作和写操作:
举一个CopyFile的例子:从一个文件中复制数据到另一个文件中;其中包含三个基本操作:
创建一个Buffer,然后从从一个源文件中读取数据到buffer中,继而把buffer中的数据写入到目标文件中; Read->Write->Read->Write;该过程一直重复直至完成复制;
所以核心的循环代码如下:
-----------------------------------------------------------------
fcin.read(buffer);//read
fout.write(buffer);//write
-----------------------------------------------------------------
控制的循环终点: int r = fcin.read(buffer);
if(r==-1) 可以作为循环控制的终点;
重新定位Buffer位置:
1) 在fcin向buffer读数据之前,使用clear();
2) 在buffer向fcout写数据之前,使用flip;
-----------------------------------------------------------------
buffer.clear();
int r = fcin.read(buffer);
if(r==1){
break;
}
buffer.flip();
fcout.write(buffer);
-----------------------------------------------------------------
CopyFile.java全文:
-----------------------------------------------------------------
static public void main( String args[] ) throws Exception {
if (args.length<2) {
System.err.println( "Usage: java CopyFile infile outfile" );
System.exit( 1 );
}
File file = new File("");
String infile = args[0];
String outfile = args[1];
FileInputStream fin = new FileInputStream( infile );
FileOutputStream fout = new FileOutputStream( outfile );
FileChannel fcin = fin.getChannel();
FileChannel fcout = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate( 1024 );
while (true) {
buffer.clear();
int r = fcin.read( buffer );
if (r==-1) {
break;
}
buffer.flip();
fcout.write( buffer ); }
}
-----------------------------------------------------------------
读写操作是I/O操作的基本行为;NIO中从Channel中读数据非常简单:创建一个buffer;通过一个channel完成buffer的数据读入;写数据同样简单:创建一个buffer;向其中填充数据;然后通过一个channel完成buffer的数据写入;
下面通过java的实际例子进行说明:
NIO读操作:
原来的IO中需要先创建一个FileInputStream然后完成读操作;
NIO读数据时因为数据最终都驻留在buffer中,所以你只需要从channel中读取数据到buffer对象中;
NIO中读取数据的步骤:1)从FileInputStream中得到Channel对象;2)创建一个buffer对象;3)从Channel中读数据到Buffer中;
javaCode:
-------------------------------------------------------------------------------------------------------------------------
//从FileInputStream中获取channel对象
FileInputStream fis = new FileInputStream(new File("D://1.txt"));
FileChannel fc = fis.getChannel();
//生成一个偏移量为0,容量和最大容量都为1024的ByteBuffer
ByteBuffer bb = ByteBuffer.allocate(1024);
//fc向buffer中读入数据
fc.read(bb);
--------------------------------------------------------------------------------------------------------------------------
你可能会注意到这里我们并不需要要求channel对象读入多少buffer数据,每个buffer对象内部有一个复杂的计数系统来跟踪已经读取的数据和剩余可读的buffer数据空间;
NIO写数据:
javacode:
--------------------------------------------------------------------------------------------------------------------------
//从FileOutputStream中获取一个文件流;
FileOutputStream fos = new FileOutputStream("D:/1.txt");
FileChannel fc = fos.getChannel();
//创建一个buffer并把准备写的数据填充进去;
ByteBuffer bb = ByteBuffer.allocate(1024);
//数据源
byte[] message = {1,2,42,'a',3};
bb.put(message);
bb.flip();
//一定得有,如果没有,就是从文件最后开始读取的。通过这个语句,就能把buffer的当前位置更改为buffer缓冲区的第一个位置。这样就可以从buffer开头,对该buffer进行遍历(读取)了。
//实际的写操作;
fc.write(bb); -----------------------------------------------------------------
这里同样的,我们不需要告诉Channel对象我们将要写入多少个字节,buffer内部有自己的计数系统来跟踪记录已经包含的数据和还可以写入数据的空间;
NIO的同时读操作和写操作:
举一个CopyFile的例子:从一个文件中复制数据到另一个文件中;其中包含三个基本操作:
创建一个Buffer,然后从从一个源文件中读取数据到buffer中,继而把buffer中的数据写入到目标文件中; Read->Write->Read->Write;该过程一直重复直至完成复制;
所以核心的循环代码如下:
-----------------------------------------------------------------
fcin.read(buffer);//read
fout.write(buffer);//write
-----------------------------------------------------------------
控制的循环终点: int r = fcin.read(buffer);
if(r==-1) 可以作为循环控制的终点;
重新定位Buffer位置:
1) 在fcin向buffer读数据之前,使用clear();
2) 在buffer向fcout写数据之前,使用flip;
-----------------------------------------------------------------
buffer.clear();
int r = fcin.read(buffer);
if(r==1){
break;
}
buffer.flip();
fcout.write(buffer);
-----------------------------------------------------------------
CopyFile.java全文:
-----------------------------------------------------------------
static public void main( String args[] ) throws Exception {
if (args.length<2) {
System.err.println( "Usage: java CopyFile infile outfile" );
System.exit( 1 );
}
File file = new File("");
String infile = args[0];
String outfile = args[1];
FileInputStream fin = new FileInputStream( infile );
FileOutputStream fout = new FileOutputStream( outfile );
FileChannel fcin = fin.getChannel();
FileChannel fcout = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate( 1024 );
while (true) {
buffer.clear();
int r = fcin.read( buffer );
if (r==-1) {
break;
}
buffer.flip();
fcout.write( buffer ); }
}
-----------------------------------------------------------------
发表评论
-
Log4j常用配置
2011-08-29 22:03 1626log4j.rootLogger=INFO, normal ... -
ArrayDeque实现Stack的功能
2011-08-17 15:58 7542在J2SE6引入了ArrayDeque类 ... -
Java的clone()方法,浅复制与深复制
2011-08-15 15:06 1347要想实现克隆,需要实 ... -
LinkedList源码分析
2011-08-10 15:18 1034http://blog.csdn.net/zhouyong0/ ... -
深入探讨 Java 类加载器
2011-08-08 15:23 730http://www.ibm.com/developerwor ... -
Java.nio 与Java.io的比较
2011-08-05 18:00 1461http://blogs.oracle.com/slc/ent ... -
java缓冲读写
2011-08-05 15:54 1069public static void main(String[ ... -
java多线程写入同一文件
2011-08-05 15:40 9998转自 :http://www.update8.com/Prog ... -
java线程及ComcurrentHashMap
2011-08-04 13:55 950http://blog.csdn.net/dimly113/a ... -
HashMap源码分析
2011-08-04 13:51 1793public class HashMap<K,V&g ... -
HashMap与HashTable的区别、HashMap与HashSet的关系
2011-08-04 10:44 3385转自http://blog.csdn.net/wl_ldy/a ... -
JVM内存模型及垃圾收集策略解析
2011-07-18 23:16 1277http://blog.csdn.net/dimly113/a ... -
Java关键字final、static使用总结
2011-06-03 12:47 9http://java.chinaitlab.com/base ... -
Java关键字final、static使用总结
2011-06-03 12:47 8一、final 根据程序上下文环境,Java关键字fina ... -
Java关键字final、static使用总结
2011-06-03 12:46 5一、final 根据程序上下文环境,Java关键字fina ... -
Java关键字final、static使用总结
2011-06-02 16:20 0转自:http://java.chinaitlab.com/b ... -
Java关键字final、static使用总结
2011-06-02 16:20 773转自:http://java.chinaitlab.com/b ... -
Java关键字final、static使用总结
2011-06-02 16:19 2转自:http://java.chinaitlab.com/b ... -
protected访问级别详解
2011-05-12 14:42 1626首先阅读:http://download.oracle.com ... -
ddfccf
2011-05-11 09:42 0sdfds
相关推荐
Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,...
Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,...
Java客户端实现Kafka生产者与消费者实例 kafka的副本机制及选举原理剖析 基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 ...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
39_NIO中Scattering与Gathering深度解析 40_Selector源码深入分析 41_NIO网络访问模式分析 42_NIO网络编程实例剖析 43_NIO网络编程深度解析 44_NIO网络客户端编写详解 45_深入探索Java字符集编解码 46_字符集编解码...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
39_NIO中Scattering与Gathering深度解析 40_Selector源码深入分析 41_NIO网络访问模式分析 42_NIO网络编程实例剖析 43_NIO网络编程深度解析 44_NIO网络客户端编写详解 45_深入探索Java字符集编解码 46_字符集编解码...
fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...
第39讲:NIO中Scattering与Gathering深度解析 第40讲:Selector源码深入分析 第41讲:NIO网络访问模式分析 第42讲:NIO网络编程实例剖析 第43讲:NIO网络编程深度解析 第44讲:NIO网络客户端编写详解 第45讲:...