【问题标题】:android reading from a text fileandroid从文本文件中读取
【发布时间】:2011-11-25 23:54:22
【问题描述】:

我有一个 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 应用程序中使用它,但是当我创建这个类的一个实例并尝试在 android Activity 类中执行 loadUnigramFrequencies() 函数时,我收到一个应用程序意外停止的错误。我正在尝试在三星 Galaxy S2 上运行它。文件应该放在android项目中的某个地方而不是磁盘上吗?如果是,那么在哪里?

【问题讨论】:

  • 能否提供 logcat 帮助定位错误? (Eclipse中的Window/Show View/Other/Android/LogCat或shell中的“adb logcat”)

标签: android


【解决方案1】:

这是在干草堆里找一根针。

我建议你先学习如何在Android中使用调试:
http://www.droidnova.com/debugging-in-android-using-eclipse,541.html

还有一些异常处理不会有什么坏处:
http://en.wikibooks.org/wiki/Java_Programming/Throwing_and_Catching_Exceptions

下面这行代码非常错误,看来你对android中的文件存储不太了解:

new FileReader("unigramFrequencies.txt")

这里解释一下:
http://developer.android.com/guide/topics/data/data-storage.html

【讨论】:

    【解决方案2】:

    我认为错误可能就在那里:

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

    您应该在这里提供一个绝对路径,并在访问它之前首先确保文件存在处理异常。

    如果这个文件是一些最终资产,你应该把它放在你的项目资产文件夹中,并从那里得到一个文件阅读器。

    示例(来自here):

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

    请注意,您的 unigramFrequencies.txt 文件应该存在于您的 /assets/ 目录中

    【讨论】:

    • 我将 unigramFrequencies.txt 文件放在 assets 下。我添加了以下代码: AssetFileDescriptor descriptor = getAssets().openFd("unigramFrequencies.txt"); BufferedReader bf = new BufferedReader(new FileReader(descriptor.getFileDescriptor()));
    • 我得到的错误 09-27 13:37:57.860: ERROR/AndroidRuntime(7208): Caused by: java.io.FileNotFoundException: This file can't be open as a file descriptor;它可能被压缩 09-27 13:37:57.860: ERROR/AndroidRuntime(7208): at android.content.res.AssetManager.openAssetFd(Native Method) 09-27 13:37:57.860: ERROR/AndroidRuntime(7208):在 org.com.SentencesActivity.loadUnigramFrequencies(SentencesActivity.java:97) 09-27 13:37:57.860: 错误/AndroidRuntime(7208): 在 org.com.SentencesActivity.onClick(SentencesActivity.java:54)
    • 你的文件有多大?
    • 我知道这听起来很疯狂,但试试这个:将文件从 .txt 重命名为 .png 并适当地更改代码。有关说明,请参阅 this
    【解决方案3】:

    没有一点 logcat 它有点微不足道。

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

    例如,如果 splittedLine[0] 或 splittedLine[1] 为空,则此处可能会引发空指针执行,或者 parseDouble 可能会引发数字格式执行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      相关资源
      最近更新 更多