Как прочитать бин-файл в байтовый массив? - PullRequest
1 голос
/ 03 октября 2009

У меня есть файл bin, который мне нужно преобразовать в байтовый массив. Может кто-нибудь сказать мне, как это сделать?

Вот что у меня есть:

File f = new File("notification.bin");
is = new FileInputStream(f);

long length = f.length();

/*if (length > Integer.MAX_VALUE) {
    // File is too large
}*/

// Create the byte array to hold the data
byte[] bytes = new byte[(int)length];

// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
    offset += numRead;
}

// Ensure all the bytes have been read in
if (offset < bytes.length) {
    throw new IOException("Could not completely read file "+f.getName());
}

Но это не работает ...

Kaddy

Ответы [ 6 ]

2 голосов
/ 03 октября 2009

попробуйте использовать это

public byte[] readFromStream(InputStream inputStream) throws Exception
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(baos);
    byte[] data = new byte[4096];
    int count = inputStream.read(data);
    while(count != -1)
    {
        dos.write(data, 0, count);
        count = inputStream.read(data);
    }

    return baos.toByteArray();
}

Кстати, вы хотите код Java или код C ++. Увидев код в вашем вопросе, я предположил, что это код Java, и поэтому дал на него ответ Java

1 голос
/ 03 октября 2009

В Java простое решение:

InputStream is = ...
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] data = new byte[4096];  // A larger buffer size would probably help
int count; 
while ((count = is.read(data)) != -1) {
    os.write(data, 0, count);
}
byte[] result = os.toByteArray();

Если вход является файлом, мы можем предварительно выделить байтовый массив правильного размера:

File f = ...
long fileSize = f.length();
if (fileSize > Integer.MAX_VALUE) {
    // file too big
}
InputStream is = new FileInputStream(f);
byte[] data = new byte[fileSize];
if (is.read(data)) != data.length) {
    // file truncated while we were reading it???
}

Однако, возможно, есть более эффективный способ выполнить эту задачу с помощью NIO.

1 голос
/ 03 октября 2009

Вам, вероятно, лучше использовать файл с отображенной памятью. См этот вопрос

0 голосов
/ 03 октября 2009

Попробуйте библиотеку с открытым исходным кодом apache commons-io IOUtils.toByteArray (InputStream) Вы не первый и не последний разработчик, которому нужно читать файл, и вам не нужно каждый раз изобретать его заново.

0 голосов
/ 03 октября 2009

В этом ответе Я прочитал с URL

Вы можете изменить его так, чтобы InputStream был из файла вместо URLConnection.

Что-то вроде:

    FileInputStream inputStream = new FileInputStream("your.binary.file");

    ByteArrayOutputStream output = new ByteArrayOutputStream();
    byte [] buffer               = new byte[ 1024 ];

    int n = 0;
    while (-1 != (n = inputStream.read(buffer))) {
       output.write(buffer, 0, n);
    }
    inputStream.close();

и т.д.

0 голосов
/ 03 октября 2009

Если вам действительно не нужно делать это таким образом, возможно, упростите то, что вы делаете.

Выполнение всего в цикле for может показаться очень изящным способом сделать это, но это стреляет себе в ногу, когда вам нужно отладить и не сразу увидеть решение.

...