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 和用于创建前面提到的 FileInputStream 的 File 对象。同样根据 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.
  }
}
4

1 回答 1

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
于 2013-06-17T06:56:12.003 回答