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 |
这个替代方案:
1 2 3 |
在您的例子中,每次read()调用后,都会从读卡器分配userpassfile,包括最后一个失败的调用。在第二种情况下,只有在读取成功后才分配userpassfile,因此在到达方法结尾时仍应包含要返回的非空字符串。
然而,你似乎在做另一件奇怪的事情。您假设您能够在一次读取中读取整个.available()数量的数据,这可能是真的(至少如果您能够分配这么大的字节[])。但是,在阅读了这些数据之后,您会再试一次,看看是否失败,这似乎是不必要的。如果您要假设您可以在一次尝试中读取数据,那么您只需关闭流并在完成此操作后返回-似乎没有令人信服的理由尝试另一次可能失败的读取。否则,如果有可能无法在单个read()中获取所有数据,则应跟踪已获取的数据量并继续追加,直到读取失败或以其他方式确定已完成为止。