是否可以使用NIO处理进程中的stdout?我有它使用java.io,但这是一个练习,以了解更多关于NIO和探索性能改进的可能性.
基本上我想尽可能快地将大量文本从stdout流式传输到缓冲区而不会阻塞,然后再处理该缓冲区的内容.麻烦的是,我似乎无法弄清楚正确的伏都教使其与NIO合作.这就是我现在所处的位置:
ProcessBuilder pb = new ProcessBuilder( ... );
Process p = pb.start();
stdout = new StreamConsumer(p.getInputStream());
new Thread(stdout).start();
// other stuff omitted for brevity
Run Code Online (Sandbox Code Playgroud)
StreamConsumer类看起来像这样:
class StreamConsumer implements Runnable
{
private InputStream is;
public StreamConsumer(InputStream is)
{
this.is = is;
}
public void run()
{
try
{
ReadableByteChannel source = Channels.newChannel(is);
// Is it possible get a channel to a ByteBuffer
// or MappedByteBuffer here?
WritableByteChannel destination = ??;
ByteBuffer buffer = ByteBuffer.allocateDirect(128 * 1024);
while (source.read(buffer) != -1) …Run Code Online (Sandbox Code Playgroud) 我正在用Java做内存映射的IO。FileChannel类允许您将ByteBuffer映射到文件的特定部分。我这样做是用只读方式打开的文件。
我遇到的问题是,当我尝试对生成的ByteBuffer调用.array()方法时遇到异常。也许是因为.array()返回byte []数组,而我真的想要一个最终的字节数组吗?
有没有办法解决?
我希望使用RMI在网络上发送java.nio.ByteBuffer,但是ByteBuffer不可序列化.我尝试过以下自定义类无济于事:
public class NetByteBuffer implements java.io.Serializable {
ByteBuffer buffer;
public NetByteBuffer(ByteBuffer buffer) {
this.buffer = buffer;
}
public ByteBuffer getByteBuffer() {
return this.buffer;
}
Run Code Online (Sandbox Code Playgroud)
}
客户端仍然获得不可序列的异常.有任何想法吗?
谢谢
好吧,所以我正在查找从字节数组转换为java中的数值的最佳方法是什么,我遇到了这个链接.第二个答案提到了ByteBuffer类的使用.对于那些不希望点击链接的人,最初问题是否我有:
byte[] by = new byte[8];
Run Code Online (Sandbox Code Playgroud)
如何将其转换为int?答案是......
ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4});
long l = bb.getLong();
System.out.println(l);
Run Code Online (Sandbox Code Playgroud)
结果
4
Run Code Online (Sandbox Code Playgroud)
这真是太棒了,但我只是想在走这条路之前确认一些事情.
假设我之前读取的字节数组长度为8个字节.
byte[] oldByte = new byte[8];
Run Code Online (Sandbox Code Playgroud)
那我呢......
ByteBuffer bb = ByteBuffer.wrap(new byte[] {oldByte[2], oldByte[3]});
int intValue = bb.getInt();
Run Code Online (Sandbox Code Playgroud)
是否会以与前一个示例相同的方式读取/读取?
我像这样使用简单的循环缓冲区
var
Values: array [byte] of single;
ptr: byte;
Run Code Online (Sandbox Code Playgroud)
在这个测试例子中
for ptr:=0 to 10 do Values[Byte(ptr-5)]:=1;
Run Code Online (Sandbox Code Playgroud)
我希望设置为1前5个值和最后5个值,但XE4 compiller产生不正确的代码,它使用32位指针数学来计算数组索引:
for ptr:=0 to 10 do Values[Byte(ptr-5)]:=1;
005B94BB C645FB00 mov byte ptr [ebp-$05],$00
005B94BF 33C0 xor eax,eax
005B94C1 8A45FB mov al,[ebp-$05]
005B94C4 C78485E0FBFFFF0000803F mov [ebp+eax*4-$0420],$3f800000
005B94CF FE45FB inc byte ptr [ebp-$05]
005B94D2 807DFB0B cmp byte ptr [ebp-$05],$0b
005B94D6 75E7 jnz $005b94bf
Run Code Online (Sandbox Code Playgroud)
这是我的错误代码和操作字节索引的正确方法吗?
我试图理解java unsafe中的两个方法:
public native short getShortVolatile(Object var1, long var2);
Run Code Online (Sandbox Code Playgroud)
VS
public native short getShort(Object var1, long var2);
Run Code Online (Sandbox Code Playgroud)
这有什么真正的区别?这里的挥发性真正起作用了什么?我在这里找到了API doc:http://www.docjar.com/docs/api/sun/misc/Unsafe.html#getShortVolatile( Object,%20long)
但它并没有真正解释两种功能之间的区别.
我的理解是,对于不稳定的,它只对我们写作时很重要.对我来说,我们调用putShortVolatile然后进行读取应该是有意义的,我们可以简单地调用,getShort()因为volatile写入已经保证新值已经刷新到主存储器中.
如果有任何问题,请帮我纠正.谢谢!
对于我的 Android 应用程序,我ByteBuffer从本机代码中获取了一个。它包含创建位图的像素颜色值。
原始图像 -
我在位copyPixelsFromBuffer图上使用,但在显示位图时得到的颜色不正确。
这是这种方法的代码 -
方法一
ByteBuffer buffer = ...
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
buffer.rewind();
bitmap.copyPixelsFromBuffer(buffer);
Run Code Online (Sandbox Code Playgroud)
方法2
接下来我尝试了setPixels。它仍然给出错误的颜色,速度慢 10 倍以上,并且需要额外的内存int[]。请注意,这buffer.hasArray()是false,所以我无法从缓冲区获取数组。
ByteBuffer buffer = ...
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
buffer.rewind();
int[] pixels = new int[width * height];
for (int i = 0; i < width * height; i++) {
int a = buffer.get();
int …Run Code Online (Sandbox Code Playgroud) 以下 Java 代码可以编译,但在运行时出现错误:
\n\n# javac ByteBufTest.java\n# java ByteBufTest\nException in thread "main" java.lang.UnsupportedOperationException\n at java.nio.ByteBuffer.array(ByteBuffer.java:959)\n at ByteBufTest.<init>(ByteBufTest.java:12)\n at ByteBufTest.main(ByteBufTest.java:33)\n# \nRun Code Online (Sandbox Code Playgroud)\n\n为什么会出现这种情况?
\n\n注意\xef\xbc\x9a接下来,我需要在JNI中使用mDirectBuffer,所以我必须使用ByteBuffer.allocateDirect(TEST_BUFFER_SIZE)函数\xe3\x80\x82
\n\nByteBufTest.java:
import java.nio.ByteBuffer;\n\npublic class ByteBufTest {\n\n public static final int TEST_BUFFER_SIZE = 128;\n\n private ByteBuffer mDirectBuffer;\n\n public ByteBufTest() {\n mDirectBuffer = ByteBuffer.allocateDirect(TEST_BUFFER_SIZE);\n byte[] buf = mDirectBuffer.array();\n buf[1]=100;\n }\n\n public void test() {\n\n printBuffer("nativeInitDirectBuffer",mDirectBuffer.array());\n\n }\n\n private void printBuffer( String tag, byte[] buffer ) {\n StringBuffer sBuffer = new StringBuffer();\n for( int i=0; i<buffer.length; i++ …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Kinesis,它需要字节缓冲区格式的数据。到目前为止,我看到的所有示例都是用 Java 编写的,并传递简单的字符串。任何人都可以知道如何将 kotlin 数据类转换为 bytebuffer 吗?
例如数据类 abc ( var a: Long, var b: String, var c: Double )
我刚刚升级了 mongo-db-java-driver,现在方便的功能GridFSBucket.uploadFromStream已经消失了。因此我们现在得到了一个
GridFSUploadPublisher<ObjectId> uploadFromPublisher(String filename, Publisher<ByteBuffer> source);
Run Code Online (Sandbox Code Playgroud)
有什么想法如何将我的 InputStream 转换为 吗Publisher<ByteBuffer>?java驱动程序或Reactor中有任何实用函数吗?
bytebuffer ×10
java ×7
arrays ×2
android ×1
aws-sdk ×1
bitmap ×1
byte ×1
colors ×1
compiler-bug ×1
delphi ×1
indexing ×1
inputstream ×1
kotlin ×1
mongodb-java ×1
nio ×1
performance ×1
publisher ×1
reactor ×1
rmi ×1
unsafe ×1
volatile ×1