2011-01-22 5 views
2
for (String name : filenames) { 
FileInputStream in = new FileInputStream(input.readUTF()); 
    int byteCounter = 0; 
    int rowCounter = 0; 
    long bufferCounter = 0; 
    byte[] b = new byte[8]; 
    int read; 

    //in.skip(10); 
    //while((read = in.read()) != -1){ 
    while((read = in.read(b, 0, 10)) != -1){ 
     byteCounter ++; 
     if (byteCounter != 1000){ 
      if (rowCounter == 16){ 
       System.out.println("\n"); 
       rowCounter = 0; 
      } 
     System.out.print(Integer.toHexString(read) + "\t"); 
      bufferCounter ++; 
      rowCounter ++; 
     }else{ 
       byteCounter = 0; 
       try{ 
        Thread.sleep(200); 
       }catch(InterruptedException e) { 
       } 
     } 
    } 
    System.out.println("\n"+"================"+"\n"); 
} 

Привет, я надеялся, что кто-то сможет помочь мне с проблемой, с которой я столкнулся. Я пытаюсь запустить свою программу в первых 10 байтах указанного файла. Я могу заставить его работать с skip(), но, очевидно, это делает противоположное тому, что я хочу (он удаляет первые 10 вместо этого) Я искал все безрезультатно, если вы можете помочь мне, будь велика. Вероятно, вы можете увидеть, что я пытался ввести read (b, off, len) в код уже, но это просто приводит к случайным символам в качестве вывода, а не к фактическим шестнадцатеричным символам, которые я хочу 74 65 71 и т. Д. (Edit: These случайные символы кажутся шестнадцатеричным кодом для количества прочитанных байтов. Таким образом, для текстового файла с 23 шестнадцатеричными символами в нем он генерирует aa 3 (или другими словами: 10,10,3 = 23)Чтение первых 10 байтов файла в Java

+0

Я уверен, что он терпит неудачу в случае 'in.read (b, 0, 10) 'чтение менее 10 байт. Это практически никогда не бывает, но нет никакой гарантии. – maaartinus

+0

Я вижу, что мой предыдущий комментарий может быть неясным: я имею в виду: он практически никогда не случается * в случае, если имеется больше байтов *, поскольку данные передаются с диска в несколько раз по размеру сектора. – maaartinus

+0

: S Это полностью потеряло меня сейчас. Вы говорите, что что-то не так с/отсутствием кода? Извините, что вам нужно спросить, но вы знаете ... – user585522

ответ

1

проблема здесь

System.out.print(Integer.toHexString(read) + "\t"); 

read содержит количество байт, фактически считываемых из потока. Teh байт в массиве b.

Кстати: ваш массив имеет размер 8. вы должны увеличить его до 10, если вы хотите читать 10 байт!

+0

Эй, жаль, спасибо за ответ так быстро. Да, я заметил 8 вещей (это просто я беспорядок, отчаянно пытаясь заставить его работать lol) Я попытался изменить его, так что теперь он говорит System.out.print (Integer.toHexString (b) + "\ t") ; но это приводит к ошибке «toHexString (int) в java.lang.Integer нельзя применить к (byte [])» – user585522

+0

попытайтесь использовать [encodeHexString (byte)] (http://commons.apache.org/codec/apidocs /org/apache/commons/codec/binary/Hex.html#encodeHexString (byte [])) из [apache commons codec lib] (http://commons.apache.org/codec/download_codec.cgi) – lweller

+0

Где именно часть encodeHexString (b) идет? Извините, если это кажется глупым вопросом, но я попытался поместить его в part.out.println и другие места тоже, но безрезультатно: S – user585522

3
byte[] b = new byte[10]; 
new DataInputStream(new FileInputStream(input.readUTF())).readFully(b); 

Это самый простой способ, но он бросает, если имеется менее 10 байт. Если вы этого не хотите, используйте цикл. Так или иначе, я не понимаю, что вы делаете, это действительно не похоже на чтение первых 10 байтов: if (byteCounter != 1000)

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