我需要将a的内容java.nio.ByteBuffer放入java.io.OutputStream.(希望我有一个Channel反而我不这样做)最好的方法是什么?
我不能使用ByteBuffer的array()方法,因为它可以是只读缓冲区.
我也可能在使用这个ByteBuffer和byte[]我可以OutputStream.write()直接使用的常规数组之间散布对OutputStream的写入.
我工作的一些SocketChannel至- SocketChannel代码会做最好用直接字节缓冲区- (几十到几百每个连接的兆字节),长寿命,大而散列出具有确切循环结构FileChannelS,我跑了一些微在基准测试ByteBuffer.allocate()与ByteBuffer.allocateDirect()性能.
结果出人意料,我无法解释.在下图中,对于ByteBuffer.allocate()传输实现,在256KB和512KB处有一个非常明显的悬崖- 性能下降了~50%!这似乎也是一个较小的性能悬崖ByteBuffer.allocateDirect().(%-gain系列有助于可视化这些变化.)
缓冲区大小(字节)与时间(MS)

为什么奇数性能曲线ByteBuffer.allocate()与ByteBuffer.allocateDirect()?之间存在差异? 幕后究竟发生了什么?
它很可能取决于硬件和操作系统,所以这里有以下细节:
源代码,按要求:
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) 有谁知道如何将ByteBuffer转换为byte []数组?我需要从我的字节数组中获取ByteBuffer.当我运行bytebuffer.hasArrray()它返回否.到目前为止我看到的每个问题都是将字节数组转换为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) 我有一个内存泄漏,我已经隔离到不正确的直接字节缓冲区.
ByteBuffer buff = ByteBuffer.allocateDirect(7777777);
GC收集包含这些缓冲区的对象,但不会丢弃缓冲区本身.如果我实例化足够的包含缓冲区的瞬态对象,我会得到这个令人鼓舞的消息.
java.lang.OutOfMemoryError: Direct buffer memory
我一直在寻找这个问题,显然
buff.clear();
和
System.gc();
不起作用
我有一个文件,可以是任何东西,如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) 我正在研究使用ByteBuffers从内存映射文件(通过FileChannel.map())以及内存中直接ByteBuffers 构建的东西.我试图了解并发和内存模型约束.
我已经阅读了FileChannel,ByteBuffer,MappedByteBuffer等所有相关的Javadoc(和源代码).很明显,特定的ByteBuffer(和相关的子类)有一堆字段,并且状态不受内存模型的保护观点看法.因此,如果跨线程使用该缓冲区,则必须在修改特定ByteBuffer的状态时进行同步.常见的技巧包括使用ThreadLocal包装ByteBuffer,复制(同步)以获取指向相同映射字节的新实例等.
鉴于这种情况:
B_all为整个文件提供了一个映射的字节缓冲区(比如它<2gb)B_1,该文件的一大块并将其提供给线程T1B_2指向相同映射字节的ByteBuffer 并将其提供给线程T2我的问题是:T1可以写入B_1,T2可以同时写入B_2并保证看到彼此的变化吗?T3可以使用B_all来读取这些字节并保证看到T1和T2的变化吗?
我知道,除非您使用force()指示操作系统将页面写入磁盘,否则不一定会在进程中看到映射文件中的写入.我不在乎.假设这个问题,这个JVM是编写单个映射文件的唯一进程.
注意: 我不是在寻找猜测(我可以自己做得很好).我想引用一些关于内存映射直接缓冲区保证(或不保证)的内容.或者,如果您有实际经验或负面测试用例,那么这也可以作为充分的证据.
更新:我已经完成了一些测试,让多个线程并行写入同一个文件,到目前为止,似乎这些写入可以立即从其他线程中看到.我不确定我是否可以依靠它.
java.nio.ByteBuffer#duplicate()返回一个新的字节缓冲区,它共享旧缓冲区的内容.旧缓冲区内容的更改将在新缓冲区中可见,反之亦然.如果我想要字节缓冲区的深层副本怎么办?
我读DDS纹理,但由于一次建成罐子我无法通过访问这些纹理url和file并有能力使用InputStream来代替.
所以我需要知道如何java.?nio.ByteBuffer从一个人那里获得一个java.io.InputStream.
Ps:无论通过第三方库,我只需要它工作
我正在寻找Java ByteBuffer的C++"等价物".
我可能错过了显而易见的或只是需要一个孤立的用法示例来澄清.我已经浏览了iostream系列,看起来它可能提供了基础.具体来说,我希望能够:
bytebuffer ×10
java ×10
arrays ×2
nio ×2
buffer ×1
bytearray ×1
c++ ×1
concurrency ×1
deep-copy ×1
filechannel ×1
inputstream ×1
java-11 ×1
java-8 ×1
memory-leaks ×1
outputstream ×1