Tag: bytebuffer

JAVA NIO Bytebuffer.allocateDirect()对int的大小限制

我正在尝试制作堆外内存缓冲区。 我想要非常大的(如10GB)缓冲区。 我听说jvm堆有时会冻结,因为完整的GC。 所以,我尝试使用java.nio.ByteBuffer创建缓冲区。 但是,我遇到了很大困难! java.nio.ByteBuffer.allocateDirect(int size) 函数只支持整数。 但我想要更大的尺寸。 我能做什么? 我该怎么办? 请帮我堆叠溢出大师。 我的开发环境是macbook pro,i7 2.4ghz,16gb ddr3,250ssd,osx 10.9,eclipse kepler x64。 我尝试解决问题: ByteBuffer buffer = ByteBuffer.allocateDirect(1024*1024*2000); ByteBuffer buffer1 = ByteBuffer.allocateDirect(1024*1024*2000); ByteBuffer buffer2 = ByteBuffer.allocateDirect(1024*1024*2000); ByteBuffer buffer3 = ByteBuffer.allocateDirect(1024*1024*2000); 但这不起作用。 仅重新分配内存1024 * 1024 * 2000 请帮帮我。

ByteBuffer getInt()问题

我们使用Java ByteBuffer与C ++服务器进行套接字通信。 我们知道Java是Big-endian,而Socket通信也是Big-endian。 因此,每当字节流接收并由Java放入ByteBuffer时,我们调用getInt()来获取值。 没问题,没有转换。 但是,如果我们以某种方式将ByteBuffer字节顺序专门设置为Little-endian(我的同事实际上已经这样做了), 当数据放入ByteBuffer时,Java会自动将Big-endian转换为Little-endian吗? 那么Little-endian版本的getInt()会给你一个正确的值吗? 我想上面两个问题的答案是肯定的。 但是当我尝试validation我的猜测并试图找到getInt()在ByteBuffer中的工作原理时,我发现它是一个抽象方法。 ByteBuffer的唯一子类是MappedByteBuffer类,它没有实现抽象的getInt()。 那么getInt()方法的实现在哪里呢? 对于发送,因为我们使用的是Little-endian ByteBuffer,我们需要在放入套接字之前将它们转换为Big-endian字节。

如何将OutputStream中的数据放入ByteBuffer?

在Java中,我需要将OutputStream中的内容(我自己将数据填充到该流中)放入ByteBuffer中。 如何以简单的方式做到这一点?

如何将数据从TCP套接字转换为ByteBuffer

我需要将来自套接字的传入数据传入ByteBuffer,我不知道该怎么做。 我是这个领域的新手,因此不确定最好的开始方式。 我找到了以下内容,但这不是我想要的,因为它获取了数据,但我需要将所有数据都存在于bytebuffer中以用于其他目的。 ServerSocket welcomeSocket = new ServerSocket(Integer.parseInt(ibmPort)); while (true) { Socket connectionSocket = welcomeSocket.accept(); BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); clientSentence = inFromClient.readLine(); System.out.println(“Received: ” + clientSentence); setRequestDataFromCT(clientSentence); capitalizedSentence = clientSentence.toUpperCase() + ‘\n’; outToClient.writeBytes(capitalizedSentence); }

一个简单的规则,我何时应该使用Java NIO的直接缓冲区来进行网络I / O?

有天赋的人可以用简单直接的方式解释复杂的事情来解决这个问题吗? 要在使用Java NIO进行网络I / O时,何时使用直接ByteBuffers与常规ByteBuffers,以获得最佳性能? 例如:我应该读入堆缓冲区并从那里解析它,执行许多get()(逐字节)或者我应该将它读入直接缓冲区并从直接缓冲区解析?

这个Java ByteBuffer的行为有解释吗?

我需要将数值转换为字节数组。 例如,要将long转换为byte数组,我有以下方法: public static byte[] longToBytes(long l) { ByteBuffer buff = ByteBuffer.allocate(8); buff.order(ByteOrder.BIG_ENDIAN); buff.putLong(l); return buff.array(); } 这很简单 – 花一点时间,分配一个可以容纳它的数组,并把它放在那里。 无论l的值是什么,我都会得到一个8字节的数组,然后我可以按照预期进行处理和使用。 就我而言,我正在创建一个自定义二进制格式,然后通过网络传输它。 当我使用值773450364调用此方法时,我得到一个数组[0 0 0 0 46 25 -22 124] 。 我有代码也将字节数组转换回它们的数值: public static Long bytesToLong(byte[] aBytes, int start) { byte[] b = new byte[8]; b[0] = aBytes[start + 0]; b[1] = aBytes[start + 1]; […]

快速ByteBuffer到CharBuffer或char

将java.nio.ByteBuffer a转换为(新创建的) CharBuffer b或char[] b的最快方法是什么? 通过这样做很重要, a[i] == b[i] 。 这意味着,不是a[i]和a[i+1]一起组成一个值b[j] , getChar(i)会做什么,但这些值应该是“传播”。 byte a[] = { 1,2,3, 125,126,127, -128,-127,-126 } // each a byte (which are signed) char b[] = { 1,2,3, 125,126,127, 128, 129, 130 } // each a char (which are unsigned) 请注意, byte:-128与char:128具有相同(低8位)的位。 因此,我假设“最佳”解释将如上所述,因为位是相同的。 之后我还需要相反的翻译:将char[]或java.nio.CharBuffer重新放回java.nio.ByteBuffer的最有效方法。

字节集合与java中的ByteBuffer类似

我需要一个类似于Java的ByteBuffer的C#实现。 感兴趣的方法 – .remaining() – 返回当前位置和限制之间的元素数量。 – .array() – .clear() – .put(byte [],int,int) 我开始使用MemoryStream …但是没有clear()和很多即兴创作此外,我在Koders上找到了ac#implementation: http : //www.koders.com/csharp/fid2F8CB1B540E646746D3ADCB2B0AC867A0A8DCB06.aspx ?s=socket#L2。我将使用..但也许你们知道更好的东西

Java ByteBuffer性能问题

在处理多个千兆字节的文件时,我注意到一些奇怪的事情:似乎从使用文件通道的文件读取到使用allocateDirect分配的重用ByteBuffer对象比从MappedByteBuffer读取要慢得多,实际上它比读取字节更慢使用常规读取调用的数组! 我希望它(几乎)与从mappedbytebuffers读取一样快,因为我的ByteBuffer分配了allocateDirect,因此读取应该直接在我的bytebuffer中结束,没有任何中间副本。 我现在的问题是:我做错了什么? 或者bytebuffer + filechannel是否比常规io / mmap慢? 我下面的示例代码我还添加了一些代码,将读取的内容转换为long值,因为这是我的真实代码不断执行的操作。 我希望ByteBuffer getLong()方法比我自己的字节shuffeler快得多。 测试结果:mmap:3.828 bytebuffer:55.097常规i / o:38.175 import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel.MapMode; import java.nio.MappedByteBuffer; class testbb { static final int size = 536870904, n = size / 24; static public long byteArrayToLong(byte [] in, int offset) { return ((((((((long)(in[offset + […]

Java – 堆与直接内存访问

我最近遇到了sun.misc.Unsafe类,允许用户以类似于C的方式分配,解除分配和一般访问内存。我读了几个解决这个问题的博客,例如 哪个更快 – 堆或直接内存 – 测试结果声称堆 堆外内存与DirectByteBuffer vs Heap – 堆外似乎是最快的 时间序列数据的内存映射文件 – MappedByteBuffer比堆对象更快 第1条似乎与其他条款相矛盾,我无法理解其中的原因。 DirectMemoryBuffer在引擎盖下使用了sun.misc.Unsafe (因此是MappedByteBuffer ),因此它们也应该受到第1条所述的JNI调用的影响。另外,在第2条中,堆外内存访问类似于第1条中的内容,并给出完全相反的结果。 有人可能会评论如何处理堆外记忆,即何时使用它,是否有显着的好处,最重要的是,为什么类似的主题根据上述文章给出了截然不同的结果? 谢谢。