`
小骏向前冲
  • 浏览: 18292 次
社区版块
存档分类
最新评论

使用Charset和buffer时需要注意的一个小问题

阅读更多
我们经常使用Charset指定字符集用来在CharBuffer和ByteBuffer之间进行转换,但在这个过程有个小问题是需要注意的。
buffer有三个指针变量:position,limit,capacity,position指向当前位置,limit之后的位置都是不可读写的,capacity代表这个buffer的容量,它们间的关系是:
0<=postion<=limit<=capacity
buffer提供了多个方法来改变这几个指针变量,这里介绍最常用的postion(),limit(),capacity(),flip()和clear();
前面三个很明显是分别指定三个指针变量的位置了,至于flip(),它的作用相当于limit(position);
position(0);
即让limit指向当前已读/写的位置,让后面的数据都不可读写,然后让position指向开始位置;而clear()并非把数据全部清零,它的作用相当于
limit(capacity);
position(0);
clear()与flip()的唯一区别是前者让所有数据重新可读写(并不擦除之前的数据),后者指定当前位置之后的数据都不可读写,我们一般在读/写完成后flip(),需要重新读写前clear();

看下面的代码:
public class CharsetTransform {
public static void main(String[] args) {
Charset cn = Charset.forName("GBK");

CharBuffer cbuff = CharBuffer.allocate(8);
cbuff.put("小");
cbuff.put("精");
cbuff.put("灵");
cbuff.flip();
ByteBuffer bbuff = cn.encode(cbuff);
for (int i = 0; i < bbuff.capacity(); i++) {
System.out.print(bbuff.get() + " ");
}
bbuff.flip();
System.out.println("\n" + cn.decode(bbuff).toString());
}
}

红色代码flip()把position重新指定为0,如果不这样做,代码中的encode/decode后的字符串是空的,因为当前position后并无内容。
分享到:
评论

相关推荐

    jdk jdk jdk

    在使用 NIO API 时,需要注意 Buffer 的 thread-safe 问题。Buffer 及其子类都不是线程安全的,因此需要小心地使用锁机制来保护 Buffer 的访问。在实际应用中,我们通常使用多个 Buffer 来避免线程安全问题。 NIO ...

    Java-NIO类库Selector机制解析.docx

    解决这个问题需要了解Selector.open()方法的内部机制和Java虚拟机对操作系统调用的影响。 八、总结 Java NIO类库提供了高效的I/O操作模式,Selector机制是NIO类库中的核心机制。了解Java NIO类库和Selector机制...

    使用Java NIO编写高性能的服务器.doc

    【Java NIO简介】 Java NIO(New IO)是从JDK 1.4开始引入的一个新特性,它提供了一种不同于传统IO流的非阻塞I/O操作...然而,正确使用NIO也需要关注潜在的问题,如CPU占用率过高和线程阻塞,合理设计和优化是关键。

    C语言将文件数据读入内存

    `check()`函数首先将文件内容重新读取到一个缓冲区,然后用`strcmp()`比较内存中的数据和文件内容,如果两者相等,则返回0表示成功。 在实际项目中,我们可能还需要考虑错误处理、内存释放等细节。当不再需要数据时...

    Java常见问题集锦

    - 使用此函数时,还需要确保JDBC驱动程序能够正确识别和处理地址转换。 #### 5. Servlet输出HTML页面时字符编码问题 - **问题描述**:在Servlet中输出HTML页面时,如何确保页面中的中文字符能够正常显示? - **...

    使用gridview生成excel文件

    - 当生成Excel文件时,需要注意编码问题,确保数据正确显示,避免乱码。 - Excel文件的格式化,比如单元格样式、合并单元格、添加表头等,可能需要更复杂的HTML输出或者使用第三方库如EPPlus来实现。 - 对于大...

    java判断文件编码

    请注意,这只是一个示例,实际的`FileCharsetDetector`类和方法可能需要根据源代码的具体实现进行调整。 在处理文件编码时,还要考虑到一些常见的问题,如BOM(Byte Order Mark)标记、编码不兼容问题、以及错误的...

    JAVA解压ZIP文件(可解压中文)

    在解压ZIP文件时,首先需要创建一个`FileInputStream`对象来读取ZIP文件,然后通过`new ZipInputStream(fileInputStream)`创建一个`ZipInputStream`对象。接下来,我们可以通过调用`ZipInputStream`的`getNextEntry...

    java zipentry.jar 解决解压失败问题

    ZIP是一种广泛使用的档案格式,它允许将多个文件和目录打包成一个单一的文件,以便于存储和传输。ZIP文件内部通常使用UTF-8编码来存储文件名和路径,但并非所有ZIP工具都遵循这个标准,有的可能使用本地操作系统默认...

    超级有影响力霸气的Java面试题大全文档

    Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应...

    JAVA解压缩ZIP压缩文件(含中文名文件)完整DEMO

    为了解决这个问题,我们需要确保使用正确的字符编码,通常是`"GBK"`或`"UTF-8"`。 - 使用`Charset.forName("UTF-8")`设置输入流和输出流的字符编码。 4. **完整DEMO步骤**: 1. 创建`FileInputStream`,传入ZIP...

    C#自动拨号【ADSL】【源代码】

    在某些应用场景下,如服务器自动重连网络等,可能需要开发一个自动拨号程序来实现ADSL连接的自动化管理。本篇文章将基于C#语言介绍如何实现ADSL的自动拨号功能,并提供相应的源代码。 ### 二、核心概念与原理 ####...

    nio.rar_Java识别_java nio

    请注意,这个示例只是一个基础的框架,实际的字符集识别可能需要更复杂的算法,比如使用字节序分析、频率统计等方法。此外,由于Java的标准库不提供自动字符集检测,使用第三方库可能会更方便、更准确。

    文件下载,二进制流转换成文件 解决中文名乱码的问题

    当一个文件被读取或写入时,实际上是将其转换为二进制流来进行操作的。在.NET框架中,可以通过`FileStream`、`BinaryReader`等类来处理文件的读写操作。而在本例中,代码片段展示了如何使用二进制流来实现文件下载...

    js中文汉字转为Gb2312

    在JavaScript中,将中文汉字转换为GBK(GB2312)编码是一个常见的需求,特别是在处理与老式系统或浏览器兼容性问题时。GBK是中国大陆广泛使用的简体中文字符集,它扩展了GB2312,包含了更多的汉字和符号。在...

    Java.NIO资源下载资源下载

    - **面向对象的文件 grep**:通过一个具体的示例展示了如何使用 Java 正则表达式进行文件搜索。 #### 5. 字符集 - **字符集基础**:介绍了字符集的基本概念和重要性。 - **Charsets**:详细讨论了 Java 中支持的...

    从android客户端传一个文件到服务端【使用httpurl】

    在Android开发中,将文件从客户端上传到服务器是常见的需求,尤其...在压缩包文件"postFile"中,可能包含了一个简单的示例代码或者相关辅助工具类,供开发者参考和学习。实际开发时,可以根据具体需求进行调整和优化。

    Struts2 下载文件不同浏览器兼容问题.doc

    在Struts2框架中,开发Web应用时可能会遇到一个常见的问题,那就是下载文件时不同浏览器的兼容性问题。这个问题主要体现在文件下载时显示的文件名不是预期的文件名,而是action的名字。这个问题的根源在于各个浏览器...

    Linux中文乱码问题.rar

    在Linux系统中,中文字符的显示乱码是一个常见的问题,特别是在处理文本文件、终端输出或者在多语言环境下的系统配置时。这个问题涉及到字符编码、locale设置以及文本编辑器的兼容性等多个方面。以下是对这个主题的...

    android UDP socket通讯,演示demo

    1. **创建DatagramSocket**:首先,我们需要创建一个DatagramSocket实例来发送和接收数据。这个过程通常在后台线程中执行,因为网络操作可能阻塞主线程。 ```java DatagramSocket socket = new DatagramSocket(); `...

Global site tag (gtag.js) - Google Analytics