Java NIO相关操作
2016-02-17 16:45
471 查看
1,buffer相关操作:
2,channel写数据相关操作:
private static void channelWriteTest() throws Exception {
String[] data = { “hadoop”, “spark”, “scala”, “bigdata”, “大数据” };
File file = new File(“d://nio_channel.txt”);
FileOutputStream out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
for (String str : data) {
buffer.put((str + “\t”).getBytes(“UTF-8”));
}
buffer.flip();
channel.write(buffer);
channel.close();
out.close();
}
3,channel 读数据相关操作:
4,内存映射的方式读取文件:
总结:
java nio 读写数据基于buffer,channel,来实现,channel是双向的,既可以把数据读入缓存区,也可以把缓存区的数据写入channel。
java读取文件的几种方式比较:
1,RundomAccessFile,读取文件较慢,能随机访问文件内容
2,传统java io操作,inputstream 读取文件较慢,效率不高
3,BufferderReader,包装读取文件较快
4,MappedByteBuffer 通过内存映射的方式读取文件最快,最为方便,如上第4中方式。
private static void bufferTest() { IntBuffer buffer = IntBuffer.allocate(100); System.out.println("buffer position:" + buffer.position() + ",buffer limit:" + buffer.limit() + ",buffer capacity:" + buffer.capacity()); buffer.put(10); int[] data = { 10, 2, 3, 4, 5, 6, 5, 6, 7, 8 }; buffer.put(data); System.out.println("buffer position:" + buffer.position() + ",buffer limit:" + buffer.limit() + ",buffer capacity:" + buffer.capacity()); buffer.flip(); System.out.println("buffer position:" + buffer.position() + ",buffer limit:" + buffer.limit() + ",buffer capacity:" + buffer.capacity()); while (buffer.hasRemaining()) { System.out.println(buffer.get()); } }
2,channel写数据相关操作:
private static void channelWriteTest() throws Exception {
String[] data = { “hadoop”, “spark”, “scala”, “bigdata”, “大数据” };
File file = new File(“d://nio_channel.txt”);
FileOutputStream out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
for (String str : data) {
buffer.put((str + “\t”).getBytes(“UTF-8”));
}
buffer.flip();
channel.write(buffer);
channel.close();
out.close();
}
3,channel 读数据相关操作:
private static void chanelReadTest() throws Exception { File file = new File("D://settings.xml"); FileInputStream inputStream = new FileInputStream(file); FileChannel channel = inputStream.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); int tmp = 0; while ((tmp = channel.read(buffer)) != -1) { buffer.flip(); channel.read(buffer); Charset charset = null; CharsetDecoder decoder = null; CharBuffer charBuffer = null; charset = Charset.forName("UTF-8"); decoder = charset.newDecoder(); // charBuffer = decoder.decode(buffer);//用这个的话,只能输出来一次结果,第二次显示为空 charBuffer = decoder.decode(buffer.asReadOnlyBuffer()); System.out.println(charBuffer.toString()); buffer.clear(); } inputStream.close(); }
4,内存映射的方式读取文件:
private static void chanelMapTest() throws Exception { File file = new File("D://settings.xml"); FileInputStream inputStream = new FileInputStream(file); FileChannel fileChannel = inputStream.getChannel(); MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, file.length());//将文件映射到内存 byte[] data = new byte[(int)file.length()]; int index = 0; while(buffer.hasRemaining()){ data[index++] = buffer.get(); } System.out.println(new String(data,"UTF-8")); inputStream.close(); }
总结:
java nio 读写数据基于buffer,channel,来实现,channel是双向的,既可以把数据读入缓存区,也可以把缓存区的数据写入channel。
java读取文件的几种方式比较:
1,RundomAccessFile,读取文件较慢,能随机访问文件内容
2,传统java io操作,inputstream 读取文件较慢,效率不高
3,BufferderReader,包装读取文件较快
4,MappedByteBuffer 通过内存映射的方式读取文件最快,最为方便,如上第4中方式。
相关文章推荐
- java获取服务器一些信息的方法
- Java经典问题算法大全
- 【spring集锦】spring注入
- jdk安装提示对象已存在
- Java线程中run和start方法的区别
- Java 如何有效地避免OOM:善于利用软引用和弱引用
- 线程基础:JDK1.5+(10)——线程新特性(下)
- Java JVM:编译加载与自定义类加载器
- struts2 使用dmi
- JavaScipt中栈的实现方法
- InfoQ - 促进软件开发领域知识与创新的传播 搜索关键词 登录 En |中文 |日本 |Fr |Br 966,690 一月 独立访问用户 语言 & 开发 Java Clojure Scala
- java方法可变参数的写法
- JVM_Bind问题的解决方案
- SpringMVC项目,启动项目怎么总是报找不到log4j.properties文件
- Java重定向标准输入/输出
- 使用springmvc编写restful接口
- Java学习笔记 2016.2.17 方法重载、继承剖析
- ie浏览器 spring mvc返回json数据弹出下载页面 解决方案
- MyEclipse部署文件被lock的问题
- 不错的Spring学习笔记(转)