3

我有一个基于 FileInputStream 的函数,它应该返回她从文件中读取的字符串。但是为什么返回值是空的。函数的返回值应该显示在 MainActivity 中。此功能是我的应用程序中服务的一部分。

public static String UserLoginFile;
public static String UserPassFile;

    public String LoadUserInfopassFromFilePostData() {  
    String FILENAME = "TeleportSAASPass.txt";
    FileInputStream inputStream = null;
    if(UserLoginFile != null){
    try {
        inputStream = openFileInput(FILENAME);
        byte[] reader = new byte[inputStream.available()];
        while (inputStream.read(reader) != -1) {}
        UserPassFile = new String(reader);
 //   Toast.makeText(getApplicationContext(), "GPSTracker " + UserPassFile, Toast.LENGTH_LONG).show();
    } catch(IOException e) {
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
            }
        }
    }
    }
   return UserPassFile;
 }  

请告诉我如何修复我的函数,以便它可以返回她从文件中读取的字符串。

4

2 回答 2

2

我建议使用输入流阅读器。查看 http://developer.android.com/reference/java/io/InputStreamReader.html 您的代码将类似于:

inputStream = openFileInput(FILENAME);
InputStreamReader( inputstream, "UTF_8"), 8);
StringBuilder response = new StringBuilder();
String line;
//Read the response from input stream line-wise

while((line = reader.readLine()) != null){ 
response.append(line).append('\n');
}

//Create response string
result = response.toString();
//Close input stream
reader.close();
于 2013-06-04T17:53:53.727 回答
1

考虑您的代码之间的区别:

        while (inputStream.read(reader) != -1) {}
        UserPassFile = new String(reader);

而这个替代方案:

        while (inputStream.read(reader) != -1) {
             UserPassFile = new String(reader);
        }

在您的情况下, UserPassFile 是在每次 read() 调用之后从 reader 分配的,包括最后一个失败的调用。在第二种情况下,UserPassFile 仅在读取成功后分配,因此仍应包含一个非空字符串以在到达方法结束时返回。

但是,您似乎在做另一件奇怪的事情。您假设您将能够在一次读取中读取整个 .available() 数据量,这可能是正确的(至少如果您能够分配这么大的 byte[])。但是,读完这些数据后,你再试一次,看看是否失败,这似乎没有必要。似乎如果您要假设您可以一次尝试读取数据,那么您应该简单地关闭流并在完成后返回 - 似乎没有令人信服的理由来尝试另一个预期会失败的读取。否则,如果有可能无法在一次 read() 中获取所有数据,则应跟踪已获取的数据量并继续追加,直到读取失败或以其他方式确定已完成。

于 2013-06-04T17:47:19.510 回答