这一章节我们来讨论一些nio的数据转换。

上面一章节我们提到ByteBuffer,可是他是面向二进制数据,对于编程来说不是非常方便,因此,java添加了转换数据的工具。

1.asCharBuffer

package com.ray.ch16;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel; public class Test { public static void main(String[] args) throws IOException {
String path = "d://123.txt";
FileOutputStream fileOutputStream = new FileOutputStream(path);
FileChannel fileChannel = fileOutputStream.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(24);
buffer.asCharBuffer().put("welcome");//在这里能够方便的使用String就能够把元素放到缓冲区
while (buffer.hasRemaining()) {
fileChannel.write(buffer);
}
fileChannel.close(); FileInputStream fileInputStream = new FileInputStream(path);
fileChannel = fileInputStream.getChannel();
fileChannel.read(buffer);
buffer.flip();
System.out.println(buffer.asCharBuffer());
fileChannel.close();
}
}

输出:

welcome(事实上后面另一些乱码,这里显示不出来)

注意:这里的乱码事实上是剩余的字符,welcome使用了14个字符,剩余的10个字符也会产生,然后打印出来。 我们在详细的文件中面就能够看见,welcome后面还跟着一堆空格。

2.控制输出输入的编码

package com.ray.ch14;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel; public class Test {
public static void main(String[] args) throws IOException {
String path = "d://123.txt";
FileOutputStream fileOutputStream = new FileOutputStream(path);
FileChannel fileChannel = fileOutputStream.getChannel();
ByteBuffer buffer = ByteBuffer.wrap("hello world".getBytes("UTF-8"));//控制输入的编码
fileChannel.write(buffer);
fileChannel.close();
fileOutputStream.close(); System.out.println(System.getProperty("file.encoding")); FileInputStream fileInputStream = new FileInputStream(path);
fileChannel = fileInputStream.getChannel();
fileChannel.read(buffer);
buffer.flip();
System.out.println(buffer.asCharBuffer());
fileChannel.close();
fileInputStream.close(); }
}

输出:

GBK
桥汬漠睯牬

因为我当前的编码是GBK。因此输出的时候发生乱码。

以下是我改动过的代码:

package com.ray.ch14;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset; public class Test {
public static void main(String[] args) throws IOException {
String path = "d://123.txt";
FileOutputStream fileOutputStream = new FileOutputStream(path);
FileChannel fileChannel = fileOutputStream.getChannel();
ByteBuffer buffer = ByteBuffer.wrap("hello world".getBytes("UTF-8"));
fileChannel.write(buffer);
fileChannel.close();
fileOutputStream.close(); System.out.println(System.getProperty("file.encoding")); FileInputStream fileInputStream = new FileInputStream(path);
fileChannel = fileInputStream.getChannel();
fileChannel.read(buffer);
buffer.flip();
String encoding = "UTF-8";
System.out.println(Charset.forName(encoding).decode(buffer));//这里使用跟上面同样的编码解码
fileChannel.close();
fileInputStream.close(); }
}

输出:

GBK
hello world

哪怕我的默认编码是GBK。可是也能够解码出原来的字符串。

总结:这一章节介绍nio的asCharBuffer和编码的控制。

这一章节就到这里。谢谢。

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

文件夹

从头认识java-16.5 nio的数据转换的更多相关文章

  1. JAVA中的NIO (New IO)

    简介 标准的IO是基于字节流和字符流进行操作的,而JAVA中的NIO是基于Channel和Buffer进行操作的. 传统IO graph TB; 字节流 --> InputStream; 字节流 ...

  2. Java BIO、NIO与AIO的介绍(学习过程)

    Java BIO.NIO与AIO的介绍 因为netty是一个NIO的框架,所以在学习netty的过程中,开始之前.针对于BIO,NIO,AIO进行一个完整的学习. 学习资源分享: Netty学习:ht ...

  3. 官方正式发布 Java 16

    前言 就在2021/03/16,官方正式发布了Java 16.我们可以下载使用Java 16了. 特性 向量API(孵化) 在运行期,Vector 表示向量计算可以可靠地编译成支持CPU架构上的最佳矢 ...

  4. Java 16 新功能介绍

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 程序猿阿朗博客 已经收录,有很多知识点和系列文章. Ja ...

  5. Java Socket(3): NIO

    NIO采取通道(Channel)和缓冲区(Buffer)来传输和保存数据,它是非阻塞式的I/O,即在等待连接.读写数据(这些都是在一线程以客户端的程序中会阻塞线程的操作)的时候,程序也可以做其他事情, ...

  6. 【JAVA】【NIO】3、Java NIO Channel

    Java NIO和流量相似,但有些差异: ·通道可读写,流仅支持单向.读或写 ·异步通道读取 ·通道读写器,他们是和Buffer交替 道的实现 下面是Java NIO中最重要的通道的实现: ·File ...

  7. 【JAVA】【NIO】5、Java NIO Scatter / Gather

    标题手段Java NIO该分散体浓缩 Java NIO内置支持分散与收集.的概念主要用于信道分散聚集的读写. 读出的分散体的一个通道被读多个数据buffer在.因此.数据分散到多个buffer中. 对 ...

  8. Java中的NIO基础知识

    上一篇介绍了五种NIO模型,本篇将介绍Java中的NIO类库,为学习netty做好铺垫 Java NIO 由3个核心组成,分别是Channels,Buffers,Selectors.本文主要介绍着三个 ...

  9. Java的BIO,NIO和AIO的区别于演进

    作者:公众号:我是攻城师 前言 Java里面的IO模型种类较多,主要包括BIO,NIO和AIO,每个IO模型都有不一样的地方,那么这些IO模型是如何演变呢,底层的原理又是怎样的呢? 本文我们就来聊聊. ...

随机推荐

  1. linux学习(34):except的安装

    expect据说是交互性很强的脚本语言,但是expect依赖于tcl,但linux系统里一般不自带安装tcl,需要手动安装 expect版本 5.43 http://download.chinauni ...

  2. hdoj1069 Monkey and Banana

    Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  3. Oracle PLSQL Demo - 11.定义包头[Define PACKAGE]

    CREATE OR REPLACE PACKAGE temp_package_demo is v_demo ); PROCEDURE p_demo_1(userid NUMBER DEFAULT v_ ...

  4. Apache Commons Lang的StringUtils.isEmpty(STR)和StringUtils.isBlank(STR)

    Apache Commons Lang是常用的基础框架,其中字符串判空在项目中尤为常用,而自己常常忘记他们的区别. package com.nicchagil.test; import org.apa ...

  5. LeetCode: Median of Two Sorted Arrays 解题报告

    Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...

  6. lambda续集——2

    隐式捕获: 出了显式列出我们希望使用的来自函数的变量外,还可以让编译器根据lambda体中的代码来推断我们要使用哪些变量.为了指示编译器推断捕获列表,应在捕获列表中写一个&或=.&告诉 ...

  7. 基于jplayer实现歌词同步的JS音乐播放器效果

    分享一款基于jplayer实现歌词同步的JS音乐播放器效果.这是一款基于jQuery实现的音乐播放器功能代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <textare ...

  8. Ubuntu下安装Apache

    Ubuntu为我们提供了 su apt-get install 命令,通过它你可以很方便地安装一些软件,这些软件是放在Ubuntu放置在各个地方的服务器上面,如果你想安装的软件是比较常见的,一般都可以 ...

  9. inux内存映射和共享内存理解和区别

    可以看到内存映射中需要的一个参数是int fd(文件的标识符),可见函数是通过fd将文件内容映射到一个内存空间, 我需要创建另一个映射来得到文件内容并统计或修改,这时我创建这另一个映射用的仍是mmap ...

  10. innobackupex参数之 --throttle 限速这个值设置多少合理 原创

    innobackupex参数之--parallel --throttle--parallel 此参数用于开启多个子进程并发备份多个数据文件(注意,一个数据文件只会有一个进程完成备份).可以加快备份速度 ...