我有一个项目(在Eclipse中,但这并不重要),其层次结构如下:
-src
---Start.java
---resources
-----media
-------intro.wav
-----textures
-------logo.png
-------tiles.abotm
在Start.java
中,我试图使用Class.getResourceAsStream(String)
将tiles.abotm
作为输入流:
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
的绝对位置,但我得到了同样的东西!我知道文件不是空的。实际上,根据Windows、Eclipse和前面提到的用于创建FileInputStream的File对象,它有2257字节。同样根据File对象,它是可读的,可写的,它存在,它不是目录,它的名字是tiles.abotm
。那么,如果File对象可以读取它,为什么不能在InputStream中打开它呢?
——编辑我忘了提到我在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.
}
}
经过大量讨论,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