5

我目前正在编写一个 LibGDX 游戏,我需要为 spritesheet 打开一个 XML 文件。不幸的是,当我尝试打开文件时,我得到一个IOException. 文件存在于正确的位置,项目已清理并保持最新等。

这是踢球者:LibGDX 将打开并显示同一目录中的图像文件,实际上会在它自己的FileHandle对象中获取 XML 文件(我已经让它的大小和它匹配)。然而,当我将文件发送到 SAX 解析器时,我得到一个异常,导致我回到文件,说它无法打开它。

这是ClipSprite类中的问题代码行:

private void parseConfigFile(FileHandle file) throws ParserConfigurationException, SAXException 
{
    //Use a SAX parser to get the data out of the XML file.
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();
    XMLConfigHandler handler = new XMLConfigHandler();

    //Parse through the document
    try
    {
        parser.parse(file.path(),handler); //IOException here
    }

这是我在create主 LibGDX 类的方法中选择游戏中文件的代码

    //This loads a png file
    texture = new Texture(Gdx.files.internal("data/graphics/CDE1/CDE1.png"));
    texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);      
    TextureRegion region = new TextureRegion(texture, 0, 0, 512, 275);

     //Here I load the xml file and it tells me how many bytes it is
    Gdx.app.error("File","xml bytes:"+Gdx.files.internal("data/graphics/CDE1/CDE1.xml").length());

     //Here I load the same file and it crashes
     //Note that it looks in the subdirectory and finds /CDE1.xml properly
    animation = new ClipSprite("data/graphics/CDE1");

来自 logcat 的错误:

java.io.IOException: Couldn't open data/graphics/CDE1/CDE1.xml

为什么它可以识别文件,但我仍然收到关于无法打开它的 IOExceptions?感谢您的帮助,如有必要,我会提供更多信息。

4

1 回答 1

8

只是为了将上面的所有评论合并成一个答案,以防其他人遇到这种情况或类似情况:

尝试Gdx.files.local()加载您的文件,而不是Gdx.files.internal(),因为“内部”文件是从(压缩的)APK 中读出的,并且可能不像普通文件那样“可见”。(这在很大程度上取决于您传递路径名的代码想要使用它做什么。)

对于 libGDXFileHandle file对象,使用file.file()传递文件句柄,而不是file.path()传递可能被误解的字符串。

对于 libGDXFileHandle file使用直接file.read()将一个InputStream传递给消费者(而不是传递一个字符串或文件句柄并期望他们打开它)。

libGDX“内部”文件映射到 Android AssetManager 文件,因此在某些情况下它们可能有点不稳定。具体来说,它们可以被压缩并存储在传统文件读取功能中,或者不可见。.jar.apk

于 2013-01-28T22:23:55.283 回答