2013-06-17 4 views
0

У меня есть проект (в Eclipse, но это не имеет значения) с иерархией следующим образом:Невозможно читать локальный ресурс

-src 
---Start.java 
---resources 
-----media 
-------intro.wav 
-----textures 
-------logo.png 
-------tiles.abotm 

В Start.java, я пытаюсь получить tiles.abotm как InputStream, используя Class.getResourceAsStream(String) как таковой:

public class Start 
{ 
    public static void main(String[] args) 
    { 
    try 
    { 
     InputStream in = Start.class.getResourceAsStream(
          "/resources/textures/tiles.abotm"); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    } 
} 

Простой, верно? К сожалению нет. InputStream полностью пуст с размером 0. Я также попытался открыть FileInputStream прямо до абсолютного местоположения tiles.abotm, но я получаю то же самое! Я знаю, что файл не пуст. Фактически, он имеет 2,257 байт, в соответствии с Windows, Eclipse и объектом File, используемым для создания упомянутого ранее FileInputStream. Также в соответствии с объектом File он доступен для чтения, доступен для записи, он существует, он не является каталогом, а его имя - tiles.abotm. Итак, если объект File может его прочитать, почему он не может быть открыт в InputStream ??

--EDIT-- Я забыл упомянуть, что у меня есть еще один файл в textures директории под названием logo.png, который я могу открыть и прочитать в том же порядке, без проблем вообще. Это только этот файл.

- В ответ на fge это фактический код: Loader.loadTextureMap ("/ resources/textures/tiles.abotm"); // Он вызывается отдельным методом в отдельном классе.

public class Loader{ 
    public static TextureMap loadTextureMap(String texMap){ 
    DataInputStream dis = new DataInputStream(
       Start.class.getResourceAsStream(texMap)); 
    //It then goes on to read it, but I've determined that at this point, 
       there is nothing in this DataInputStream. 
    } 
} 
+0

Когда вы говорите, «абсолютное положение», вы имеете в виду, начиная с /? – fge

+0

Посмотрите на [Как действительно прочитать текстовый файл из classpath в Java] (http://stackoverflow.com/questions/1464291/how-to-really-read-text-file-from-classpath-in-java) – neo108

+0

Я считаю, что Eclipse требует наличия ресурсов в папке ресурса, а не в исходной папке. Вы можете попробовать использовать что-то вроде '/ src/resources/textures/tiles.abotm' в качестве теста, но я бы изменил его до его выпуска. – MadProgrammer

ответ

1

После долгих обсуждений, код, который работает на OP:

final byte[] buf = new byte[1024]; // or other 
final URL url = Start.class.getResource("whatever"); 
// check for url == null 

InputStream in; 
ByteArrayOutputStream out; 

// I really wish this syntax was something else, it sucks 
try (
    in = url.openStream(); 
    out = new ByteArrayOutputStream(); 
) { 
    int count; 
    while ((count = in.read(buf)) != -1) 
     out.write(buf, 0, count); 
    out.flush(); 
} catch (IOException e) { 
    // handle e here 
} 

final ByteBuffer buffer = ByteBuffer.wrap(out.toByteArray()); 
// use the buffer 
+0

Я сделал это, и он сработал, но этот файл будет упакован в банку. Итак, я не могу прочитать это в финальной программе. –

+0

Хорошо, как вы строите материал текстурной карты? – fge

+0

Я сделал свою собственную программу для этого. Все это основано на моей собственной версии сериализуемых объектов (называемых BSOs - Basic Serializable Objects), и весь этот файл представляет собой два целых числа и изображение. Это проблема? Является ли байт-значение 0 в самом начале испортить его? Потому что в этом файле первые 8 байтов 0 0 0 16 0 0 0 16. –

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