0

次のような階層を持つプロジェクトがあります(Eclipseでは、それは問題ではありません):

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

では、次のように使用して InputStream としてStart.java取得しようとしています:tiles.abotmClass.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が、同じ結果が得られました。ファイルが空ではないことはわかっています。実際、Windows、Eclipse、および前述の FileInputStream の作成に使用される File オブジェクトによると、2,257 バイトあります。また、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 に答える