2013-03-03 3 views
1

Я разрабатываю приложение, и у меня есть проблема при попытке сохранить файл во внутреннем хранилище.Сбой при записи файла во внутреннее хранилище

Файл представляет собой xml и находится в папке res/raw в моем проекте. Когда приложение запускается, оно проверяет, существует ли файл или нет. Если он не существует, он копирует файл из папки res/raw во внутреннюю память, иначе он извлекает поле внутри файла для проверки его версии и, если это более новая версия, он удаляет предыдущий файл и копирует его снова ,

Ну, проблема в том, что если у меня есть новая версия, и я удалил предыдущую, когда я собираюсь ее снова скопировать, она выдает NullPointerExceptioncion, и я не могу найти проблему, m, используя тот же код для обеих ситуаций, и я не знаю, как его решить.

Это код, я использую:

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) 
+0

Попробуйте удалить 'file.delete()', он будет просто перезаписывать файл – Matt

+0

Paste LogCat в этом вопросе. –

+0

@Matt, я пробовал это, но у меня все еще такая же проблема. – Specter

ответ

1

Просто добавил свой комментарий в качестве ответа, так как он, казалось, чтобы исправить проблемы в OP и закроем этот вопрос:

Я думаю, что я знаю, в чем проблема. Вы открываете файл ресурсов и держите его в InputStream, затем вы вызываете String resourcesVersion= getFileVersion(fXmlFile);, который, я думаю, это ваша личная функция , чтобы получить версию. Я уверен, что вы продвигаете InputStream или закрываете в этой функции. Затем, когда вы позже звоните copyFile, InputStream либо поглощен, либо закрыт. Попробуйте просто удалив эту строку и поставить постоянный String resourcesVersion = "versionThatDoesn'tMatch"; только для проверки InputStream

0

Оказывается, что в заявлении

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

переменная fXmlFile - null. Вы можете проверить, почему это происходит.