bytebuffer

Java 字符集,编码、解码

半世苍凉 提交于 2020-02-01 02:59:59
1、 计算机中文件、数据底层都是基于二进制的。 计算机底层并没有文本文件、图片文件之分,它只是记录着每个文件的二进制序列。 字符集:包含着字符和二进制序列之间的对应关系,一个字符对应一个二进制序列。 编码(Encode):把人能看懂的明文转换为计算机能理解二进制序列。 解码(Decode):把计算机中的二进制序列转换为人能看懂的明文。 乱码:解码方式与编码方式不同,即编码、解码使用的字符集不一致。 Windows中文本文件的默认字符集是GBK。 2、 字节的文件输出流可以指定写入模式: FileOutputStream fos=new FileOutputStream(String/File file); FileOutputStream fos=new FileOutputStream(String/File file,boolean b); //第二个参数指定是否是追加模式,true——追加,false——覆盖。 字符的文件流可以指定字符集: FileWriter fw=new FileWriter(String/File file);FileReader fr=new FileReader(String/File file); //指定字符集FileWriter fw=new FileWriter(String/File file, String/Charset

Java I/O体系原理

℡╲_俬逩灬. 提交于 2020-01-29 00:20:15
基础概念 在介绍I/O原理之前,先重温几个基础概念: (1) 操作系统与内核 操作系统:管理计算机硬件与软件资源的系统软件内核:操作系统的核心软件,负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,为应用程序提供对计算机硬件的安全访问服务 2 内核空间和用户空间 为了避免用户进程直接操作内核,保证内核安全,操作系统将内存寻址空间划分为两部分:内核空间(Kernel-space),供内核程序使用用户空间(User-space),供用户进程使用 为了安全,内核空间和用户空间是隔离的,即使用户的程序崩溃了,内核也不受影响 3 数据流 计算机中的数据是基于随着时间变换高低电压信号传输的,这些数据信号连续不断,有着固定的传输方向,类似水管中水的流动,因此抽象数据流(I/O流)的概念:指一组有顺序的、有起点和终点的字节集合, 抽象出数据流的作用:实现程序逻辑与底层硬件解耦,通过引入数据流作为程序与硬件设备之间的抽象层,面向通用的数据流输入输出接口编程,而不是具体硬件特性,程序和底层硬件可以独立灵活替换和扩展 I/O 工作原理 1 磁盘I/O 典型I/O读写磁盘工作原理如下: tips: DMA:全称叫直接内存存取(Direct Memory Access),是一种允许外围设备(硬件子系统)直接访问系统主内存的机制。基于 DMA 访问方式,系统主内存与硬件设备的数据传输可以省去CPU

netty-ByteBuf

送分小仙女□ 提交于 2020-01-28 17:12:23
一,ByteBuf简介 在原生Java NIO中,应用程序和channel输入输出数据都是通过ByteBuffer进行的。但是原生Java NIO中ByteBuffer的使用非常不方便,首先在对它进行写入的时候不能动态地进行扩容,需要应用者自己显示扩容。其次它没有读写索引的概念,从写模式切换到读模式需要显示调用flip()方法,对使用者的要求比较高,同时它也没有内存池的概念,内存无法复用。 基于此,netty对ByteBuffer做了优化,提出了自己的ByteBuf,它具有如下几个优点: 1.1,引入读写指针 1.2,写入可以动态扩容,使用者无需关心 1.3,引入内存池提高内存利用率;提高内存分配释放速度, 减少GC发生频率 下面先从整体上讲解一下ByteBuf的设计: 标题 如上图所示,ByteBuf中有四个核心的索引点,分别解释如下: ByteBuf核心索引介绍 索引英文名称 索引中文名称 索引解释 readerIndex 读索引 可以读取的第一个字节索引 writerIndex 写索引 可以写入的第一个字节索引 capacity 缓冲区当前容量 缓冲区的当前容量大小 maxCapacity 缓冲区最大容量 缓冲区最大容量,写入的时候不能超过该大小 [0 , writerIndex)之间的字节空间为已经被写入的字节空间 [0 , readerIndex

直接内存(Direct Memory)牛刀小试

[亡魂溺海] 提交于 2020-01-28 04:56:51
Direct Memory 特点 常见于NIO操作时,用于数据缓存 分配回收成本较高,但是读写性能高 不受JVM内存回收管理 案例说明 为了做对比,还是直接写一段程序测试: import java . io . File ; import java . io . FileInputStream ; import java . io . FileOutputStream ; import java . io . IOException ; import java . nio . ByteBuffer ; import java . nio . channels . FileChannel ; /** * 直接内存的读写测试 */ public class Jvm1_9 { static final String fromFile = "/tmp/12GB.dat" ; static final String toFile = "/tmp/12GB_new.dat" ; //mkfile -n 12g /tmp/12GB.dat static final int _256M = 256 * 1024 * 1024 ; public static void main ( String [ ] args ) { io ( ) ; directBuffer ( ) ; } public

Netty序章之BIO NIO AIO演变

扶醉桌前 提交于 2020-01-26 08:31:57
netty是什么     Netty是一个基于Java NIO的client-server网络服务框架,人们可以利用netty快速地开发网络应用。同时netty相对于其他网络框架更加简单并且扩展性更强,这主要得益于其提供的简单易用的api将业务逻辑和网络处理代码解耦开来。能够使你更加专注于业务的实现而不需要太多关心网络底层实现。 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发 高性能 、 高可靠 的网络服务器和客户端程序。Netty简化了网络程序的开发,是很多框架和公司都在使用的技术。更是面试的加分项。Netty并非横空出世,它是在BIO,NIO,AIO演变中的产物,是一种NIO框架。而BIO,NIO,AIO更是笔试中要考,面试中要问的技术。也是一个很好的加分项 流程图: 技术:BIO,NIO,AIO 说明:github上有更全的源码。 源码: https://github.com/ITDragonBl... BIO BIO 全称Block-IO 是一种 阻塞同步 的通信模式。我们常说的Stock IO 一般指的是BIO。是一个比较传统的通信方式, 模式简单 , 使用方便 。但 并发处理能力低 , 通信耗时 , 依赖网速 。 BIO 设计原理: 服务器通过一个Acceptor线程负责监听客户端请求和为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式

NIO之分散与聚集

≡放荡痞女 提交于 2020-01-26 01:03:27
分散和聚集的理解 分散读取 是指从Channel中读取的数据“分散”到多个buffer中 注:按照缓冲区的顺序,从Channel中读取的数据依次将buffer填满 代码实现如下 1 @Test 2 public void test5 () throws Exception { 3 RandomAccessFile rw = new RandomAccessFile( "src/test/java/1.txt" , "rw" ); 4 5 // 获取通道 6 FileChannel channel = rw.getChannel(); 7 8 // 分配指定大小的缓冲区 9 ByteBuffer buf1 = ByteBuffer.allocate( 100 ); 10 ByteBuffer buf2 = ByteBuffer.allocate( 1024 ); 11 12 // 分散读取 13 ByteBuffer[] bufs = {buf1, buf2}; 14 channel.read(bufs); 15 16 // 切换为读模式 17 for (ByteBuffer byteBuffer : bufs) { 18 byteBuffer.flip(); 19 } 20 21 System.out.println( new String(bufs[ 0 ].array(), 0

【Java TCP/IP Socket】基于NIO的TCP通信(含代码)

青春壹個敷衍的年華 提交于 2020-01-25 10:50:59
NIO主要原理及使用 NIO采取通道(Channel)和缓冲区(Buffer)来传输和保存数据,它是非阻塞式的I/O,即在等待连接、读写数据(这些都是在一线程以客户端的程序中会阻塞线程的操作)的时候,程序也可以做其他事情,以实现线程的异步操作。 考虑一个即时消息服务器,可能有上千个客户端同时连接到服务器,但是在任何时刻只有非常少量的消息需要读取和分发(如果采用线程池或者一线程一客户端方式,则会非常浪费资源),这就需要一种方法能阻塞等待,直到有一个信道可以进行I/O操作。NIO的Selector选择器就实现了这样的功能,一个Selector实例可以同时检查一组信道的I/O状态,它就 类似一个观察者,只要我们把需要探知的SocketChannel告诉Selector,我们接着做别的事情,当有事件(比如,连接打开、数据到达等)发生时,它会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的SocketChannel,然后,我们从这个Channel中读取数据,接着我们可以处理这些数据。 Selector内部原理实际是在做一个对所注册的Channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个Channel有所注册的事情发生,比如数据来了,它就会读取Channel中的数据,并对其进行处理。 要使用选择器,需要创建一个Selector实例

java网络通信:异步非阻塞I/O (NIO)

。_饼干妹妹 提交于 2020-01-25 10:19:23
首先是channel,是一个双向的全双工的通道,可同时读写,而输入输出流都是单工的,要么读要么写。Channel分为两大类,分别是用于网络数据的SelectableChannel和用于文件操作的FileChannel。 注意:在java NIO库中,所有的数据都是用缓冲区处理,常用的是ByteBuffer。 多路复用器Selector: Selector会不断轮询注册在其上的Channel,如果某个Channel上又新的连接接入、读和写事件,这个Channel就处于就绪状态,通过SelectorKey可以获取就绪Channel的集合。底层使用了epoll()实现,没有最大连接句柄的限制。 服务端代码: public class TimeServer { public static void main(String[] args) throws IOException { int port = 8080; MultiplexerTimeServer timeServer = new MultiplexerTimeServer(port); new Thread(timeServer, "NIO-MultiplexerTimeServer-001").start(); } } public class MultiplexerTimeServer implements Runnable

Java新NIO中的ByteBuffer

一世执手 提交于 2020-01-25 07:32:53
1. ByteBuffer中的参数position、limit、capacity、mark含义: position:表示当前指针的位置(下一个要操作的数据元素的位置) limit:表示当前数组最大的使用量,即有效位置的EOF位置(缓冲区数组中不可操作的下一个元素的位置,limit<=capacity) capacity:表示缓冲区最大容量(缓冲区数据的总长度) mark:用于记录当前position的前一个位置或者默认是-1 2. ByteBuffer中常用方法含义: reset():把position设置为mark的值,相当于之前做过一个标记,现在回退到之前标记的地方。 clear():将参数设置为position=0,limit=capacity,mark=-1,类似于初始化,但并不影响底层byte数组的内容(注意:clear只是把指针移到位置0,并没有真正清空数据)。 flip():将参数设置为limit=position,position=0,mark=-1,翻转,即将未翻转之前0到position之间的数据放置到翻转之后的position(即0)到limit之间的这块区域,翻转将缓冲区的状态由存数据变为准备取数据(注意:将当前位置设置为EOF,指针位置指向0)。 rewind():将参数设置为position=0,mark=-1,limit的值不变(注意:指针指向0)。

Netty序章之BIO NIO AIO演变

喜夏-厌秋 提交于 2020-01-25 03:48:15
Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发 高性能 、 高可靠 的网络服务器和客户端程序。Netty简化了网络程序的开发,是很多框架和公司都在使用的技术。更是面试的加分项。Netty并非横空出世,它是在BIO,NIO,AIO演变中的产物,是一种NIO框架。而BIO,NIO,AIO更是笔试中要考,面试中要问的技术。也是一个很好的加分项,加分就是加工资,你还在等什么?本章带你细细品味三者的不同! 流程图: 技术:BIO,NIO,AIO 说明:github上有更全的源码。 源码:https://github.com/ITDragonBlog/daydayup/tree/master/Netty/socket-io BIO BIO 全称Block-IO 是一种 阻塞同步 的通信模式。我们常说的Stock IO 一般指的是BIO。是一个比较传统的通信方式, 模式简单 , 使用方便 。但 并发处理能力低 , 通信耗时 , 依赖网速 。 BIO 设计原理: 服务器通过一个Acceptor线程负责监听客户端请求和为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式。若客户端数量增多,频繁地创建和销毁线程会给服务器打开很大的压力。后改良为用线程池的方式代替新增线程,被称为伪异步IO。 服务器提供IP地址和监听的端口