From 90619816d99154d504a14774c6f2d5f4254ff780 Mon Sep 17 00:00:00 2001 From: Guang Zhu Date: Fri, 12 Oct 2012 15:50:44 -0700 Subject: [PATCH] use BufferedInputStream in readTextFile With FileInputStream, using assumption of bytes read (as returned by read function) not matching buffer size as EOF is not correct, we hit this when reading from /proc in some cases. BufferedInputStream's behavior matches that assumption due to its implementation. Bug: 7342759 Change-Id: Ibb06dbe1fbe33f6f880524f7555ff5542889ea50 --- core/java/android/os/FileUtils.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java index 0941d719882be..2bec1c176905b 100644 --- a/core/java/android/os/FileUtils.java +++ b/core/java/android/os/FileUtils.java @@ -16,6 +16,7 @@ package android.os; +import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; @@ -91,7 +92,7 @@ public class FileUtils { } return result; } - + /** * Copy data from a source stream to destFile. * Return true if succeed, return false if failed. @@ -143,12 +144,16 @@ public class FileUtils { */ public static String readTextFile(File file, int max, String ellipsis) throws IOException { InputStream input = new FileInputStream(file); + // wrapping a BufferedInputStream around it because when reading /proc with unbuffered + // input stream, bytes read not equal to buffer size is not necessarily the correct + // indication for EOF; but it is true for BufferedInputStream due to its implementation. + BufferedInputStream bis = new BufferedInputStream(input); try { long size = file.length(); if (max > 0 || (size > 0 && max == 0)) { // "head" mode: read the first N bytes if (size > 0 && (max == 0 || size < max)) max = (int) size; byte[] data = new byte[max + 1]; - int length = input.read(data); + int length = bis.read(data); if (length <= 0) return ""; if (length <= max) return new String(data, 0, length); if (ellipsis == null) return new String(data, 0, max); @@ -161,7 +166,7 @@ public class FileUtils { if (last != null) rolled = true; byte[] tmp = last; last = data; data = tmp; if (data == null) data = new byte[-max]; - len = input.read(data); + len = bis.read(data); } while (len == data.length); if (last == null && len <= 0) return ""; @@ -178,12 +183,13 @@ public class FileUtils { int len; byte[] data = new byte[1024]; do { - len = input.read(data); + len = bis.read(data); if (len > 0) contents.write(data, 0, len); } while (len == data.length); return contents.toString(); } } finally { + bis.close(); input.close(); } }