bytebuffer

ByteBuffer常用方法详解

不羁的心 提交于 2020-01-15 21:08:46
缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区: 使用缓冲区有这么两个好处: 1、减少实际的物理读写次数 2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数 举个简单的例子,比如A地有1w块砖要搬到B地 由于没有工具(缓冲区),我们一次只能搬一本,那么就要搬1w次(实际读写次数) 如果A,B两地距离很远的话(IO性能消耗),那么性能消耗将会很大 但是要是此时我们有辆大卡车(缓冲区),一次可运5000本,那么2次就够了 相比之前,性能肯定是大大提高了。 而且一般在实际过程中,我们一般是先将文件读入内存,再从内存写出到别的地方 这样在输入输出过程中我们都可以用缓存来提升IO性能。 所以,buffer在IO中很重要。在旧I/O类库中(相对java.nio包)中的BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter在其实现中都运用了缓冲区。java.nio包公开了Buffer API,使得Java程序可以直接控制和运用缓冲区。 在Java NIO中,缓冲区的作用也是用来临时存储数据,可以理解为是I/O操作中数据的中转站。缓冲区直接为通道(Channel)服务

Spring MVC

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-15 08:21:40
#手写一个Spring MVC框架 ##一次浏览器请求的大致过程 Sping MVC是一个Web框架,所以我们要了解Spring MVC就要先了解一次浏览器请求到收到服务器的响应大概发生了哪些事情。 1.域名解析; 2.请求连接(三次握手); 3.浏览器发起http请求; 4.服务器解析http交给Spring MVC处理; 5.将响应的结果封装返回; ##Socket编程 了解了这个过程之后开始做一个简单的Socket编程 首先服务端代码: public class Server { public static void main ( String [ ] args ) throws IOException { //1.建立服务端 ServerSocket serverSocket = new ServerSocket ( 8080 ) ; System . out . println ( "等待链接..." ) ; //2.监听客户端连接 Socket socket = serverSocket . accept ( ) ; System . out . println ( "客户端已连接:" + socket . getInetAddress ( ) . getHostAddress ( ) ) ; try ( BufferedReader in = new

Java NIO 聊天室实例

我的梦境 提交于 2020-01-13 22:22:09
最近写了个Java NIO聊天室聊天的程序,NIO学习起来比较困难的,我的代码能给大家起到一个抛砖引玉的作用! 服务端: package test.javanio; /** * @author * @version * CreateTime:2010-12-1 下午05:12:11 * Description: */ import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Date; import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; public class MySocketServer implements Runnable { private boolean running;

BIO,NIO,AIO(NIO2)的理解

杀马特。学长 韩版系。学妹 提交于 2020-01-13 02:20:02
写在前面,这里所说的IO主要是强调的网络IO 1.BIO(同步并阻塞) 客户端一个请求对应一个线程。客户端上来一个请求(最开始的连接以及后续的IO请求),服务端新建一个线程去处理这个请求,由于线程总数是有限的(操作系统对线程总数的限制或者线程池的大小),所以,当达到最大值时给客户端的反馈就是无法响应, 阻塞体现在 服务端接收客户端 连接请求 被阻塞了,还有一种阻塞是在单线程处理某一个连接时,需要一直等待IO操作完成。 同步体现在 单个线程处理请求时 调用read(write) 方法需等待读取(写)操作完成才能返回。 2.NIO(同步非阻塞) 客户端一个IO请求对应一个线程。过程是这样的,每个客户端一开始上来的连接会注册到selector中,selector会轮询注册上来的连接是否有IO请求,如果有IO请求,就创建一个线程处理该连接上的该次请求。 非阻塞体现在 服务端能够无限量(相对于BIO)的接收客户端的连接请求。 同步体现在 单个线程处理请求时 调用read(write) 方法需等待读取(写)操作完成才能返回。这种模式下,如果后端应用处理遇到资源争夺(数据库操作)而阻塞等,为提高请求的处理速度,可以在后端设立资源池或队列等,把对应的请求数据以及现场(哪个连接的哪个请求等)放入队列,前台线程立即返回处理别的IO请求。 3.AIO(NIO2)(异步阻塞)

NIO非阻塞网络编程

十年热恋 提交于 2020-01-13 01:46:08
目录 目标 JAVA NIO Buffer缓冲区 Buffer工作原理 Buffer基本使用 ByteBuffer内存类型 Channel通道 SocketChannel ServerSocketChannel Selector选择器 NIO对比BIO 小结 目标 了解NIO、熟悉Buffer API、channel、selector,NIO+多线程 JAVA NIO NIO:new IO,非阻塞IO。 目的是为了解决替换掉IO网络编程的相关API。 Buffer缓冲区 内存块中包含了NIO Buffer对象,对象提供了一组方法,可以操作这个内存块。 比Input和output操作更方便更容易操作,写入和读取需要手动记录和跟进。 Buffer工作原理 更方便的操作,是因为里面记录了每一个操作点,同时还提供了数组操作的封装。 主要关注API的使用。 Buffer基本使用 注意读写的转换,读和写模式下参数含义不一样。 put();写 flip();转换 public static void main ( String [ ] args ) { // 构建一个byte字节缓冲区,容量是4,堆内的内存 ByteBuffer byteBuffer = ByteBuffer . allocate ( 4 ) ; // 默认写入模式,查看三个重要的指标 System . out .

【译】Java NIO AsynchronousFileChannel

此生再无相见时 提交于 2020-01-12 16:24:35
在Java 7中NIO部分新增了AsynchronousFileChannel。AsynchronousFileChannel可以异步的读写文件了。下面教程介绍了它的用法。 创建一个AsynchronousFileChannel 通过它的静态方法open可以创建一个对象: Path path = Paths.get("data/test.xml"); AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ); 第一个参数是一个文件路径,它指向要访问的文件。 第二个参数是一个或多个打开的操作选项,它告诉AsynchronousFileChannel在底层对文件执行什么操作。上面的例子我们使用了StandardOpenOption.READ,这就表示文件打开是为了读取数据。 读数据 有两种方法。每种读取数据的方法都调用了AsynchronousFileChannel的read()方法之一。这两种读取数据的方法将在下面几节中讨论。 通过Future读数据 第一种是通过返回一个Future对象来读数据: Future<Integer> operation = fileChannel.read(buffer, 0); 第一个参数是一个buffer

byte collection based similar with ByteBuffer from java

馋奶兔 提交于 2020-01-12 01:48:13
问题 I need a C# implementation of something similar with ByteBuffer from Java. Methods of interest - .remaining() - returns the number of elements between the current position and the limit. - .array() - .clear() - .put(byte[], int, int) I started something with MemoryStream .. but no clear() , and a lot of improvisation Also, i found a c# implementation on Koders: http://www.koders.com/csharp/fid2F8CB1B540E646746D3ADCB2B0AC867A0A8DCB06.aspx?s=socket#L2.. which I will use.. but maybe you guys

异步通道和异步运算结果

末鹿安然 提交于 2020-01-10 18:48:22
异步通道和异步运算结果 以下内容参考孙卫琴所写的《Java网络编程核心技术详解》一书的第12章。 源代码下载地址为: http://lesson.javathinker.net/javanet/javanetsourcecode.rar 从JDK7开始,引入了表示异步通道的AsynchronousSocketChannel类和AsynchronousServerSocketChannel类,这两个类的作用与SocketChannel类和ServerSocketChannel相似,区别在于异步通道的一些方法总是采用非阻塞工作模式,并且它们的非阻塞方法会立即返回一个Future对象,用来存放方法的异步运算结果。 AsynchronousSocketChannel类有以下非阻塞方法: Future<Void> connect(SocketAddress remote):连接远程主机。 Future<Integer> read(ByteBuffer dst):从通道中读入数据,存放到ByteBuffer中。Future对象中包含了实际从通道中读到的字节数。 Future<Integer> write(ByteBuffer src):把ByteBuffer中的数据写入到通道中。Future对象中包含了实际写入通道的字节数。

java NIO学习(一)

偶尔善良 提交于 2020-01-10 11:46:34
NIO的全称是non-blocking IO,也就是非阻塞IO,也有的人叫他New IO。他的核心内容主要有三部分,Channel(通道),Buffer(缓冲区), Selecto(选择器)。下面我们针对这三部分详细了解一下NIO。 Buffer(缓冲区) Buffer缓冲是一个指定固定数据量的容器,一个连续数组。除内容之外,缓冲区还具有位置和界限,其中位置是要读写的下一个元素的索引,界限是第一个应该读写的元素的索引。 java中每个非布尔基本类型都有一个缓冲区类。 Buffer通过 capacity, position, limit, mark 这四个变量来保存这个数据的当前位置状态,下面介绍一下这四个属性的意义。 capacity( 容量值 ):缓冲区数组的总长度 position( 位置 ):下一个要操作的数据元素的位置 limit( 极限 ):缓冲区数组中不可操作的下一个元素的位置 mark( 标记 ):用于记录当前position的位置,默认是-1 基本 Buffer 类定义了这些属性以及清除、反转和重绕方法,用以标记当前位置,以及将当前位置重置为前一个标记处。 clear() 使缓冲区准备好信道读取或相对 放置 操作的一个新的序列:它设置了限制的能力和位置为零。 flip() 使缓冲区准备好新的通道写入或相对 获取操作 序列:它将限制设置为当前位置,然后将位置设置为零。

Wrapping a ByteBuffer with an InputStream

自古美人都是妖i 提交于 2020-01-09 04:38:05
问题 I have a method that takes an InputStream and reads data from it. I would like to use this method with a ByteBuffer also. Is there a way to wrap a ByteBuffer so it can be accessed as a stream? 回答1: Nothing in the JDK, but there are lots of implementations out there, google for ByteBufferInputStream. Basically they wrap one or more ByteBuffers and keep track of an index into them that records how much has already been read. Something like this comes up a lot, but apparently is buggy, see @Mike