gpt4 book ai didi

java - 是否可以随机访问Java文件中存储的序列化数组中的特定索引值?

转载 作者:行者123 更新时间:2023-12-02 12:21:44 24 4
gpt4 key购买 nike

我正在尝试访问序列化数组对象文件中的数组索引位置。我不想反序列化整个数组对象然后访问该数组。我已经能够在 C++ 中使用eekg 做到这一点,但在 Java 中还没有成功。

<小时/>

我尝试过使用RandomAccessFile [请参阅以下代码],但我无法访问数组中的特定位置并将其转换为实际值[请参阅代码注释-//Random Access Reading(读取特定位置) )]。让我知道这个问题的解决方案。

代码-

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.RandomAccessFile;
import java.io.Serializable;
import java.util.Arrays;

class Bitmaps implements Serializable
{
int bitmapArray[] = new int[5];

@Override
public String toString() {
return "Bitmaps [bitmapArray=" + Arrays.toString(bitmapArray) + "]";
}
}
public class RandomAccess2 {

public static void main(String[] args) {

try {
Bitmaps bitmaps = new Bitmaps();

String filename = "blocksinfo.txt";
String workingDirectory = System.getProperty("user.dir");
String FILEPATH = workingDirectory + "\\" + filename; //C:\\Users\ashis\workspace\hackerrank1\src\hackerrank1\blocksinfo.txt';

//Initialize array with 100....104
int cnt=100;
for(int i=0;i<5;i++)
bitmaps.bitmapArray[i]=cnt++;


//Serialize array and store in a file
serializeObject(bitmaps, FILEPATH);
int objLength = sizeof(bitmaps); //function to calculate size of serialized array
System.out.println("Length in bytes after serialization=>"+objLength);


//System.out.println(new String(readFromFile(FILEPATH, 0, ewahBitmap1.sizeInBytes())));

try {

//Random Access Reading (Read all contents)
byte[] byteArray = readFromFile(FILEPATH, 0, objLength);
ByteArrayInputStream in = new ByteArrayInputStream(byteArray);
ObjectInputStream is = new ObjectInputStream(in);
Bitmaps bitmaps2 = (Bitmaps) is.readObject();
System.out.println("Full Random Access Reading=>"+bitmaps2);


//Random Access Reading (Read specific position)
byte[] byteArray1 = readFromFile(FILEPATH, 98, 2);
ByteArrayInputStream in1 = new ByteArrayInputStream(byteArray1);
ObjectInputStream is1 = new ObjectInputStream(in1);
int val = (int) is1.readObject();
System.out.println("Partial Random Access Reading=>"+val);

} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


//writeToFile(FILEPATH, ewahBitmap1.toString(), 0);
} catch (IOException e) {
e.printStackTrace();
}

}

private static byte[] readFromFile(String filePath, int position, int size)
throws IOException {

RandomAccessFile file = new RandomAccessFile(filePath, "r");
file.seek(position);
byte[] bytes = new byte[size];
file.read(bytes);
file.close();
return bytes;

}

public static void serializeObject(Object bitmap, String fileName) throws IOException
{
FileOutputStream fos = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(bitmap);
oos.close();

}

public static int sizeof(Object obj) throws IOException {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);

objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();

return byteOutputStream.toByteArray().length;
}
}

最佳答案

不,这是不可能的。它不是随机访问格式。您必须反序列化数组,然后将其索引到内存中。

关于java - 是否可以随机访问Java文件中存储的序列化数组中的特定索引值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45719302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com