Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 90619816 authored by Guang Zhu's avatar Guang Zhu
Browse files

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
parent 8dd3aadd
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.os;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
@@ -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();
        }
    }