从文件读取返回空字符串,没有错误

时间:2015-07-10 07:53:50

标签: java android

我尝试使用以下代码从文件中获取字符串:

public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
            Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

public String useRawResFile(){
    InputStreamReader is = new InputStreamReader(getResources().openRawResource(R.raw.elwords));
    LineNumberReader lnr=new LineNumberReader(is);
    String randomWord="";
    int numLines=0;
    Random r = new Random();
    lnr.setLineNumber(r.nextInt(numLines));
    try{
        randomWord = lnr.readLine();

    }
    catch(IOException e){
        e.printStackTrace();
    }
    return randomWord;
}

public String selRandomWord(){
    String randomWordSelection="";

    if(isExternalStorageReadable()) {
        File path = Environment.getExternalStorageDirectory();
        File file = new File(path, "elwords.dat");

        try{
            if(file.exists()) {
                FileReader fr = new FileReader(file);
                LineNumberReader lnr=new LineNumberReader(fr);
                int numLines=0;
                Random r = new Random();
                lnr.setLineNumber(r.nextInt(numLines));
                try{
                    randomWordSelection = lnr.readLine();

                }
                catch(IOException e){
                    e.printStackTrace();
                    useRawResFile();
                }
            }

        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    } else {
        useRawResFile();
    }
    return randomWordSelection;
}

我在onCreate中使用了selRandomWord()方法,但我得到的String是null。我没有收到任何错误,文件中有单词(每行一个)。上面的代码有什么不对或错吗? 提前谢谢。

2 个答案:

答案 0 :(得分:0)

Environment.getExternalStorageDirectory()的Instad 使用

Environment.getExternalStorageDirectory().getAbsolutePath();

为您提供SDCard的完整路径。然后,您可以使用标准Java执行常规的文件I / O操作。

前 -

String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath  ();
String fileName = "myFile.txt";
File f = new File(baseDir + File.Separator + fileName);
 FileInputStream fiStream = new FileInputStream(f);
  byte[] bytes;
  fiStream.read(bytes); 
   fiStream.close();

我希望这会对你有帮助......

答案 1 :(得分:0)

您可能会看到此问题,因为您未将检查失败至if (file.exists()),然后返回默认值randomWordSelection。试试上一个答案的建议(并确保检查明显的事情 - 例如文件名是正确的!)。

我回答的主要原因是我注意到代码中的另一个问题。在您引用numLines的两个代码部分中,默认情况下将numLines设置为0,然后继续调用r.nextInt(numLines)而不更改numLines的值。 nextInt(int n)方法返回0(包括)和n(不包括)之间的随机int。如果n为0,它会返回什么?事实上,在这种情况下它会引发错误!简而言之,在使用numLines生成随机值之前,您需要将C:\Program Files (x86)\OpenNI2\Redist设置为一些合理的值(文件中的行数)。