2014-09-15 3 views
0

У меня есть Java-программа, которая должна читать файл с ресурса в JAR, и он берет его только через байт []. Моя проблема заключается в преобразовании файла ресурсов из папки в проекте (т. Е. Tools/test.txt) в байт []. Я попробовал следующее (дал «неопределенными для типа» ошибка):Как получить файл ресурсов Java в байт []?

final byte[] temp = new File("tools/test.txt").getBytes(); 

Другой метод, который я пытался привела не будучи в состоянии найти файл:

FileOutputStream fos = new FileOutputStream("tools/test.txt"); 
byte[] myByteArray = null; 
fos.write(myByteArray); 
fos.close(); 
System.out.println("Results = " + myByteArray); 

И, наконец, с помощью InputStream и BufferedReader , Это фактически дало содержимое файла при запуске программы из Eclipse, но получилось как null при запуске его как банке (я предполагаю, что он также не читает файл).

 InputStream is = null; 
     BufferedReader br = null; 
     String line; 
     ArrayList list = new ArrayList(); 
     try { 
       is = Main.class.getResourceAsStream("tools/test.txt"); 
       br = new BufferedReader(new InputStreamReader(is)); 
       while (null != (line = br.readLine())) { 
       list.add(line); 
       System.out.println("Output:" + line); 
       }  

       while (null == (line = br.readLine())) { 
        System.out.println("Error loading file:" + line); 
        }  

     } 
     catch (Exception ef) { 
      ef.printStackTrace(); 
      System.out.println("Output:" + ef); 
     } 

Так что мой вопрос, если у меня есть папка с именем «инструменты» и есть файл с именем «test.txt», какой код я бы использовать, чтобы превратить его в байт [] и по-прежнему работать при компиляции в файл Jar?

ответ

3
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    InputStream in = Main.class.getResourceAsStream("/tools/test.txt"); 
    byte[] buffer = new byte[4096]; 
    for (;;) { 
     int nread = in.read(buffer); 
     if (nread <= 0) { 
      break; 
     } 
     baos.write(buffer, 0, nread); 
    } 
    byte[] data = baos.toByteArray(); 
    String text = new String(data, "Windows-1252"); 
    Byte[] asByteObjects = new Byte[data.length]; 
    for (int i # 0; i < data.length: ++i) { 
     asByteObjects[i] = data[i]; 
    } 

Без заголовка заголовка путь будет относиться к пакету класса. ByteArrayOutputStream служит для сбора для байта [].

Если байты представляют собой текст, это некоторая кодировка, можно превратить его в строку. Здесь с Windows Latin-1.

+0

Благодарим вас за такой быстрый ответ. Я пробовал ваш код. Тем не менее, я получаю немного странный ответ. Я попытался напечатать результат «данных», и он дал мне «[B @ 723279cf», что странно. Текстовый файл содержит около 40 строк текста, ни один из которых не содержит этих символов. Я не совсем уверен, что происходит, может быть, я все испортил косые черты? – steven

+0

Это toString() из байта [] "[B". Я продлеваю свой ответ. –

+0

При дальнейшем тестировании я заметил что-то. при печати «baos» после строки baos.write (buffer, 0, nread); он имеет полный ввод файла, однако при преобразовании его в «данные», похоже, проблема. Я тестирую это, когда я иду сюда. – steven

0

Вы попробовали Scanner.nextByte()? создайте новый сканер с файлом, который вы хотите разобрать как вход, и используйте цикл for для создания вашего массива.

+0

Не могли бы вы дать мне ссылку или небольшой пример того, как это сделать. Использование байтовых массивов для меня довольно нова, и я уже потратил часы, пытаясь понять это. – steven

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