Java编程思想:NIO知识点
import java.io.*;
import java.nio.*;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.util.*;
public class Test {
public static void main(String[] args) {
// GetChannel.test();
// BufferToText.test();
// AvailableCharSets.test();
// GetData.test();
// IntBufferDemo.test();
// ViewBuffers.test();
// Endians.test();
// UsingBuffers.test();
LargeMapperFiles.test();
}
}
/*
将字节存放在ByteBuffer的方法:
1.通过put方法直接对它们进行填充,填入一个或多个字节,或基本数据类型
2.通过warp方法将已存在的字节数组包装到ByteBuffer中,一旦如此,就不需要复制
底层的数组,而是把它作为所产生的ByteBuffer的存储器,称之为数组支持的ByteBuff。
*/
/*
1.对于只读操作,需要显示静态的allocate方法来分配ByteBuffer
2.对于read方法,调用read告知FileChannel向ByteBuffer存储字节后,需要调用缓冲器上
的flip,让它做好让别人读取字节的准备。
3.对于read方法,如果我们打算用缓冲器执行进一步的read操作,则我们必须调用clear方法
来为每一个read做好准备
*/
class GetChannel {
private static final int BSIZE = 1024;
public static void test() {
try {
//FileOutputStream测试
FileChannel fc1 = new FileOutputStream("./src/data").getChannel();
fc1.write(ByteBuffer.wrap("Some test".getBytes()));
fc1.close();
//FileInputStream测试
FileChannel fc2 = new FileInputStream("./src/data").getChannel();
ByteBuffer buff = ByteBuffer.allocate(BSIZE);
fc2.read(buff);
buff.flip();
/*
这个地方和下一个案例的需求是不同的:
这个案例中我需要将buff中的数据一个一个字符的打印出出来,get方法
就像迭代器中的next方法,每次调用时都会向后移动一个位置:
while (buff.hasRemaining())
System.out.println((char)buff.get());
下一个案例中,是从文件中读取,当文件所有内容都被读取后,调用read
放法,就会在buffer中存入一个-1的值:
while (fc1.read(buffer) != -1) {
buffer.flip();
fc2.write(buffer);
buffer.clear();
}
}
*/
while (buff.hasRemaining()) {
System.out.println((char)buff.get());
}
//RandomAccessFile测试
FileChannel fc3 = new RandomAccessFile("./src/data","rw").getChannel();
fc3.position(fc3.size());
fc3.write(ByteBuffer.wrap("Some more".getBytes()));
fc3.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ChannelCopy {
private static final int BSIZE = 1024;
public static void test() {
try{
FileChannel fc1 = new FileInputStream("./src/data").getChannel();
FileChannel fc2 = new FileOutputStream("./src/data").getChannel();
ByteBuffer buffer = ByteBuffer.allocate(BSIZE);
/*
FileChannel和ByteBuffer的使用逻辑:
1.得到FileChannel,也就是书中说的煤矿
2.建立ByteBuffer,也就是书中说的卡车
3.通知煤矿向卡车转载货物
4.使用卡车中的货物
5.清空卡车中的货物
*/
while (fc1.read(buffer) != -1) {
buffer.flip();
fc2.write(buffer);
buffer.clear();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
上一个案例并不是理想的使用方式,transferTo和transferFrom则允许我们将一个通道与
另一个通道直接相连
*/
class TransferTo{
public static void test() {
try{
FileChannel in = new FileInputStream("./src/data").getChannel();
FileChannel out = new FileOutputStream("./src/data").getChannel();
//将in中的位置为0,长度为in.size()的数据移动到out这个通道中
in.transferTo(0,in.size(),out);
//将in中的位置为0,长度为in.size()的数据移动到out这个通道中
out.transferFrom(in,0,in.size());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class BufferToText {
private static final int BSIZE = 1024;
public static void test() {
try {
//第一步,打开一个文件向里面写点东西
FileChannel fc1 = new FileOutputStream("./src/data1").getChannel();
fc1.write(ByteBuffer.wrap("some text".getBytes()));
fc1.close();
//第二步,读取这个文件,尝试使用buffer的asCharBuffer进行输出
FileChannel fc2 = new FileInputStream("./src/data1").getChannel();
ByteBuffer buffer = ByteBuffer.allocate(BSIZE);
fc2.read(buffer);
buffer.flip();
System.out.println("buffer.asCharBuffer(): "+buffer.asCharBuffer());
//第三步,使用系统默认的方式解码
buffer.rewind(); //移动光标到开始部分
String encoding = System.getProperty("file.encoding");
System.out.println("encoding: "+encoding);
System.out.println("Decode use "+encoding+" :"+Charset.forName(encoding).decode(buffer));
//第四步,写入东西时指定编码方式
FileChannel fc3 = new FileOutputStream("./src/data2").getChannel();
fc3.write(ByteBuffer.wrap("some text".getBytes("UTF-16BE")));
fc3.close();
//第五步,将写入的东西读出来
FileChannel fc4 = new FileInputStream("./src/data2").getChannel();
ByteBuffer buffer4 = ByteBuffer.allocate(BSIZE);
fc4.read(buffer4);
buffer4.flip();
System.out.println("buffer4.asCharBuffer(): "+buffer4.asCharBuffer());
//第六步,使用CharBuffer进行写
FileChannel fc5 = new FileOutputStream("./src/data2").getChannel();
ByteBuffer buffer5 = ByteBuffer.allocate(24);
buffer5.asCharBuffer().put("some Text");
fc5.write(buffer5);
fc5.close();
//第七步,将写入的内容读出来
FileChannel fc6 = new FileInputStream("./src/data2").getChannel();
ByteBuffer buffer6 = ByteBuffer.allocate(BSIZE);
fc6.read(buffer6);
buffer6.flip();
System.out.println("buffer6.asCharBuffer(): "+buffer6.asCharBuffer());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class AvailableCharSets {
public static void test() {
SortedMap<String,Charset> charset = Charset.availableCharsets();
Iterator<String> iter_name = charset.keySet().iterator();
while (iter_name.hasNext()) {
String charsetName = iter_name.next();
System.out.print(charsetName);
Set<String> aliases= charset.get(charsetName).aliases();
Iterator<String> iter_alia = aliases.iterator();
if(iter_alia.hasNext())
System.out.print(":");
while (iter_alia.hasNext()) {
System.out.print(iter_alia.next()+" ");
}
System.out.println("");
}
}
}
class GetData{
private static final int BSIZE = 1024;
public static void test() {
ByteBuffer b = ByteBuffer.allocate(BSIZE);
//b在创建是会自动分配0
int i = 0;
while (i++ < b.limit()) {
if (b.get() != 0) {
System.out.println("not zero.");
}
}
System.out.println("i = "+i);
//存储并读取一个char
b.rewind();
b.asCharBuffer().put("Hello");
char c;
while ((c = b.getChar()) != 0) {
System.out.print(c);
}
System.out.println();
//存储并读取一个short
b.rewind();
b.asShortBuffer().put((short) 471142);
System.out.println("b.getShort(): "+b.getShort());
//存储并读取一个int
b.rewind();
b.asIntBuffer().put(992341);
System.out.println("b.getInt(): "+b.getInt());
//存储并读取一个long
b.rewind();
b.asLongBuffer().put(234141532234L);
System.out.println("b.getLong(): "+b.getLong());
//存储并读取一个float
b.rewind();
b.asFloatBuffer().put(23414.134f);
System.out.println("b.getFloat(): "+b.getFloat());
//存储并读取一个double
b.rewind();
b.asDoubleBuffer().put(234.1432234);
System.out.println("b.getDouble(): "+b.getDouble());
}
}
class IntBufferDemo{
private static final int BSIZE = 1024;
public static void test() {
ByteBuffer b = ByteBuffer.allocate(BSIZE);
IntBuffer ib = b.asIntBuffer();
ib.put(new int[]{1,2,3,4,5});
System.out.println(ib.get(3));
System.out.println(ib.get(4));
ib.put(3, 100);
System.out.println(ib.get(3));
System.out.println(ib.get(4));
System.out.println("Setting a new limit before rewinding the buffer");
ib.flip();
while (ib.hasRemaining()) {
int i = ib.get();
System.out.println(i);
}
}
}
class ViewBuffers {
public static void test() {
ByteBuffer b = ByteBuffer.wrap(new byte[]{0,0,0,0,0,0,0,'a'});
b.rewind();
System.out.println("ByteBuffer:");
while (b.hasRemaining()) {
System.out.println(b.position()+"-->"+b.get()+".");
}
b.rewind();
CharBuffer cb = b.asCharBuffer();
System.out.println("CharBuffer:");
while (cb.hasRemaining()) {
System.out.println(cb.position()+"-->"+cb.get()+".");
}
}
}
class Endians {
public static void test() {
ByteBuffer b = ByteBuffer.wrap(new byte[12]);
b.asCharBuffer().put("abcdef");
System.out.println(Arrays.toString(b.array()));
b.rewind();
b.order(ByteOrder.BIG_ENDIAN);
b.asCharBuffer().put("abcdef");
System.out.println(Arrays.toString(b.array()));
b.rewind();
b.order(ByteOrder.LITTLE_ENDIAN);
b.asCharBuffer().put("abcdef");
System.out.println(Arrays.toString(b.array()));
}
}
class UsingBuffers {
private static void symmetricScramble(CharBuffer buffer) {
while (buffer.hasRemaining()) {
buffer.mark();
char c1 = buffer.get();
char c2 = buffer.get();
buffer.reset();
buffer.put(c2).put(c1);
}
}
public static void test() {
char[] data = "UsingBuffers".toCharArray();
ByteBuffer bb = ByteBuffer.allocate(data.length * 2);
CharBuffer cb = bb.asCharBuffer();
cb.put(data);
System.out.println(cb.rewind());
symmetricScramble(cb);
System.out.println(cb.rewind());
symmetricScramble(cb);
System.out.println(cb.rewind());
}
}
class LargeMapperFiles {
private static final int length = 0X8FFFFFF; //128 MB
public static void test() {
try {
MappedByteBuffer out = new RandomAccessFile("./src/data", "rw")
.getChannel()
.map(FileChannel.MapMode.READ_WRITE, 0,length);
for (int i = 0; i < length; i++) {
out.put((byte)'x');
}
System.out.println("Finished writing...");
for (int i = length / 2; i < length / 2 + 6; i++) {
System.out.println((char)out.get(i));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Java编程思想:NIO知识点的更多相关文章
- Java编程思想非主流知识点
1. Java中的多态性理解(注意与C++区分) Java中除了static方法和final方法(private方法本质上属于final方法,因为不能被子类访问)之外,其它所有的方法都是动态绑定,这意 ...
- JAVA编程思想(第四版)学习笔记----4.8 switch(知识点已更新)
switch语句和if-else语句不同,switch语句可以有多个可能的执行路径.在第四版java编程思想介绍switch语句的语法格式时写到: switch (integral-selector) ...
- 《Java编程思想》读书笔记(三)
前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...
- Java编程思想总结笔记The first chapter
总觉得书中太啰嗦,看完总结后方便日后回忆,本想偷懒网上找别人的总结,无奈找不到好的,只好自食其力,尽量总结得最好. 第一章 对象导论 看到对象导论觉得这本书 目录: 1.1 抽象过程1.2 每个对象 ...
- Java编程思想总结笔记Chapter 2
本章介绍Java程序的基本组成部分,体会到Java中几乎一切都是对象. 第二章 一切都是对象 目录: 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.3 永远不需要销毁对象 2.4 创建 ...
- Java 编程思想 Chapter_14 类型信息
本章内容绕不开一个名词:RTTI(Run-time Type Identification) 运行时期的类型识别 知乎上有人推断作者是从C++中引入这个概念的,反正也无所谓,理解并能串联本章知识才是最 ...
- Java编程思想读书笔记(一)【对象导论】
2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
- 异常笔记--java编程思想
开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出 ...
- (Java编程思想)Thinking in Java
1. 为什么突然想去研读<Thinking in Java>? 最近终于下定决心撸了一本<Thinking in Java>第四版,虽然在此之前我就久闻这本书的大名,但一直未曾 ...
- 《Java编程思想》阅读笔记二
Java编程思想 这是一个通过对<Java编程思想>(Think in java)进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会忽略或 ...
随机推荐
- 快速写入Xml文件
我们在做一些操作的时候会需要生成日志,Xml文件就是我们常用的一种日志文件. 普通操作Xml文件的代码遇到大数据量的话就很慢了. 用这个生成Xml文件的话,即使数据量很大,也很快 private vo ...
- oracle 使用db_link 导入导出小结
客户有一个需求,是将一个库中的某个用户迁移到一台新的oracle服务器上,因数据量较小,并且不涉及版本的升级,所以可以采用创建一个dblink,然后通过这个dblink直接从源库将用户数据导出并导入到 ...
- 解决 ThinkPHP Undefined class constant 'MYSQL_ATTR_INIT_COM
这是 php.ini 配置所导致: 放开php配置文件中被注释掉的.dll引用即可. extension=php_mysql.dllextension=php_mysqli.dllextension= ...
- 一键增加swap空间脚本
#!/bin/bash echo -e "\033[33m Your current swap is \033[0m" free -h mkdir /SwapDir cd /Swa ...
- abp(net core)+easyui+efcore仓储系统——定义仓储并实现 (四)
abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) abp(net core)+easyui+e ...
- SpringBoot启动访问JSP页面,直接进入页面或者访问不到,报404,并且加载tomcat插件tomcat-embed-jasper也不行
这个问题花费了两天的时间,解决路径: 我用的是SpringBoot1.5.2,SpringMVC和Spring,tomcat启动插件都是默认的版本,Spring是4.3.7,jdk是1.7.0_80, ...
- Scala 学习之路(五)—— 集合类型综述
一.集合简介 Scala中拥有多种集合类型,主要分为可变的和不可变的集合两大类: 可变集合: 可以被修改.即可以更改,添加,删除集合中的元素: 不可变集合类:不能被修改.对集合执行更改,添加或删除操作 ...
- Spark学习之路(八)—— Spark SQL 之 DataFrame和Dataset
一.Spark SQL简介 Spark SQL是Spark中的一个子模块,主要用于操作结构化数据.它具有以下特点: 能够将SQL查询与Spark程序无缝混合,允许您使用SQL或DataFrame AP ...
- vuex分模块后,如何获取state的值
问题:vuex分模块后,一个模块如何拿到其他模块的state值,调其他模块的方法? 思路:1.通过命名空间取值--this.$store.state.car.list // OK 2.通过定义该属性的 ...
- 长春理工大学第十四届程序设计竞赛(重现赛)I
I.Fate Grand Order 题目链接:https://ac.nowcoder.com/acm/contest/912/I 题目: Fate Grand Order是型月社发行的角色扮演类手机 ...