有关Android NIO我们主要分为三大类,ByteBuffer、FileChannel和SocketChannel。由于篇幅原因今天Android123只对前两个做说明。NIO和传统的I/O比较大的区别在于传输方式非阻塞,一种基于事件驱动的模式,将会使方法执行完后立即返回,传统I/O主要使用了流Stream的方式,而在New I/O中,使用了字节缓存ByteBuffer来承载数据。
ByteBuffer位于java.nio包中,目前提供了Java基本类型中除Boolean外其他类型的缓冲类型,比如ByteBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer和ShortBuffer 。同时还提供了一种更特殊的映射字节缓冲类型MappedByteBuffer。在传统IO的输入输出流中,InputStream中只提供了字节型或字节数组的访问对应NIO就是ByteBuffer,但是处理传统的DataInputStream的int等类型,就是IntBuffer,但是缓冲类型并没有提供UTF这样的类型处理,所以我们仍然需要使用ByteBuffer处理字符串,但是NIO提供了一个封装的类在java.nio.charset包中,通过字符的编码CharsetEncoder和解码CharsetDecoder类来处理字符串,同时这些类可以方便转换编码比如GBK或UTF等等。
一、ByteBuffer类
1) 实例化
直接使用ByteBuffer类的静态方法static ByteBuffer allocate(int capacity) 或 static ByteBuffer allocateDirect(int capacity) 这两个方法来分配内存空间,两种方法的区别主要是后者更适用于繁复分配的字节数组。而 put(ByteBuffer src) 可以从另一个ByteBuffer中构造,也可以通过wrap方法从byte[]中构造,具体参考下面的类型转化内容。
2) 类型转化
ByteBuffer可以很好的和字节数组byte[]转换类型,通过执行ByteBuffer类的final byte[] array() 方法就可以将ByteBuffer转为byte[]。从byte[]来构造ByteBuffer可以使用wrap方法,目前Android或者说Java提供了两种重写方法,比如为static ByteBuffer wrap(byte[] array) 和 static ByteBuffer wrap(byte[] array, int start, int len) ,第二个重载方法中第二个参数为从array这个字节数组的起初位置,第三个参数为array这个字节数组的长度。
3) 往ByteBuffer中添加元素
目前ByteBuffer提供了多种put重写类型来添加,比如put(byte b) 、putChar(char value) 、putFloat(float value) 等等,需要注意的是,按照Java的类型长度,一个byte占1字节,一个char类型是2字节,一个float或int是4字节,一个long则为8字节,和传统的C++有些区别。所以内部的相关位置也会发生变化,同时每种方法还提供了定位的方法比如ByteBuffer put(int index, byte b)
4) 从ByteBuffer中获取元素
同上面的添加想法,各种put被换成了get,比如byte get() 、float getFloat() ,当然了还提供了一种定位的方式,比如double getDouble(int index)
5) ByteBuffer中字节顺序
对于Java来说默认使用了BIG_ENDIAN方式存储,和C正好相反的,通过
final ByteOrder order() 返回当前的字节顺序。
final ByteBuffer order(ByteOrder byteOrder) 设置字节顺序,ByteOrder类的值有两个定义,比如LITTLE_ENDIAN、BIG_ENDIAN,如果使用当前平台则为ByteOrder.nativeOrder()在Android中则为 BIG_ENDIAN,当然如果设置为order(null) 则使用LITTLE_ENDIAN。
二、FileChannel类
在NIO中除了Socket外,还提供了File设备的通道类,FileChannel位于java.nio.channels.FileChannel包中,在Android SDK文档中我们可以方便的找到,对于文件复制我们可以使用ByteBuffer方式作为缓冲,比如
String infile = "/sdcard/cwj.dat";
String outfile = "/sdcard/android123-test.dat";
FileInputStream fin = new FileInputStream( infile );
FileOutputStream fout = new FileOutputStream( outfile );
FileChannel fcin = fin.getChannel();
FileChannel fcout = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate( 1024 ); //分配1KB作为缓冲区
while (true) {
buffer.clear(); //每次使用必须置空缓冲区
int r = fcin.read( buffer );
if (r==-1) {
break;
}
buffer.flip(); //写入前使用flip这个方法
fcout.write( buffer );
}
flip和clear这两个方法是java.nio.Buffer包中,ByteBuffer的父类是从Buffer类继承而来的,这点Android123要提醒大家看Android SDK文档时注意Inherited Methods,而JDK的文档就比较直接了,同时复制文件使用FileChannel的transferTo(long position, long count, WritableByteChannel target) 这个方法可以快速的复制文件,无需自己管理ByteBuffer缓冲区。明天Android开发网介绍NIO主要的Socket相关的内容。
相关推荐
### Android开发进阶之NIO非阻塞包 #### NIO非阻塞通讯方式解析 在探讨Android DDMS源码中的NIO(Non-blocking I/O)非阻塞通讯方式时,我们首先需要理解NIO的基本概念及其在Android开发中的应用。 **NIO简介**:...
### Android开发进阶之NIO非阻塞包 #### 关键知识点概述 1. **NIO(New I/O)的概念**:NIO是Java 1.4版本开始引入的新I/O处理模型,它通过非阻塞的方式提高了I/O操作的性能。在Android开发中,利用NIO可以显著...
总的来说,Android开发中的NIO技术提供了高性能、非阻塞的网络通信解决方案,有效地解决了多线程管理和资源消耗的问题。它不仅简化了并发编程,也提升了Android应用程序在网络通信方面的效率。对于Android开发者来说...
8. **Java NIO**:非阻塞I/O操作在Java中的实现与应用。 9. **Java Web基础**:涵盖前端脚本语言、框架等基础知识。 10. **JavaScript DOM视频**:了解网页元素的操作与控制。 11. **jQuery视频**:简化HTML文档遍历...
Java的IO系统分为传统IO和NIO(非阻塞IO)。RandomAccessFile允许随机访问文件,而NIO引入了通道和缓冲区,提高了数据传输效率。异常处理是程序健壮性的关键,Java的异常分为检查异常和运行时异常,理解异常的层次...
I/O流处理和NIO(非阻塞I/O)对于读写文件和网络通信至关重要。线程与并发编程是Java的强项,涉及线程同步、死锁避免、并发工具类(如Semaphore、CountDownLatch)等内容。 再者,Java EE(企业版)是Java在服务器...
5. **IO/NIO**:Java的I/O系统升级到NIO(非阻塞I/O),Channel、Buffer和Selector的使用。 6. **网络编程**:Socket编程,实现客户端和服务端的通信。 7. **枚举与注解**:枚举类型的使用,注解的定义和应用,以及...
对于IO流,理解输入输出处理,文件操作,以及NIO(非阻塞I/O)的概念也是必要的。 进一步,深入研究Java的反射机制,它允许我们在运行时动态地获取类的信息并调用其方法。还要学习Java的泛型,它提供了类型安全的...
- **网络I/O**:阻塞I/O、非阻塞I/O、NIO(New I/O)等。 - **JVM内存管理**: - **堆和栈**:理解它们的区别及其在程序中的作用。 - **垃圾回收**:GC算法、堆内存分区(如Young区、Old区)等。 - **性能调优*...
3. NIO(New Input/Output):提供非阻塞I/O,适用于高性能网络通信,如SocketChannel、Selector和Buffer。 六、网络编程 1. Socket编程:通过ServerSocket和Socket实现客户端-服务器通信,理解TCP和UDP协议的区别...
- **IO流与NIO**:文件操作,网络通信,以及非阻塞I/O模型。 - **多线程**:线程同步、死锁避免以及并发工具类的使用。 - **集合框架**:ArrayList、LinkedList、HashMap等数据结构的使用和实现原理。 - **反射...
7. **IO与NIO**:包括旧的I/O模型和新的非阻塞I/O模型,有助于优化读写操作。 8. **Java Swing和JavaFX**:介绍图形用户界面的构建,用于开发桌面应用。 9. **JDBC**:讲解如何连接数据库,执行SQL语句,处理结果...
学习者还需要熟悉集合框架,如ArrayList、LinkedList、HashMap等,以及IO流和NIO(非阻塞I/O)系统,这些用于数据的输入输出和文件操作。 在高级主题中,线程和并发处理是Java的一大亮点,理解如何创建和管理线程,...
* Java 高级知识:Annotation、IO 和 NIO、AIO、多线程、线程池、阻塞、非阻塞、异步网络通信、反射、动态代理 二、JDBC 编程 * SQL 基础:基础 SQL 语句、基本查询、多表查询、子查询、结果集的交、并、差运算 * ...
3. **I/O流**:`java.io`包提供了丰富的流处理类,通过源码我们可以学习如何进行数据的读写,了解缓冲流、字符流与字节流的区别,以及NIO(非阻塞I/O)的实现。 4. **集合框架**:Java集合框架是数据结构和算法的...
- **NIO.2**:增加了文件系统操作的API,增强了非阻塞I/O能力。 - **Scripting API**:允许在Java应用程序中嵌入和使用脚本语言,如JavaScript。 - **Java Database Connectivity (JDBC) 4.0**:改进了数据库连接...
进阶课程包括JUC并发编程、NIO非阻塞I/O等,帮助开发者提升性能优化能力。 JavaWeb阶段,尚硅谷提供JavaScript DOM编程、jQuery、Ajax等前端技术教程,以及JavaWeb核心技术和企业级项目实战,如Servlet、JSP、MVC...
5. **IO流与NIO**:第六章可能涵盖输入输出流(IO)和非阻塞I/O(NIO)的概念,学习者将学会如何读写文件,网络通信,以及高效处理数据流。 6. **多线程编程**:第七章将讲解并发编程,包括线程的创建、同步机制...