标签: bytebuffer

ByteBuffer,什么是一种干净的方法来检测是否需要翻转

是否有一种干净确定的火灾方式来检测ByteBuffer是否需要翻转?

我有一个ByteBuffer,用于打包和解包数据结构,也用于存储要打包/解包的字节.

但是,如果刚刚执行了写操作或执行了读操作,或者如果将ByteBuffer传递给我的代码,我无法保证缓冲区处于写模式或读模式而不需要手动操作位置和限制.

部分读取和写入也会增加此问题.我一直采用这样的惯例:缓冲区处于写入模式,并且创建副本并翻转以用于读取目的.当缓冲区传入我的代码时,会手动检查并设置位置和限制,因为它们处于写入模式.当然有更好的方法.

java bytebuffer

5
推荐指数
1
解决办法
1198
查看次数

Java Native Memory比堆更快吗?

我正在探索帮助我的内存密集型应用程序的选项,在这样做时我遇到了Terracotta的BigMemory.从我收集的内容来看,它们利用了非垃圾收集的堆外"本机内存",显然由于序列化/反序列化问题,这比堆存储慢大约10倍.在阅读BigMemory之前,我从未听说过正常JNI之外的"本机记忆".尽管BigMemory是一个值得进一步考虑的有趣选项,但如果可以绕过序列化问题,我会对本机内存可以实现的内容感到好奇.

ByteBuffer当没有序列化问题时(例如,如果我将它与巨大的比较),Java本机内存是否比传统堆内存更快(我认为这需要对象?byte[])?或者做垃圾收集的变幻莫测等让这个问题无法回答?我知道"测量它"是一个常见的答案,但我担心我不会建立一个代表性的测试,因为我还不太了解本机内存在Java中是如何工作的.

java memory garbage-collection bytebuffer terracotta

5
推荐指数
1
解决办法
1868
查看次数

快速ByteBuffer到CharBuffer或char []

什么是一个转换最快的方法java.nio.ByteBuffer a为(新建)CharBuffer bchar[] 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)
Run Code Online (Sandbox Code Playgroud)

注意,它byte:-128具有相同(低8位)的位char:128.因此,我假设"最佳"解释将如上所述,因为位是相同的.

之后我还需要相反的翻译:最有效的方式来获得char[]java.nio.CharBuffer重新进入java.nio.ByteBuffer.

java arrays nio bytebuffer bytearray

5
推荐指数
2
解决办法
2万
查看次数

如何使用java.nio.channels.FileChannel读取ByteBuffer实现类似BufferedReader#readLine()的行为

我想使用java.nio.channels.FileChannel从文件中读取内容,但是我想像读取行一样BufferedReader#readLine()。我需要使用java.nio.channels.FileChannel而不是的java.io原因是,我需要在文件上放置一个锁,然后逐行读取该锁文件。所以我被迫使用java.nio.channels.FileChannel。请帮忙

编辑这是我的代码尝试使用FileInputStream获取FileChannel

public static void main(String[] args){
    File file = new File("C:\\dev\\harry\\data.txt");
    FileInputStream inputStream = null;
    BufferedReader bufferedReader = null;
    FileChannel channel = null;
    FileLock lock = null;
    try{
        inputStream = new FileInputStream(file);
        channel  = inputStream.getChannel();
        lock = channel.lock();
        bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String data;
        while((data = bufferedReader.readLine()) != null){
            System.out.println(data);
        }
    }catch(IOException e){
        e.printStackTrace();
    }finally{
        try {
            lock.release();
            channel.close();
            if(bufferedReader != null) bufferedReader.close();
            if(inputStream != null) inputStream.close(); …
Run Code Online (Sandbox Code Playgroud)

java nio bytebuffer filechannel

5
推荐指数
1
解决办法
7328
查看次数

Java读取文件大于2 GB(使用分块)

我正在实现文件传输服务器,我遇到了通过网络发送大于2 GB的文件的问题.当我得到File我想要使​​用并尝试将其内容读入a 时,问题就开始了byte[].我有一个for循环:

for(long i = 0; i < fileToSend.length(); i += PACKET_SIZE){
    fileBytes = getBytesFromFile(fileToSend, i);  
Run Code Online (Sandbox Code Playgroud)


其中getBytesFromFile()读取一个PACKET_SIZE字节数fileToSend,然后在for循环中将其发送到客户端.getBytesFromFile()使用i作为偏移; 但是,偏移量变量FileInputStream.read()必须是int.我确定有更好的方法将这个文件读入数组,我还没有找到它.

我宁愿不使用NIO,虽然我将来会改用它.放纵我的疯狂:-)

java io networking bytebuffer

5
推荐指数
1
解决办法
2038
查看次数

使用java.nio.MappedByteBuffer时防止OutOfMemory

考虑应用程序,它创建5-6个线程,循环中的每个线程为5mb页面大小分配MappedByteBuffer.

MappedByteBuffer b = ch.map(FileChannel.MapMode.READ_ONLY, r, 1024*1024*5);
Run Code Online (Sandbox Code Playgroud)

迟早,当应用程序使用大文件时,会抛出oom

java.io.IOException: Map failed  at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:758)
Caused by: java.lang.OutOfMemoryError: Map failed
        at sun.nio.ch.FileChannelImpl.map0(Native Method)
        at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:755)
Run Code Online (Sandbox Code Playgroud)

根据规范,MappedBuffer应该在GC本身时立即配置直接内存.看起来问题是,MappedBuffer-s的GC编辑太晚了,后来直接内存完成了.

如何避免这种情况?可能会说MappedBuffer隐式处理或使用某种MappedBuffer池

java nio bytebuffer filechannel out-of-memory

5
推荐指数
2
解决办法
7603
查看次数

Hadoop为java.nio.ByteBuffer的keytype抛出ClassCastException

我正在使用"hadoop-0.20.203.0rc1.tar.gz"进行群集设置.每当我设定job.setMapOutputKeyClass(ByteBuffer.class);

并运行我得到以下异常的工作:

    12/01/13 15:09:00 INFO mapred.JobClient: Task Id : attempt_201201131428_0005_m_000001_2, Status : FAILED
java.lang.ClassCastException: class java.nio.ByteBuffer
        at java.lang.Class.asSubclass(Class.java:3018)
        at org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:776)
        at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:958)
        at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:673)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:755)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:369)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:259)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:396)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
        at org.apache.hadoop.mapred.Child.main(Child.java:253)
Run Code Online (Sandbox Code Playgroud)

另外我注意到ByteBuffer是Comparable而不是Writable是否会产生任何差异?如果需要任何其他信息,请与我们联系.

hadoop bytebuffer mapreduce hadoop-streaming

5
推荐指数
1
解决办法
2260
查看次数

如何使用CompletionHandlers和小于请求的ByteBuffer读取请求?

我正在使用Java 7和AsynchronousSocketChannel。我想读取一个请求(例如HTTP POST),但是如果它大于ByteBuffer我正在使用的大小,我正在努力想出一个很好的解决方案来读取完整的请求。例如,如果ByteBuffer是4048字节,并且HTTP POST包含大于4kB的图像。

有没有很好的递归解决方案或循环呢?

这是我的阅读请求代码:

public void readRequest(final AsynchronousSocketChannel ch) {
    final ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
    final StringBuilder strBuilder = new StringBuilder();
    final CharsetDecoder decoder = Charset.forName("US-ASCII").newDecoder();

    ch.read(buffer, null, new CompletionHandler<Integer, Void>() {

        public void completed(Integer bytes, Void att) {

            buffer.flip();                          
            try {
                decoder.reset();
                strBuilder.append(decoder.decode(buffer).toString());
            } catch (CharacterCodingException e) {
                e.printStackTrace();
            }           
            buffer.clear();         

            // More data to read or send response
            if(bytes != -1) {

                // More data to read
                ch.read(...); …
Run Code Online (Sandbox Code Playgroud)

java asynchronous nio bytebuffer completionhandler

5
推荐指数
1
解决办法
2854
查看次数

Java NIO MappedByteBuffer OutOfMemoryException

我真的遇到了麻烦:我想用FileChannels和MappedByteBuffers 读取几GB的HUGE文件- 我发现的所有文档都暗示使用该FileChannel.map()方法映射文件相当简单.当然,限制为2GB,因为所有Buffer方法都使用int来定位,限制和容量 - 但系统隐含的限制如何呢?

实际上,我遇到很多关于OutOfMemoryExceptions 的问题!并没有真正定义限制的文档!那么 - 如何将一个符合int-limit的文件安全地映射到一个或几个MappedByteBuffers而不仅仅是异常?

在尝试之前,我可以问系统我可以安全地映射文件的哪个部分FileChannel.map()?怎么样?为什么关于这个功能的文档很少?

java file-io nio bytebuffer filechannel

5
推荐指数
3
解决办法
6742
查看次数

使用ByteBuffer以有效的方式在一个字节数组中打包标头和数据布局?

我有一个标题和数据,我需要在一个表示Byte Array.我有一种特殊的格式用于打包标题Byte Array,也可以采用不同的格式打包数据Byte Array.在我拥有这两个之后,我需要做出最后一个Byte Array.

下面是布局,它是如何定义的C++,因此我必须做Java.

// below is my header offsets layout

// addressedCenter must be the first byte
static constexpr uint32_t  addressedCenter      = 0;
static constexpr uint32_t  version              = addressedCenter + 1;
static constexpr uint32_t  numberOfRecords      = version + 1;
static constexpr uint32_t  bufferUsed           = numberOfRecords + sizeof(uint32_t);
static constexpr uint32_t  location             = bufferUsed + sizeof(uint32_t);
static constexpr uint32_t  locationFrom         = location + sizeof(CustomerAddress);
static constexpr …
Run Code Online (Sandbox Code Playgroud)

java arrays multithreading bytebuffer thread-safety

5
推荐指数
1
解决办法
914
查看次数