我正在开发一个应用程序,当我尝试将文件保存到内部存储器时,我遇到了问题。
该文件是一个xml,它位于我项目的res / raw文件夹中。应用程序启动时,它会检查文件是否存在。如果它不存在,则将文件从res / raw文件夹复制到内部存储器中,否则它将检索文件中的字段以检查其版本,如果是较新版本,则删除以前的文件并再次复制
嗯,问题是,如果我有一个新版本而且我删除了前一个版本,当我要再次复制它时,它会抛出一个NullPointerExceptcion但我找不到问题,但我是在这两种情况下使用相同的代码,我不知道如何解决它。
这是我正在使用的代码:
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 :(得分:1)
刚刚添加我的评论作为答案,因为它似乎解决了OP的问题并将关闭此问题:
我想我知道问题所在。您打开资源文件和 将其保存在
InputStream
中,然后调用String resourcesVersion= getFileVersion(fXmlFile);
,我猜这是您自己的私函数 得到版本。我打赌你提前InputStream
或关闭 它在那个功能。然后,当你稍后致电copyFile
时InputStream
已被消费或关闭。尝试删除该行 并放一个常数String resourcesVersion = "versionThatDoesn'tMatch";
只是为了测试InputStream
答案 1 :(得分:0)
似乎在声明中
InputStream fXmlFile = getResources().openRawResource(R.raw.partidos);
变量fXmlFile
为null
。你可以检查一下发生的原因。