2017-02-17 34 views
0

Я пытаюсь написать программу, которая может принимать по 1 бит за раз, а затем записывать 2 байта в файл после того, как были собраны 16 бит.Java - BufferOverflowException при попытке записи в файл 2 или более раз

Вот основной код:

public void addBit(int bit) throws IOException{ 
    if(this.byteholder.length() < 16){ 
     this.byteholder += "" + bit; 
    } 
    else{ 
     write(); 
    } 
} 

public void write() throws IOException{ 
    if(this.byteholder.length() == 16){ 
     System.out.println(this.byteholder); 
     int a = Integer.parseInt(byteholder, 2); 
     System.out.println(Integer.toBinaryString(a)); 
     ByteBuffer bytes = ByteBuffer.allocate(2).putInt(a); 
     byte[] byteArray = bytes.array(); 

     out.write(byteArray); 
     out.flush(); 
     this.byteholder = ""; 
    } 


} 

public static void main(String[] args) { 
    try { 
     File f = new File("test"); 
     BitFileWriter out = new BitFileWriter(f); 
     for(int i=0; i<2; i++){ 
      out.addBit(1); 
      out.addBit(0); 
      out.addBit(0); 
      out.addBit(1); 
      out.addBit(0); 
      out.addBit(1); 
      out.addBit(1); 
      out.addBit(0); 
      out.addBit(1); 
      out.addBit(0); 
      out.addBit(0); 
      out.addBit(1); 
      out.addBit(0); 
      out.addBit(1); 
      out.addBit(1); 
      out.addBit(0); 
     } 

     out.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

основной метод используется только для тестирования методов выше. Переменная «out» - это FileOutputStream, «byteholder» - это строка, которая содержит двоичный код, а файл «test» - это случайный пустой файл, который у меня есть в моем проекте проекта Eclipse.

Проблема, которую я получаю, заключается в том, что если я запускаю свой тестовый код более одного раза (цикл кода с добавлением более одного раза), я получаю исключение BufferOverflowException, и я понятия не имею, почему. Я не уверен, как правильно использовать ByteBuffer, но мне нужно, чтобы он мог писать по 2 байта в файл за раз. Может ли кто-нибудь помочь? Благодарю.

Также вопрос BONUS! Всякий раз, когда я успешно запускаю свой тестовый код, я вижу, что размер файла в моем «тестовом» файле не изменяется (по-прежнему говорит 0 байтов). Зачем?. Я запускаю Windows 10 бит.

EDIT: Вот мой трассировки стека:

Exception in thread "main" java.nio.BufferOverflowException 
at java.nio.Buffer.nextPutIndex(Unknown Source) 
at java.nio.HeapByteBuffer.putInt(Unknown Source) 
at CompPck.BitFileWriter.write(BitFileWriter.java:30) 
at CompPck.BitFileWriter.addBit(BitFileWriter.java:21) 
at CompPck.BitFileWriter.main(BitFileWriter.java:66) 
+2

У вас есть трассировка стека? –

+0

@SteveSmith Упс, спасибо, что напомнил мне. Теперь я отправил трассировку стека. – Schytheron

ответ

1

ByteBuffer.allocate(2).putInt(a);

Вы отводим 2 байта для междунар который является 4 байта. Чего вы ожидаете? Используйте shortputShort), если вы хотите использовать 16-битные значения.

Если вы получаете проблемы с использованием короткого из-за проблемы знаковости (1001011010010110 считаются превышать значение короткого), вы можете сохранить ваш a в int, но записать значение с putShort((short)a).

Что касается вашего файла, который остается пустым, вы, вероятно, не закрываете ресурсы должным образом в своем методе close(), или вы забываете написать ваш буфер.

+0

Прежде чем я попытался использовать Int, я попытался использовать Short. Однако, когда я использовал Short, я получил «NumberFormatException: значение вне диапазона». Значение: «1001011010010110 Ошибка« Radix: 2 ». Любая идея почему? – Schytheron

+0

См. Мое редактирование. Вы можете продолжать использовать 'int', но пишите в буфер как« короткий ». – Kayaman

+0

Спасибо, что исправил это! Просто небольшой вопрос ... Я совершенно новый для Java (и программирования вообще). Что должно быть написано в моем файле точно? Что должен показать мой файл? Сейчас он показывает только две строки: «-» (без кавычек ofc). Размер файла теперь показывает 2 байта, поэтому я думаю, что я сделал это правильно ... – Schytheron

0

Относительно того, почему ваш выходной файл остается пустым:

В первый раз вы называете метод write() на данный момент, что вы пытаетесь добавить 17 бит (и потерять его кстати).

Если вы выполняете только одну итерацию (т. Е. Только пытаетесь записать 16 бит), ваш метод записи никогда не вызывается. Поэтому BufferOverflowException не отображается, но и ничего не записывается в файл.

+0

Ах спасибо, что исправлена ​​эта часть сейчас. Все еще продолжайте получать BufferOverflowException, хотя ... – Schytheron

+0

Nvm Теперь исправлено! :) – Schytheron