从文件返回空字符串读,没有错误
问题描述:
我尝试使用下面的代码从一个文件中的字符串:从文件返回空字符串读,没有错误
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()方法,但是字符串我得到的是null。我没有收到任何错误,并且文件有文字(每行一个)。在上面的代码中是错误的还是错误的? 在此先感谢。
答
你很可能会遇到这个问题,因为你是失败的检查if (file.exists())
,然后再返回的randomWordSelection
默认值。试试以前答案的建议(并确保检查显而易见的事情 - 例如文件名是正确的!)。
我的回应的主要原因是我注意到代码中的另一个问题。在您指代numLines
的两段代码中,您默认将numLines
设置为0,然后继续拨打r.nextInt(numLines)
而不更改numLines
的值。 nextInt(int n)
方法返回0(包含)和n(不包含)之间的随机int。如果n是0,它会返回什么?事实上,在这种情况下它会引发错误!总之,你会想用它来生成一个随机值之前设置numLines
一些明智的值(在文件中的行数)。
答
的Environment.getExternalStorageDirectory()
使用
Environment.getExternalStorageDirectory().getAbsolutePath();
Instad给你的完整路径的SD卡。然后,您可以使用标准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();
我希望这将帮助你......
我设置了numlines号码,我更新许可清单读/写外部存储,之后的应用程序被卡住,我得到“背景粘并发标记扫描GC释放AllocSpace对象,0(0B)LOS对象错误, 16%免费......“永远。 – user2057220