安卓无法使用 LibGDX 打开文件

5
我目前正在编写一个LibGDX游戏,需要打开一个精灵表的XML文件。不幸的是,当我尝试打开文件时,会出现IOException。文件存在于正确的位置,项目已经清理并且是最新的等等。
关键在于:LibGDX可以打开和显示同一目录中的图像文件,并且实际上会在自己的FileHandle对象中获取XML文件(我已经让它logcat大小并且匹配)。但是,当我将文件发送到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
    }

以下是在主要的LibGDX类中的create方法中选择游戏文件的代码:

    //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");

日志记录错误信息:

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

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

2
IOException消息中的文件路径看起来太短了。我认为在那个点上应该有一个更长的前缀...内部文件在使用类路径搜索时也有些问题。尝试使用“Gdx.files.local()”是否可行? - P.T.
在尝试解析文件内容的文件句柄是否与成功检查其长度的文件句柄相同? - R Hyde
@P.T. 两种方法都被接受(可以编译),但我已经尝试了两种方法,但都没有成功。 - GraphicsMuncher
我使用 Gdx.files.internal(path) 来获取 FileHandle,然后使用 .file() 来获取 File - GraphicsMuncher
你正在运行哪个版本的安卓? - P.T.
显示剩余6条评论
1个回答

8

为了将上面的所有评论汇总成一个答案,以防其他人遇到类似的问题:

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

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

对于libGDX的FileHandle file,请使用file.read()直接向使用者传递InputStream(而不是传递字符串或文件句柄并期望它们打开它)。

libGDX中的“内部”文件对应于Android的AssetManager文件,因此它们在某些情况下可能会有一些问题。具体来说,它们可能被压缩并存储在.jar.apk文件中,无法通过传统的文件读取函数进行访问。


上面值得注意的评论是:file.file() 会在后面导致 IOException 异常,但 file.read() 没有。 - GraphicsMuncher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接