2011-09-27 2 views
1

У меня есть класс Java, где он читает некоторые данные из текстового файла, используя буферное чтения и возвращает эти данные в качестве хэш-карта:андроид чтение из текстового файла

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.HashMap; 

public class FrequencyLoader { 

    public FrequencyLoader() throws FileNotFoundException { 
     } 

     public HashMap<String, Double> loadUnigramFrequencies() throws FileNotFoundException, IOException { 
      HashMap<String, Double> unigramFrequencies = new HashMap<String, Double>(); 
      String line; 
      String[] splittedLine; 

      BufferedReader bf = new BufferedReader(new FileReader("unigramFrequencies.txt")); 

      while ((line = bf.readLine()) != null) { 
       splittedLine = line.split("\\s"); 


       unigramFrequencies.put(splittedLine[0].trim(), Double.parseDouble(splittedLine[1].trim())); 
      } 

      return unigramFrequencies; 
     } 
} 

Я хочу использовать это в моем android, но когда я создаю экземпляр этого класса и пытаюсь выполнить функцию loadUnigramFrequencies() в классе Activity android, я получаю сообщение об ошибке, которое приложение неожиданно остановило. Я пытаюсь запустить его на Samsung Galaxy S2. Должен ли файл размещаться где-то в проекте Android, а не на диске? если да, то где?

+1

Не могли бы вы предоставить логарифм, чтобы помочь найти ошибку? (Window/Show View/Other/Android/LogCat в eclipse или «adb logcat» в оболочке) –

ответ

2

без какого-либо ловушка, это немного тривиально.

unigramFrequencies.put(splittedLine[0].trim(), Double.parseDouble(splittedLine[1].trim())) 

здесь, например, может быть поднят пустой указатель execption если splittedLine [0] или splittedLine [1] равна нулю, или parseDouble может возникнуть числовом формате execption

2

Я думаю, что ошибка может также быть там :

BufferedReader bf = new BufferedReader(new FileReader("unigramFrequencies.txt")); 

Вы должны обеспечить полный путь здесь, и убедитесь, что файл существует до доступа к нему или обработать исключение.

Если этот файл является конечным активом, вы должны поместить его в свою папку с ресурсами проекта и получить оттуда filereader.

Пример (из here):

AssetFileDescriptor descriptor = getAssets().openFd("unigramFrequencies.txt"); 
FileReader reader = new FileReader(descriptor.getFileDescriptor()); 

Обратите внимание, что ваш файл unigramFrequencies.txt должен присутствовать в вашем < проекте >/активы/Каталог

+0

Я поместил файл unigramFrequencies.txt под активы. Я добавил следующий код: AssetFileDescriptor descriptor = getAssets(). OpenFd ("unigramFrequencies.txt"); \t BufferedReader bf = new BufferedReader (новый FileReader (дескриптор.getFileDescriptor())); – Radek

+0

Ошибка, которую я получаю Ошибка 09-27 13: 37: 57.860: ERROR/AndroidRuntime (7208): вызвано: java.io.FileNotFoundException: этот файл не может быть открыт в качестве дескриптора файла; он, вероятно, сжат 09-27 13: 37: 57.860: ERROR/AndroidRuntime (7208): at android.content.res.AssetManager.openAssetFd (собственный метод) 09-27 13: 37: 57.860: ERROR/AndroidRuntime (7208): на org.com.SentencesActivity.loadUnigramFrequencies (SentencesActivity.java:97) 09-27 13: 37: 57.860: ОШИБКА/AndroidRuntime (7208): at org.com.SentencesActivity.onClick (SentencesActivity.java:54) – Radek

+0

Каков размер вашего файла? –

1

Это поиск иголки в стоге сена ,

Я рекомендую вам сначала научиться использовать отладку в Android:
http://www.droidnova.com/debugging-in-android-using-eclipse,541.html

Кроме того, некоторые обработки исключений не мешало бы:
http://en.wikibooks.org/wiki/Java_Programming/Throwing_and_Catching_Exceptions

Следующая строка кода очень неправильно, и кажется, вы не понимаете хранения файлов в андроиде:

new FileReader("unigramFrequencies.txt") 

Здесь объясняется:
http://developer.android.com/guide/topics/data/data-storage.html

Смежные вопросы