new IO学习笔记(一)

JDK1.4的java.nio.*包中,引入了新的javaI/O类库,其目的在于提高速度。

速度的提高来自于使用的结构更接近于操作系统执行I/O的方式:通道和缓冲器。

通道要么从缓冲中获得数据,要么向缓冲器发送数据。

唯一直接与通道交互的缓冲器是ByteBuffer-----也就是说,可以存储未加工字节的缓冲器。ByteBuffer是个相当基础的类,通过告知分配多少存储空间来创建一个ByteBuffer对象,并且还有一个方法选择集用于以原始的字节形式或基本数据类型输出和读取数据。但是没办法输出或读取对象,即使是字符串对象也不行。

用新I/O来实现对文本文件的拷贝:

FileChannel in = new FileInputStream("d:\\a.txt").getChannel();

FileChannel out  = new FileOutputStream("d:\\b.txt").getChannel();

ByteBuffer bb = ByteBuffer.allocate(1024);

while(in.read(bb)!=-1) {

       bb.flip();

       out.write(bb);

       bb.clear();

}

----------------------------------------------------------------------------------------------------------------------------

在NIOZ中提供了特殊的方法transferTo()和transferFrom(),允许我们将一个通道和另一个通道直接连接:

abstract  longtransferFrom(ReadableByteChannel src, long position, long count)  将字节从给定的可读取字节通道传输到此通道的文件中。

abstract  longtransferTo(long position, long count,WritableByteChannel target)   将字节从此通道的文件传输到给定的可写入字节通道。

FileChannel in = new FileInputStream("d:\\a.txt").getChannel();

FileChannel out  = new FileOutputStream("d:\\b.txt").getChannel();

in.transferTo(0,in.size(),out);

//or  ---  

//out.transferFrom(in,0,in.size());

--------------------------------------------------------------------------------------------------------------------------------

对输入和输出的文本进行编码和解码

FileChannel out = new FileOutputStream("D:\\a.txt").getChannel();
FileChannel in = new FileInputStream("D:\\a.txt").getChannel();       //两个FileChannel对象关联一个文件,一个负责写,一个读取
out.write(ByteBuffer.wrap("您好".getBytes("GBK")));                             //采用GBK编码
out.close();
ByteBuffer buf = ByteBuffer.allocate(1024);
in.read(buf);

buf.flip();

in.close();

System.out.println(Charset.forName("gbk").decode(buf));                  //输出时根据GBK解码

缓冲器容纳的是普通的字节,为了把他们转换成字符,我们要么在输入它们的时候对其进行编码(这样,它们的输出才有意义),要么在将其从缓冲器输出时对它们进行解码。

----------------------------------------------------------------------------------------------------------------------------------------------

视图缓冲器

view buffer可以让我们通过某个特定的基本数据类型的视窗查看其底层的ByteBuffer。ByteBuffer依然是实际存储数据的地方,“支持着前面的视图”,因此,对视图的任何修改都会映射成为对ByteBuffer中的数据修改。ByteBuffer中提供了一系列的 " as "方法,用来转换成各种类型的buffer.

               ByteBuffer buf = ByteBuffer.allocate(1024);
IntBuffer ib = buf.asIntBuffer();
ib.put(new int[]{1,3,45,32,34,323,122});
System.out.println(ib.get(3));
ib.put(3, 110);
ib.flip();
while (ib.hasRemaining()) {
System.out.print(ib.get() + ",");
}

-----------------------------------------------------------------------------------------------------------------------------------------------------------

字节存放次序

不同的机器可能会使用不同的字节排序方法来存储数据。big endian(高位优先)将最重要的字节存放在地址最低的存储器单元。而 little endian(低位优先)则是将最重要的字节放在地址最高的存储器单元。ByteBuffer是以高位优先的形式存储数据的,并且数据在网上传送时也常常使用高位优先的形式。我们可以使用ByteOrder.BIG_ENDIAN或ByteOrder.LITTLE_ENDIAN的order()方法改变ByteBuffer的字节排序方式。

ByteBuffer buf = ByteBuffer.wrap(new byte[10]);
buf.asCharBuffer().put("abcde");
System.out.println(Arrays.toString(buf.array()));
buf.rewind();
buf.order(ByteOrder.BIG_ENDIAN);
buf.asCharBuffer().put("abcde");
System.out.println(Arrays.toString(buf.array()));
buf.rewind();
buf.order(ByteOrder.LITTLE_ENDIAN);
buf.asCharBuffer().put("abcde");
System.out.println(Arrays.toString(buf.array()));

~~~~~~~~ByteBuffer有足够的空间,以存储作为外部缓冲器的CharArray中的所有的字节,因此可以调用array()方法显示视图底层的字节。array()方法是可选的,并且我们只能对由数组支持的缓冲器调用此方法,否则,将会抛出UnsupportedOperationException。

通过CharBuffer视图可以将charAarry插入到ByteBuffer中,在底层的字节被显示时,我们会发现默认次序和随后的高位优先次序相同,然而低位优先次序则与之相反,后者交换了这些字节次序。

-----------------------------------------------------------------------------------------------------------------------------------------------------------

时间: 2024-09-29 10:13:01

new IO学习笔记(一)的相关文章

IO学习笔记(二)

11.  IO实现读取键盘录入  与   字符流和字节流的转换 System.out标准的输出 System.in标准的输入           static InputStream  in OutputStreamWriter(OutputStream out)  OutputStreamWriter(OutputStream out, String charsetName)        创建使用指定字符集的 OutputStreamWriter OutputStreamWriter 是字符

IO学习笔记(三)

13.  File 类 它既能代表一个文件的名称,又能代表一个目录下一组文件的名称.常用于对文件或文件夹的操作. File对象也可以作为参数传递给流的构造函数. File(File parent,String child)   根据 parent 抽象路径名和 child 路径名字符串创建一个新File 实例 File(String pathname)    通过将给定路径名字符串转换为抽象路径名来创建一个新File 实例. File(String parent,String child)   

IO学习笔记(一)

一.对文件的写操作 1.  FileWriter对象 FileWriter  fw = new FileWriter("XXX"); 只要对文件进行IO操作,就会有IOException异常. 创建一个FileWriter对象,该对象一初始化,必须要明确要操作的文件. 而且如果在该目录下如果存在与指定文件同名的文件,那么同名文件将被覆盖. 在用FileWriter对象写文件的时候,数据是被写到了缓冲中,所以要flush(). 当我们调用flush()方法时,FileWriter对象没有

java对象序列化学习笔记

java对象|笔记 目前网络上关于对象序列化的文章不少,但是我发现详细叙述用法和原理的文章太少.本人把自己经过经验总结和实际运用中的体会写成的学习笔记贡献给大家.希望能为整个java社区的繁荣做一点事情.    序列化的过程就是对象写入字节流和从字节流中读取对象.将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机.对象序列化功能非常简单.强大,在RMI.Socket.JMS.EJB都有应用.对象序列化问题在网

jsp2 tag学习笔记

js|笔记 JSP2.0标签学习笔记1. 说明本文档是学习tomcat中例子的笔记,并没有参考相应的说明文档,因此不能保证本文观点的正确性.如果有不对之处,不妨email至8280338@tzenet.com,大家共同进步. 2. JSP2.0标签使用方法JSP2.0中标签的使用由多个部分组成: (1) WEB_INF/web.xml中添加标签引用 (2) 标签的实现,可能是class也可能是web templet (3) 在jsp文件中添加引用 在实际使用中,分析jsp2.0标签可以先从jsp

作为一个新手的Oracle(DBA)学习笔记

Oracle数据库笔记 Jack Chaing 作者QQ595696297 交流群 127591054 祝大家学习进步. 如果大家想看Word版本的可以去下载:Word排版比较清晰一些. http://download.csdn.net/detail/jack__chiang/9810532 此笔记是作者本人去年开始从一个DBA新人的学习笔记,积累至今,希望拿出来给那些对DBA有兴趣的童孩学习,大家一起努力嘛. 此笔记记录了作者工作学习中从零基础的学习的记录,和从中遇见的问题与问题的解决!很高兴

thinkphp学习笔记9—自动加载

原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\Util\Auth类: namespace Org\Util; class Auth { } 保存到ThinkPHP/Library/Org/Util/Auth.class.php 这样我们就可以直接实例化了, new \Org\Util\Auth(); 实例化之后系统会自动加载 ThinkPHP/

Java中jqGrid 学习笔记整理——进阶篇(二)_java

相关阅读: Java中jqGrid 学习笔记整理--进阶篇(一) 本篇开始正式与后台(java语言)进行数据交互,使用的平台为 JDK:java 1.8.0_71 myEclisp 2015 Stable 2.0 Apache Tomcat-8.0.30 Mysql 5.7 Navicat for mysql 11.2.5(mysql数据库管理工具) 一.数据库部分 1.创建数据库 使用Navicat for mysql创建数据库(使用其他工具或直接使用命令行暂不介绍) 2. 2.创建表 双击打

kali linux web渗透测试学习笔记

    kali linux web渗透测试学习笔记 metasploit使用方法: 启动: 第一步:启用Postgresql服务.service postgresql start 第二步:启用metasploit服务.service matasploit start 第三步:启动框架.msfconsole 一个ASP站点的sql注入 测试数字型注入点 1.网址:asp?ID+13,后面加',看看是什么数据库,然后输入1=1,1=2,得到数据库是microsoft acess 2.转用sqlma