2010-08-13 4 views
1

У меня есть бинарный файл 16 МБ, и я хочу читать байты без использования какого-либо цикла. например, если я хочу читать 16 байт, я могу передать 16 некоторым методам (если они есть), и он дает мне мой желаемый результат ... прямо сейчас я использую цикл для чтения байтов, но мое приложение настолько велико, что я боюсь, что он не становится медленным. Как бы то ни было, дайте мне немного намека.чтение байтов без использования какого-либо цикла

спасибо большое.

+5

Как вы думаете, что происходит в магическом методе, в котором вы проходите число? –

+0

hahahaha, очевидно, цикл: d – sajjoo

+0

, но мой руководитель команды заставлял меня искать какую-то вещь, которую я спросил у него в методе, там должен быть цикл, но он сказал нет, это может быть иначе. – sajjoo

ответ

0
import java.io.*; 

public class NoLoopReader { 
    public static void main (String[] args) throws Exception { 
    String fileName = args[0]; 
    InputStream is = new BufferedInputStream(new FileInputStream(fileName)); 
    File file = new File(fileName); 
    int size = (int)file.length(); 

    byte[] buffer = new byte[size]; 
    is.read(buffer,0,size); 
    } 
} 
+0

Это 'is.read (byte [], int, int)' содержит цикл for в реализации. –

+0

упаковка в BufferedInputStream - плохая идея и ничего не помогает. – bestsss

2

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

Действительный ответ 1

public byte[] readWithNoLoop(InputStream in, int size) { 
    byte[] result = new byte[16777216]; // 16 MByte 
    byte b = 0; 

    if ((b = in.read()) >= 0) result[0] = b; 
    if ((b = in.read()) >= 0) result[1] = b; 
    if ((b = in.read()) >= 0) result[2] = b; 

    // ... 

    if ((b = in.read()) >= 0) result[16777215] = b; 

    return b; 
} 

Действительный ответ 2

использовать массовые параллельные системы, которые могут читать файл параллельно. Вам нужны 16777216 процессоров и поддерживающая система хранения файлов, но вы можете читать в O (1) (теоретически).


Если вы столкнулись с массой проблем сисем при чтении файла, проверьте, если вы используете BufferedInputStream, чтение байт из «нормального» потока убивает производительность. (Example)

Если это все еще не помогает, ознакомьтесь с разделом java.nio. Они могут отображать файлы в память. Grep example должен дать вам направление.

1

Вы можете использовать BufferedInputStream#read(byte[] b, int off, int len)

+0

Да, но: 1) реализация этого содержит петли; 2) Вам нужно зациклиться на своем клиентском коде, чтобы безопасно читать его. Я не говорю, что это плохая идея, я указываю, что требования являются бессмысленными, и лучшим ответом будет «WTF, вы хотите сделать это для», а не пытаться соответствовать им. –

+0

Да, я думал, что требования касались чтения n байтов в одном вызове вместо неэффективного чтения их по одному. – hhbarriuso

0

Вы можете проверить размер файла на диске, создать соответствующий буфер и использовать этот метод для чтения, чтобы сделать объемную нагрузку (как вы можете видеть, что это вызывает родные readBytes). Конечно, я понятия не имею, если нет петли внутри readBytes (скорее всего, есть, но это может зависеть от реализации JVM) ... :)

В FileInputStream

/** 
* Reads up to <code>b.length</code> bytes of data from this input 
* stream into an array of bytes. This method blocks until some input 
* is available. 
* 
* @param  b the buffer into which the data is read. 
* @return  the total number of bytes read into the buffer, or 
*    <code>-1</code> if there is no more data because the end of 
*    the file has been reached. 
* @exception IOException if an I/O error occurs. 
*/ 
public int read(byte b[]) throws IOException { 

возврата readBytes (b, 0, b.length); }

/** 
* Reads up to <code>len</code> bytes of data from this input stream 
* into an array of bytes. If <code>len</code> is not zero, the method 
* blocks until some input is available; otherwise, no 
* bytes are read and <code>0</code> is returned. 
* 
* @param  b  the buffer into which the data is read. 
* @param  off the start offset in the destination array <code>b</code> 
* @param  len the maximum number of bytes read. 
* @return  the total number of bytes read into the buffer, or 
*    <code>-1</code> if there is no more data because the end of 
*    the file has been reached. 
* @exception NullPointerException If <code>b</code> is <code>null</code>. 
* @exception IndexOutOfBoundsException If <code>off</code> is negative, 
* <code>len</code> is negative, or <code>len</code> is greater than 
* <code>b.length - off</code> 
* @exception IOException if an I/O error occurs. 
*/ 
public int read(byte b[], int off, int len) throws IOException { 

возврата readBytes (б, выключена, LEN); }

Смежные вопросы