2013-01-27 36 views
5

Tôi hiện đang viết một trò chơi LibGDX và tôi cần mở một tệp XML cho một spritesheet. Thật không may, khi tôi cố gắng để mở tập tin, tôi nhận được một IOException. Các tệp tồn tại ở đúng nơi, dự án đã được dọn dẹp và cập nhật, v.v.Android không thể mở tệp bằng LibGDX

Đây là phần khởi động: LibGDX sẽ mở và hiển thị tệp hình ảnh trong cùng một thư mục và trên thực tế sẽ lấy tệp XML trong riêng mình FileHandle đối tượng (Tôi đã có nó logcat kích thước và nó phù hợp). Tuy nhiên, khi tôi gửi tệp đến một trình phân tích cú pháp SAX, tôi nhận được một ngoại lệ dẫn tôi trở lại tệp tin nói rằng nó không thể mở nó.

Đây là dòng vấn đề mã bên trong lớp 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 
    } 

Và đây là đoạn code mà tôi chọn tập tin trong các trò chơi trong phương pháp create trong lớp LibGDX chính

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

Lỗi từ logcat:

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

Tại sao nó có thể ide ntify tập tin, nhưng tôi vẫn nhận được IOExceptions về việc không thể mở nó? Cảm ơn sự giúp đỡ và tôi sẽ cung cấp thêm thông tin nếu cần.

+2

Đường dẫn tệp trong thông báo IOException trông quá ngắn. Nó sẽ có một tiền tố dài hơn tại thời điểm đó, tôi nghĩ rằng ... Các tập tin nội bộ cũng là một chút chiến thắng với các tìm kiếm classpath. Thay vào đó, việc sử dụng "Gdx.files.local()" có hoạt động không? –

+0

Trình xử lý tệp có cố gắng phân tích nội dung của tệp giống với nội dung của tệp mà bạn kiểm tra thành công độ dài của tệp không? –

+0

@RodHyde FileHandle nhận được các byte đúng. SAX Parser lấy File mặc dù (FileHandle là một điều LibGDX), vì vậy tôi cung cấp cho nó FileHandle.file(). – GraphicsMuncher

Trả lời

8

Chỉ cần để kết thành một khối tất cả các ý kiến ​​trên vào một câu trả lời duy nhất trong trường hợp người khác chạy vào này hoặc cái gì đó tương tự:

Hãy thử Gdx.files.local() để tải tập tin của bạn, thay vì Gdx.files.internal(), như các tập tin "nội bộ" được đọc ra của (nén) APK và có thể không được "hiển thị" như một tệp thông thường. (Điều này phụ thuộc rất nhiều vào những gì mã bạn đang đi qua một tên đường dẫn để muốn làm gì với nó.)

Đối với một libGDX FileHandle file đối tượng sử dụng file.file() để thông qua một tập tin xử lý, thay vì file.path() để vượt qua một chuỗi mà có thể nhận được hiểu sai.

Đối với một libGDX FileHandle file sử dụng file.read() để chuyển trực tiếp cho người tiêu dùng (thay vì truyền chuỗi hoặc xử lý tệp và hy vọng họ mở nó).

Tệp libGDX "nội bộ" ánh xạ tới Android AssetManager file, để chúng có thể là bit wonky trong some cases. Cụ thể, chúng có thể được nén và lưu trữ trong một số .jar hoặc .apk và không hiển thị với các chức năng đọc tệp truyền thống.

+0

Nhận xét đáng chú ý ở trên: 'file.file()' dẫn đến 'IOException' sau, nhưng' file.read() 'thì không. – GraphicsMuncher

Các vấn đề liên quan