Сохранить ArrayList в файл - FC при создании ObjectOutputStream - PullRequest
0 голосов
/ 03 апреля 2012

Я пытаюсь внедрить в мое приложение простое кэширование, и у меня возникают некоторые проблемы.

В основном мой код очищает веб-страницу, получает некоторые регулярные выражения и помещает их в ArrayList.Это занимает некоторое время (несколько секунд, но это происходит часто), поэтому я пытаюсь реализовать простую систему кеширования, которая проверяет, когда файл кеша был изменен, если это старше недели, обновить кеш.

Моя проблема заключается в хранении ArrayList, кто-нибудь может помочь с этим?

У меня изначально (что работает)

  private List<String> getVideoIDS(final String url2) {

        if (android.os.Environment.getDataDirectory().equals(android.os.Environment.MEDIA_MOUNTED))  //android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
            cacheDir=new File(android.os.Environment.getDataDirectory(),"PL" + url.getQuery());
        else
            cacheDir=mContext.getCacheDir();
        if(!cacheDir.exists())
            cacheDir.mkdirs();

        File f = new File(cacheDir, "PL"+url.getQuery());

        if (f.lastModified() > 604800000 || f.exists() == false) { 
        String expr = "(?<=v=)[a-zA-Z0-9-_]{11}(?=&)|(?<=[0-9]/)[^&\n]{11}|(?<=v=)[^&\n]{11}";

        int count = 0;   
        Pattern patt = Pattern.compile(expr,
                  Pattern.DOTALL | Pattern.UNIX_LINES | Pattern.CASE_INSENSITIVE);
                try {
                    url = new URL(url2);
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
                try {
                    m = patt.matcher(getURLContent(url));
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                while (m.find()) {
                    if ("default.jpg".equals(m.group(0)) || "videos?view".equals(m.group(0))) {
                        //Do nothing
                        } else { 
                            allMatches.add(m.group(0));
                            count++;
                            Log.i("", m.group(0));
                }
                }

                //Remove duplicates
                List<String> noDupes = new ArrayList<String>();
                Iterator iterator = allMatches.iterator();
                while (iterator.hasNext())
                {
                    String o = (String) iterator.next();
                    if(!noDupes.contains(o)) noDupes.add(o);
                }

        allMatches = noDupes;   
                return allMatches; }

Теперь то, что я пытаюсь изменитьэто должно быть (теоретически, так как в настоящее время это не работает)

  private List<String> getVideoIDS(final String url2) {

        if (android.os.Environment.getDataDirectory().equals(android.os.Environment.MEDIA_MOUNTED))  //android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
            cacheDir=new File(android.os.Environment.getDataDirectory(),"PL" + url.getQuery());
        else
            cacheDir=mContext.getCacheDir();
        if(!cacheDir.exists())
            cacheDir.mkdirs();

        File f = new File(cacheDir, "PL"+url.getQuery());

        if (f.lastModified() > 604800000 || f.exists() == false) { 
        String expr = "(?<=v=)[a-zA-Z0-9-_]{11}(?=&)|(?<=[0-9]/)[^&\n]{11}|(?<=v=)[^&\n]{11}";

        int count = 0;   
        Pattern patt = Pattern.compile(expr,
                  Pattern.DOTALL | Pattern.UNIX_LINES | Pattern.CASE_INSENSITIVE);
                try {
                    url = new URL(url2);
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
                try {
                    m = patt.matcher(getURLContent(url));
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                while (m.find()) {
                    if ("default.jpg".equals(m.group(0)) || "videos?view".equals(m.group(0))) {
                        //Do nothing
                        } else { 
                            allMatches.add(m.group(0));
                            count++;
                            Log.i("", m.group(0));
                }
                }

                //Remove duplicates
                List<String> noDupes = new ArrayList<String>();
                Iterator iterator = allMatches.iterator();
                while (iterator.hasNext())
                {
                    String o = (String) iterator.next();
                    if(!noDupes.contains(o)) noDupes.add(o);
                }

        allMatches = noDupes;       


        ObjectOutputStream save = null;

        FileOutputStream saveFile = null;
        try {
            saveFile = new FileOutputStream(cacheDir + "PL"+url.getQuery());
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        // Create an ObjectOutputStream to put objects into save file.
        try {
            save = new ObjectOutputStream(saveFile);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        try {
            save.writeObject(allMatches);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            save.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return allMatches;}

        else {
              try{  
                   // Open file to read from, named SavedObjects.sav.
                   FileInputStream saveFile = new FileInputStream(cacheDir + "PL"+url.getQuery());

                   // Create an ObjectInputStream to get objects from save file.
                   final ObjectInputStream save = new ObjectInputStream(saveFile);

                   // Now we do the restore.
                   // readObject() returns a generic Object, we cast those back
                   // into their original class type.
                   // For primitive types, use the corresponding reference class.
                   allMatches = (ArrayList) save.readObject();
                   // Close the file.
                   save.close();
              } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (StreamCorruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                    // This also closes saveFile.

              }
        } return allMatches; 
}

Примечание: я пытаюсь сохранить несколько файлов, так как этот метод вызывается для различных категорий.Это должно быть сделано с помощью вызова файла с другим именем файла в зависимости от того, что открыто.Я думаю, что реализовал это правильно.

Stacktrace выглядит следующим образом

04-03 17:41:20.846: E/AndroidRuntime(2438): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.test/com.test.test.VideoGrid}: java.lang.NullPointerException
04-03 17:41:20.846: E/AndroidRuntime(2438):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2194)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2229)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at android.app.ActivityThread.access$600(ActivityThread.java:139)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1261)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at android.os.Looper.loop(Looper.java:154)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at android.app.ActivityThread.main(ActivityThread.java:4944)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at java.lang.reflect.Method.invokeNative(Native Method)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at java.lang.reflect.Method.invoke(Method.java:511)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at dalvik.system.NativeStart.main(Native Method)
04-03 17:41:20.846: E/AndroidRuntime(2438): Caused by: java.lang.NullPointerException
04-03 17:41:20.846: E/AndroidRuntime(2438):     at java.io.DataOutputStream.writeShort(DataOutputStream.java:192)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at java.io.ObjectOutputStream.writeStreamHeader(ObjectOutputStream.java:1815)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:279)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at com.test.test.VideoGrid.getVideoIDS(VideoGrid.java:204)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at com.test.test.VideoGrid.onCreate(VideoGrid.java:74)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at android.app.Activity.performCreate(Activity.java:4524)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
04-03 17:41:20.846: E/AndroidRuntime(2438):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2150)

Это

com.test.test.VideoGrid.getVideoIDS(VideoGrid.java:204)

Указывает на

save = new ObjectOutputStream(saveFile);

У меня естьandroid.permission.WRITE_EXTERNAL_STORAGE

В моем манифесте

Я попытался изменить имя файла на статическое (1) вместо моего incl.getQuery, который был проблемой - ничего не меняет,точно такая же проблема.

Я чувствую, что здесь делаю фундаментальную ошибку.Кто-нибудь может увидеть, где я ошибаюсь при сохранении / чтении ArrayList?

1 Ответ

0 голосов
/ 04 апреля 2012

Похоже, ваш файл сохранения не найден;но трудно сказать, так как ваш код в настоящее время поглощает все исключения.вместо:

try {
    saveFile = new FileOutputStream(cacheDir + "PL"+url.getQuery())
} catch (FileNotFoundException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Попробуйте вместо этого записать в журнал свои исключения, так как e.printStackTrace ();ничего не делает по умолчанию на Android.

catch(FileNotFoundException e1) {
  Log.e(getClass().getName(), "File not found:" + cacheDir + "PL" + url.getQuery()", e1);
}

В любом случае, это моя теория - ваш путь к файлу указывает куда-то, куда по какой-либо причине не может быть записано ( документы иметь некоторые возможные объяснения);Затем saveFile выходит из исключения как null, а затем вы передаете нулевой параметр в конструктор outputStream

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...