bytebuffer

JNI - native method with ByteBuffer parameter

左心房为你撑大大i 提交于 2019-11-28 20:24:51
问题 I've got a method: public native void doSomething(ByteBuffer in, ByteBuffer out); Generated by javah C/C++ header of this method is: JNIEXPORT void JNICALL Java__MyClass_doSomething (JNIEnv *, jobject, jobject, jobject, jint, jint); How can I get a data array from jobject (that is a ByteBuffer instance) ? 回答1: Assuming you allocated the ByteBuffer using ByteBuffer.allocateDirect() you can use GetDirectBufferAddress jbyte* bbuf_in; jbyte* bbuf_out; bbuf_in = (*env)->GetDirectBufferAddress(env,

Are Java DirectByteBuffer wrappers garbage collected?

你说的曾经没有我的故事 提交于 2019-11-28 18:27:51
I understand that when a directbytebuffer is allocated, its not subject to garbage collection, but what I'm wondering is if the wrapping object is garbage collected. For example, if I allocated a new DirectByteBuffer dbb, and then duplicated(shallow copied) it using dbb.duplicate(), I'd have two wrappers around the same chunk of memory. Are those wrappers subject to garbage collection? If I did while(true){ DirectByteBuffer dbb2 = dbb.duplicate(); } Would I eventually OOM myself? In the Sun JDK, a java.nio.DirectByteBuffer —created by ByteBuffer#allocateDirect(int) —has a field of type sun

漫话:如何给女朋友解释什么是BIO、NIO和AIO?

夙愿已清 提交于 2019-11-28 17:24:33
​ 周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO、NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是很满意。于是我在面试评价中写道:"对Java的IO提醒理解不够深入"。恰好被女朋友看到了。 Java IO IO,常协作I/O,是Input/Output的简称,即输入/输出。通常指数据在内部存储器(内存)和外部存储器(硬盘、优盘等)或其他周边设备之间的输入和输出。 输入/输出是信息处理系统(例如计算机)与外部世界(可能是人类或另一信息处理系统)之间的通信。 输入是系统接收的信号或数据,输出则是从其发送的信号或数据。 在Java中,提供了一些列API,可以供开发者来读写外部数据或文件。我们称这些API为Java IO。 IO是Java中比较重要,且比较难的知识点,主要是因为随着Java的发展,目前有三种IO共存。分别是BIO、NIO和AIO。 Java BIO BIO 全称Block-IO 是一种 同步且阻塞 的通信模式。是一个比较传统的通信方式,模式简单,使用方便。但并发处理能力低,通信耗时,依赖网速。 Java NIO Java NIO,全程 Non-Block IO ,是Java SE 1.4版以后,针对网络传输效能优化的新功能。是一种 非阻塞同步 的通信模式。 NIO 与原来的 I/O 有同样的作用和目的,

Memory-Mapped MappedByteBuffer or Direct ByteBuffer for DB Implementation?

南笙酒味 提交于 2019-11-28 17:13:33
问题 This looks like a long question because of all the context. There are 2 questions inside the novel below. Thank you for taking the time to read this and provide assistance. Situation I am working on a scalable datastore implementation that can support working with data files from a few KB to a TB or more in size on a 32-bit or 64-bit system. The datastore utilizes a Copy-on-Write design; always appending new or modified data to the end of the data file and never doing in-place edits to

C/C++ Why to use unsigned char for binary data?

人走茶凉 提交于 2019-11-28 15:39:23
Is it really necessary to use unsigned char to hold binary data as in some libraries which work on character encoding or binary buffers? To make sense of my question, have a look at the code below - char c[5], d[5]; c[0] = 0xF0; c[1] = 0xA4; c[2] = 0xAD; c[3] = 0xA2; c[4] = '\0'; printf("%s\n", c); memcpy(d, c, 5); printf("%s\n", d); both the printf's output 𤭢 correctly, where f0 a4 ad a2 is the encoding for the Unicode code-point U+24B62 (𤭢) in hex. Even memcpy also correctly copied the bits held by a char. What reasoning could possibly advocate the use of unsigned char instead of a plain

What is the purpose of ByteBuffer's flip method? (And why is it called “flip”?)

孤街浪徒 提交于 2019-11-28 15:27:15
问题 Why does ByteBuffer's flip() method called "flip"? What is "flipped" here? According to apidoc, two successive flips won't restore original state, and multiple flips will probably tend limit() to become zero. Can I "unflip" somehow to reuse bytes went out of a limit? Can I concatenate tail to be flipped with some other data? 回答1: One fairly common use case for the ByteBuffer is to construct some data structure piece-by-piece and then write that whole structure to disk. flip is used to flip

Bitmap from ImageReader always blank when trying to capture screen

我是研究僧i 提交于 2019-11-28 10:26:28
问题 Using the MediaProjection API for screen capture, I create an ImageReader and feed use it as a point of access for captured screens as below: mImageReader = ImageReader.newInstance(mWidth, mHeight, ImageFormat.JPEG, 2); and mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = null; Bitmap bitmap = null; image = mImageReader.acquireLatestImage(); Image.Plane[] planes = image.getPlanes();

Java网络编程与NIO详解2:JAVA NIO 一步步构建I/O多路复用的请求模型

倖福魔咒の 提交于 2019-11-28 08:30:57
微信公众号【黄小斜】作者是蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、SSM全家桶、MySQL、分布式、中间件、微服务,同时也懂点投资理财,坚持学习和写作,相信终身学习的力量!关注公众号后回复”架构师“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源。 当前环境 jdk == 1.8 代码地址 git 地址: https://github.com/jasonGeng88/java-network-programming 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 SocketChannel 的关系 事件监听类型 字节缓冲 ByteBuffer 数据结构 场景 接着上一篇中的站点访问问题,如果我们需要并发访问10个不同的网站,我们该如何处理? 在上一篇中,我们使用了 java.net.socket 类来实现了这样的需求,以一线程处理一连接的方式,并配以线程池的控制,貌似得到了当前的最优解。可是这里也存在一个问题,连接处理是同步的,也就是并发数量增大后,大量请求会在队列中等待,或直接异常抛出。 为解决这问题,我们发现元凶处在

NIO

馋奶兔 提交于 2019-11-28 06:24:09
NIO 回顾: 1 计算机网络:目的:信息传递,资源共享 2 osi参考模型 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 3 Tcp Ip参考模型 网络层 互联网层 传输层 应用层 4 协议 TCP 传输控制协议 UDP 用户数据包协议 IP 网际协议 5 Ip地址 ipv4 32位 ipv6 128位 A 1-126 B 128-191 C 192-223 D E 6 InetAddress 表示ip地址 7 TCP的socket编程 TCP协议的特点:1 安全可靠 2 面向连接 3效率相对低 4传输大小无限制 ServerSocket 服务器套接字 服务端步骤: 1 创建服务器套接字 ServerSocket listenner=new ServerSocket(1111); 2 侦听(接收),listenner.accept(); 如果有客户端连接返回Socket,阻塞 3 获取输入或输出流 4 处理数据 5 关闭 流 socket listenner Socket 客户端套接字 客户端步骤: 1 创建Socket 客户端套接字 指定服务端的ip和端口号 自动连接 2 获取输入或输出流 3 处理数据 4 关闭 流 socket 8 UDP UDP特点:1 不安全 2 无连接 3 效率高 4 传输大小有限制, 最大64kb DatagramSocket

BIO、NIO、AIO 个人总结

ⅰ亾dé卋堺 提交于 2019-11-28 05:46:52
BIO(blocking io) BIO即为阻塞IO,在网络编程中,它会在建立连接和等待连接的对端准备数据阶段进行阻塞。因此为了支撑高并发的用户访问,一般会为每一个socket 连接分配一个线程。但使用的瓶颈更加明显,无法支持上百万、甚至千万以上的并发。且线程切换带来的开销也更大。 代码示例: Server端 Server 端绑定 8082 端口 通过 accept() 方法 阻塞等待客户端建立连接 当与客户端建立一个 socket 连接通道之后,server 端口将新建一个线程进行 【读】 、【写】 ( ps: 这里的读是阻塞的,因为当server端发起读的请求时, 如果此时对端未准备好数据,那么将一直阻塞等待 。 直到:1. 对端通过 socket 发送数据2. 将数据从内核态 拷贝到用户态 ) try { // 绑定本地 8082 端口 ServerSocket server = new ServerSocket(8082); while (true) { //阻塞等待客户端 socket 建立连接 Socket accept = server.accept(); Thread t = new Thread(new Runnable() { @Override public void run() { // 一个线程处理一个socket 连接 BufferedReader