Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从字节数组创建列表_Java_Android_Objective C - Fatal编程技术网

Java 从字节数组创建列表

Java 从字节数组创建列表,java,android,objective-c,Java,Android,Objective C,我正在移植一些客观的C代码 我需要创建一个对象列表(我将使用任何类型的列表,任何有意义的列表)。该类如下所示: class Foo{ double fooValue1; double fooValue2; double fooValue3; double fooValue4; } 我正在把一个二进制文件读入一个字节数组,这个数组工作得很好。字节数组是一个 4双。因此,如果文件中有100个Foo实例,那么字节数组有3200个字节。i、 e.4*8*100 在目标C

我正在移植一些客观的C代码

我需要创建一个对象列表(我将使用任何类型的列表,任何有意义的列表)。该类如下所示:

class Foo{
    double fooValue1;
    double fooValue2;
    double fooValue3;
    double fooValue4;
}
我正在把一个二进制文件读入一个字节数组,这个数组工作得很好。字节数组是一个 4双。因此,如果文件中有100个Foo实例,那么字节数组有3200个字节。i、 e.4*8*100

在目标C中,变量被声明为指向Foo类型数组的指针。只需复制字节即可快速加载该数组。这样做的声明是:

[byteArray getBytes:fooData range:range]
其中range是字节数组的位置为0、长度为长度的
NSRange
实例,byteArray是从文件中读取的原始字节[],fooData是指向目标数组的指针

目前,我正在遍历字节数组,为每32个字节创建一个新的Foo实例,然后通过将每8个字节转换为双字节来分配字段。对于成千上万的对象,这是缓慢的

我瞄准API 8,所以代码>数组。对我来说,是不可用的,虽然如果它提供了一个好的解决方案,我会考虑改变目标。

问题是,;有没有一种方法可以用与目标C类似的“一句话”方式创建一个列表

谢谢

[编辑]这是我根据Peter的答案使用的最后一个代码。我应该补充一点,该文件实际上包含一个列表列表,以标题分隔。解析文件的结果是一个字节数组数组

ArrayList<SCGisPointData> pointData = new ArrayList<SCGisPointData>();
SCGisPointData thisPointdata;

for (byte[] ring : linearRings) {

    DoubleBuffer buffer = ByteBuffer.wrap(ring).order(ByteOrder.nativeOrder()).asDoubleBuffer().asReadOnlyBuffer();

    thisPointdata= new SCGisPointData ();

    while (buffer.hasRemaining()) {
        thisPointdata = new SCGisPointData();
        thisPointdata.longitude = buffer.get();
        thisPointdata.latitude = buffer.get();
        thisPointdata.sinLatitude = buffer.get();
        thisPointdata.cosLatitude = buffer.get();
        pointData.add(thisPointdata);  
    }

}
ArrayList pointData=new ArrayList();
SCGisPointData此点数据;
for(字节[]环:线性错误){
DoubleBuffer=ByteBuffer.wrap(ring).order(ByteOrder.nativeOrder()).asDoubleBuffer().asReadOnlyBuffer();
thisPointdata=新的SCGisPointData();
while(buffer.haslaining()){
thisPointdata=新的SCGisPointData();
thisPointdata.longitude=buffer.get();
thisPointdata.latitude=buffer.get();
thisPointdata.sinlation=buffer.get();
thisPointdata.cosLatitude=buffer.get();
添加(thisPointdata);
}
}

在纯Java中,无法神奇地假设一种类型可以转变为另一种类型。顺便说一句,你可以在HotSpot中使用不安全的工具来实现这一点,但我不相信你可以在Android中使用它,这也许是最好的

通过使用具有本机字节顺序的直接字节缓冲,可以加快转换速度。这可以最大限度地减少开销,但在Android中的速度不如在HotSpot中快(因为后者可以将这些转化为内在方法)

我想计算一下估计需要多长时间

// or use a MappedByteBuffer from a file
ByteBuffer bb = ByteBuffer.allocateDirect(3200).order(ByteOrder.nativeOrder());
while(bb.remaining() > 0) {
   float f= bb.getFloat();
}
注意:这不会运行足够长的时间,甚至不会被jit到本机代码

ByteBuffer bb = ByteBuffer.allocateDirect(3200).order(ByteOrder.nativeOrder());
for (int i = 0; i < 12; i++) {
    long start = System.nanoTime();
    bb.clear(); // simulate we have 3200 bytes to read.
    int count = 0;
    while (bb.remaining() > 0) {
        float f = bb.getFloat();
        count++;
    }
    long time = System.nanoTime() - start;
    System.out.printf("Took %,d micro-seconds to read %,d float values%n", time / 1000, count);
}

在纯Java中,无法神奇地假设一种类型可以转变为另一种类型。顺便说一句,你可以在HotSpot中使用不安全的工具来实现这一点,但我不相信你可以在Android中使用它,这也许是最好的

通过使用具有本机字节顺序的直接字节缓冲,可以加快转换速度。这可以最大限度地减少开销,但在Android中的速度不如在HotSpot中快(因为后者可以将这些转化为内在方法)

我想计算一下估计需要多长时间

// or use a MappedByteBuffer from a file
ByteBuffer bb = ByteBuffer.allocateDirect(3200).order(ByteOrder.nativeOrder());
while(bb.remaining() > 0) {
   float f= bb.getFloat();
}
注意:这不会运行足够长的时间,甚至不会被jit到本机代码

ByteBuffer bb = ByteBuffer.allocateDirect(3200).order(ByteOrder.nativeOrder());
for (int i = 0; i < 12; i++) {
    long start = System.nanoTime();
    bb.clear(); // simulate we have 3200 bytes to read.
    int count = 0;
    while (bb.remaining() > 0) {
        float f = bb.getFloat();
        count++;
    }
    long time = System.nanoTime() - start;
    System.out.printf("Took %,d micro-seconds to read %,d float values%n", time / 1000, count);
}
看一看。在Android上可用,您可以:

  • 将文件映射为字节缓冲区
  • 直接从所述缓冲区读取双值
您必须小心选择正确的端点。下面是一些示例代码(请注意,API将完成将字节缓冲区“转换”为双缓冲区的繁重工作,并且您可以一次性从缓冲区检索多个双缓冲区):

看一看。在Android上可用,您可以:

  • 将文件映射为字节缓冲区
  • 直接从所述缓冲区读取双值
您必须小心选择正确的端点。下面是一些示例代码(请注意,API将完成将字节缓冲区“转换”为双缓冲区的繁重工作,并且您可以一次性从缓冲区检索多个双缓冲区):


Java不能在direct上工作memory@CodeChimp. 我知道,但是JVM可以——例如使用System.arrayCopy。我不是在问指针,只是在寻找一种从字节数组初始化列表的简洁方法。对不起,当有人走进来时,我正处于回答的中间,我一定是误按了enter键……我的意思是Java不像C/C++/ObjectiveC那样在直接内存访问上工作,或者“联合”的概念其中一个值可以是这个或那个,所以它不能直接进行内存复制。您可以创建一个使用自定义序列化的类,但最终还是会在数组中循环使用字节。这是Java的一个缺点,实际上,Java不能在direct上工作memory@CodeChimp. 我知道,但是JVM可以——例如使用System.arrayCopy。我不是在问指针,只是在寻找一种从字节数组初始化列表的简洁方法。对不起,当有人走进来时,我正处于回答的中间,我一定是误按了enter键……我的意思是Java不像C/C++/ObjectiveC那样在直接内存访问上工作,或者“联合”的概念其中一个值可以是这个或那个,所以它不能直接进行内存复制。您可以创建一个使用自定义序列化的类,但最终还是会在数组中循环使用字节。这是Java的缺点之一,真的。谢谢Peter。这看起来很有趣。我试试这个,然后回来汇报。嗨,彼得。我使用了你的解决方案的一个派生,效果很好。我已经发布了最后的代码,以防其他人有类似的需求。非常感谢。如果可以避免创建和包装
字节[]
,则速度会快得多。您可以直接读取到direct buffer.Hmmmm中。很好吃,谢谢你的小费!我改变了文件解析器,创建了一个缓冲区数组,而不是byte[]数组,正如您所说,p