关于Java:如何在Android中返回文件输入流的值

How to return value of FileInputStream in Android

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;
 }

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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('
'
);
}

//Create response string
result = response.toString();
//Close input stream
reader.close();

考虑代码之间的区别:

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

这个替代方案:

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

在您的例子中,每次read()调用后,都会从读卡器分配userpassfile,包括最后一个失败的调用。在第二种情况下,只有在读取成功后才分配userpassfile,因此在到达方法结尾时仍应包含要返回的非空字符串。

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