1

アプリケーションを開発していますが、ファイルを内部ストレージに保存しようとすると問題が発生します。

ファイルは xml で、私のプロジェクトの res/raw フォルダーにあります。アプリケーションが起動すると、ファイルが存在するかどうかがチェックされます。存在しない場合は、ファイルを res/raw フォルダーから内部ストレージにコピーします。存在しない場合は、ファイル内のフィールドを取得してバージョンを確認し、新しいバージョンの場合は、以前のファイルを削除して再度コピーします.

問題は、新しいバージョンがあり、以前のバージョンを削除した場合、もう一度コピーしようとすると、NullPointerExceptioncion がスローされ、問題が見つからないことですが、同じものを使用しています両方の状況のコードであり、解決方法がわかりません。

これは私が使用しているコードです:

    private void writeFileToInternalStorage() {  
        FileOutputStream fos = null;
    try {
        InputStream fXmlFile = getResources().openRawResource(R.raw.partidos);
        File file = getBaseContext().getFileStreamPath("file.xml");
        if(file.exists()) {
            String resourcesVersion= getFileVersion(fXmlFile);
            String localVersion = getFileVersion(new FileInputStream(file));
            if (!resourcesVersion.equalsIgnoreCase(localVersion)) {
                //file.delete();
                fos = openFileOutput("file.xml", Context.MODE_PRIVATE);
                copyFile(fos, fXmlFile);
            }
        }
        else {
            fos = openFileOutput("file.xml", Context.MODE_PRIVATE);
            copyFile(fos, fXmlFile);
        }
    }
    catch(IOException e) {
        e.printStackTrace();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    }  

    protected void copyFile(OutputStream fos, InputStream fXmlFile) throws IOException {  
        byte[] buffer = new byte[1024];  
        int bytesRead = 0;  
        while((bytesRead = fXmlFile.read(buffer)) > 0){  
            fos.write(buffer, 0, bytesRead);  
        }  
    }  

    protected String getFileVersion(InputStream file) {
        String version = null;
        try {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(file);
            doc.getDocumentElement().normalize();
            version = doc.getElementsByTagName("numero").item(0).getFirstChild().getNodeValue();
        }
        catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return version;
    }

それを解決するためのヒントはありますか??

PS: このステートメントで例外がスローされます。

while((bytesRead = fXmlFile.read(buffer)) > 0) 

PS2: これは LogCat のコードです。

03-03 20:47:07.140: W/System.err(2166): java.lang.NullPointerException: asset
03-03 20:47:07.148: W/System.err(2166):     at android.content.res.AssetManager.readAsset(Native Method)
03-03 20:47:07.158: W/System.err(2166):     at android.content.res.AssetManager.access$700(AssetManager.java:35)
03-03 20:47:07.168: W/System.err(2166):     at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:573)
03-03 20:47:07.168: W/System.err(2166):     at com.jfma75.myapp.MyApp.copyFile(MyApp.java:291)
03-03 20:47:07.178: W/System.err(2166):     at com.jfma75.myapp.MyApp.writeFileToInternalStorage(MyApp.java:263)
03-03 20:47:07.178: W/System.err(2166):     at com.jfma75.myapp.MyApp.onCreate(MyApp.java:62)
03-03 20:47:07.188: W/System.err(2166):     at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999)
03-03 20:47:07.188: W/System.err(2166):     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151)
03-03 20:47:07.198: W/System.err(2166):     at android.app.ActivityThread.access$1300(ActivityThread.java:130)
03-03 20:47:07.198: W/System.err(2166):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
03-03 20:47:07.208: W/System.err(2166):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-03 20:47:07.208: W/System.err(2166):     at android.os.Looper.loop(Looper.java:137)
03-03 20:47:07.218: W/System.err(2166):     at android.app.ActivityThread.main(ActivityThread.java:4745)
03-03 20:47:07.218: W/System.err(2166):     at java.lang.reflect.Method.invokeNative(Native Method)
03-03 20:47:07.228: W/System.err(2166):     at java.lang.reflect.Method.invoke(Method.java:511)
03-03 20:47:07.237: W/System.err(2166):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-03 20:47:07.237: W/System.err(2166):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-03 20:47:07.248: W/System.err(2166):     at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

1

OPの問題が修正されたようで、この質問を閉じるため、回答として私のコメントを追加しました。

私は問題が何であるかを知っていると思います。リソースファイルを開いて保持し、InputStreamそれを呼び出しますString resourcesVersion= getFileVersion(fXmlFile);。これは、バージョンを取得するための独自のプライベート関数だと思います。私はあなたInputStreamがその機能でそれを進めるか閉じるかを賭けています。その後、後で電話をかけるとcopyFileInputStreamが消費されるか閉じられます。String resourcesVersion = "versionThatDoesn'tMatch"; その行を削除して、テストのためだけに定数を入れてみてくださいInputStream

于 2013-03-09T17:04:37.110 に答える
0

声明の中で

InputStream fXmlFile = getResources().openRawResource(R.raw.partidos);

変数fXmlFilenullです。なぜそうなるのか確認できます。

于 2013-03-04T10:02:19.233 に答える