标签: bytebuffer

如何将ByteBuffer的内容放入OutputStream?

我需要将a的内容java.nio.ByteBuffer放入java.io.OutputStream.(希望我有一个Channel反而我不这样做)最好的方法是什么?

我不能使用ByteBuffer的array()方法,因为它可以是只读缓冲区.

我也可能在使用这个ByteBuffer和byte[]我可以OutputStream.write()直接使用的常规数组之间散布对OutputStream的写入.

java bytebuffer outputstream

36
推荐指数
1
解决办法
3万
查看次数

为什么ByteBuffer.allocate()和ByteBuffer.allocateDirect()之间的奇怪性能曲线差异

我工作的一些SocketChannel至- SocketChannel代码会做最好用直接字节缓冲区- (几十到几百每个连接的兆字节),长寿命,大而散列出具有确切循环结构FileChannelS,我跑了一些微在基准测试ByteBuffer.allocate()ByteBuffer.allocateDirect()性能.

结果出人意料,我无法解释.在下图中,对于ByteBuffer.allocate()传输实现,在256KB和512KB处有一个非常明显的悬崖- 性能下降了~50%!这似乎也是一个较小的性能悬崖ByteBuffer.allocateDirect().(%-gain系列有助于可视化这些变化.)

缓冲区大小(字节)与时间(MS)

小马差距

为什么奇数性能曲线ByteBuffer.allocate()ByteBuffer.allocateDirect()?之间存在差异? 幕后究竟发生了什么?

它很可能取决于硬件和操作系统,所以这里有以下细节:

  • MacBook Pro配双核Core 2 CPU
  • 英特尔X25M SSD硬盘
  • OSX 10.6.4

源代码,按要求:

package ch.dietpizza.bench;

import static java.lang.String.format;
import static java.lang.System.out;
import static java.nio.ByteBuffer.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;

public class SocketChannelByteBufferExample {
    private static WritableByteChannel target;
    private static ReadableByteChannel source; …
Run Code Online (Sandbox Code Playgroud)

java nio bytebuffer

31
推荐指数
4
解决办法
1万
查看次数

将ByteBuffer转换为字节数组java

有谁知道如何将ByteBuffer转换为byte []数组?我需要从我的字节数组中获取ByteBuffer.当我运行bytebuffer.hasArrray()它返回否.到目前为止我看到的每个问题都是将字节数组转换为byteBuffer,但我还需要其他方法.谢谢.

java arrays bytebuffer bytearray

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

线程“main”中的异常 java.lang.NoSuchMethodError: java.nio.ByteBuffer.flip()Ljava/nio/ByteBuffer

我有一个方法如下,它已经正常运行了很长时间:

private String loadFromFile(){

    RandomAccessFile inFile = null;
    FileChannel inChannel = null;
    StringBuilder sb = new StringBuilder();
    try {

        inFile = new RandomAccessFile(this.latestImageFile, "r");
        inChannel = inFile.getChannel();

        ByteBuffer bb = ByteBuffer.allocate(2046);
        while( inChannel.read(bb) != -1){
            bb.flip();

            while(bb.hasRemaining()){
                char c = (char) bb.get();   // read character at current position and set the pointer to current position + 1
                sb.append(c);
            }

            bb.clear();
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (inChannel != null) try {inChannel.close(); } catch (IOException e){} …
Run Code Online (Sandbox Code Playgroud)

java bytebuffer java-8 java-11

29
推荐指数
1
解决办法
1万
查看次数

如何垃圾收集直接缓冲java

我有一个内存泄漏,我已经隔离到不正确的直接字节缓冲区.

ByteBuffer buff = ByteBuffer.allocateDirect(7777777);

GC收集包含这些缓冲区的对象,但不会丢弃缓冲区本身.如果我实例化足够的包含缓冲区的瞬态对象,我会得到这个令人鼓舞的消息.

java.lang.OutOfMemoryError: Direct buffer memory

我一直在寻找这个问题,显然

buff.clear();

System.gc();

不起作用

java buffer memory-leaks bytebuffer

28
推荐指数
4
解决办法
4万
查看次数

如何从Java中的文件创建ByteArrayInputStream?

我有一个文件,可以是任何东西,如ZIP,RAR,TXT,CSV,doc等.我想从它创建一个ByteArrayInputStream.
我正在使用它通过FTPClient从Apache Commons Net 上传文件到FTP .

有谁知道怎么做?

例如:

String data = "hdfhdfhdfhd";
ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());
Run Code Online (Sandbox Code Playgroud)

我的代码:

public static ByteArrayInputStream retrieveByteArrayInputStream(File file) {
    ByteArrayInputStream in;

    return in;     
}
Run Code Online (Sandbox Code Playgroud)

java arrays bytebuffer bytearrayinputstream

26
推荐指数
3
解决办法
8万
查看次数

多线程可以在Java中看到直接映射的ByteBuffer上的写入吗?

我正在研究使用ByteBuffers从内存映射文件(通过FileChannel.map())以及内存中直接ByteBuffers 构建的东西.我试图了解并发和内存模型约束.

我已经阅读了FileChannel,ByteBuffer,MappedByteBuffer等所有相关的Javadoc(和源代码).很明显,特定的ByteBuffer(和相关的子类)有一堆字段,并且状态不受内存模型的保护观点看法.因此,如果跨线程使用该缓冲区,则必须在修改特定ByteBuffer的状态时进行同步.常见的技巧包括使用ThreadLocal包装ByteBuffer,复制(同步)以获取指向相同映射字节的新实例等.

鉴于这种情况:

  1. manager B_all为整个文件提供了一个映射的字节缓冲区(比如它<2gb)
  2. 管理器在B_all上调用duplicate(),position(),limit()和slice()来创建一个新的较小的ByteBuffer B_1,该文件的一大块并将其提供给线程T1
  3. manager执行所有相同的操作来创建B_2指向相同映射字节的ByteBuffer 并将其提供给线程T2

我的问题是:T1可以写入B_1,T2可以同时写入B_2并保证看到彼此的变化吗?T3可以使用B_all来读取这些字节并保证看到T1和T2的变化吗?

我知道,除非您使用force()指示操作系统将页面写入磁盘,否则不一定会在进程中看到映射文件中的写入.我不在乎.假设这个问题,这个JVM是编写单个映射文件的唯一进程.

注意: 我不是在寻找猜测(我可以自己做得很好).我想引用一些关于内存映射直接缓冲区保证(或不保证)的内容.或者,如果您有实际经验或负面测试用例,那么这也可以作为充分的证据.

更新:我已经完成了一些测试,让多个线程并行写入同一个文件,到目前为止,似乎这些写入可以立即从其他线程中看到.我不确定我是否可以依靠它.

java concurrency bytebuffer filechannel memory-mapped-files

24
推荐指数
3
解决办法
7011
查看次数

深层复制Java的ByteBuffer复制()

java.nio.ByteBuffer#duplicate()返回一个新的字节缓冲区,它共享旧缓冲区的内容.旧缓冲区内容的更改将在新缓冲区中可见,反之亦然.如果我想要字节缓冲区的深层副本怎么办?

java nio bytebuffer deep-copy

23
推荐指数
3
解决办法
3万
查看次数

Java InputStream到ByteBuffer

我读DDS纹理,但由于一次建成罐子我无法通过访问这些纹理urlfile并有能力使用InputStream来代替.

所以我需要知道如何java.?nio.ByteBuffer从一个人那里获得一个java.io.InputStream.

Ps:无论通过第三方库,我只需要它工作

java bytebuffer inputstream

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

C++相当于Java ByteBuffer?

我正在寻找Java ByteBuffer的C++"等价物".

我可能错过了显而易见的或只是需要一个孤立的用法示例来澄清.我已经浏览了iostream系列,看起来它可能提供了基础.具体来说,我希望能够:

  • 从字节数组/点构建缓冲区并从缓冲区中获取基元,例如getByte,getInt
  • 使用基元构建缓冲区,例如putByte,putInt,然后获取字节数组/指针.

c++ java bytebuffer

22
推荐指数
3
解决办法
3万
查看次数