为什么要将此字节数组初始化为1024

时间:2011-07-02 15:14:47

标签: java android

我是Java的新手,我正在尝试编写一个简单的Android应用程序。我的应用程序的assets文件夹中有一个大约3500行的大文本文件,我需要将其读入一个字符串。我找到了一个关于如何做到这一点的一个很好的例子但是我有一个关于为什么字节数组被初始化为1024的问题。我不想将它初始化为我的文本文件的长度吗?另外,我不想使用char,而不是byte吗?这是代码:

private void populateArray(){
    AssetManager assetManager = getAssets();
    InputStream inputStream = null;
    try {
        inputStream = assetManager.open("3500LineTextFile.txt");
    } catch (IOException e) {
        Log.e("IOException populateArray", e.getMessage());
    }
    String s = readTextFile(inputStream);
    // Add more code here to populate array from string
}

private String readTextFile(InputStream inputStream) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    inputStream.length
    byte buf[] = new byte[1024];
    int len;
    try {
        while ((len = inputStream.read(buf)) != -1) {
            outputStream.write(buf, 0, len);
        }
        outputStream.close();
        inputStream.close();
    } catch (IOException e) {
        Log.e("IOException readTextFile", e.getMessage());
    }
    return outputStream.toString();
}

编辑:根据您的建议,我尝试了这种方法。有没有更好的?感谢。

private void populateArray(){
    AssetManager assetManager = getAssets();
    InputStream inputStream = null;
    Reader iStreamReader = null;
    try {
        inputStream = assetManager.open("List.txt");
        iStreamReader = new InputStreamReader(inputStream, "UTF-8");
    } catch (IOException e) {
        Log.e("IOException populateArray", e.getMessage());
    }
    String String = readTextFile(iStreamReader);
    // more code here
}

private String readTextFile(InputStreamReader inputStreamReader) {
    StringBuilder sb = new StringBuilder();
    char buf[] = new char[2048];
    int read;
    try {
        do {
            read = inputStreamReader.read(buf, 0, buf.length);
            if (read>0) {
                sb.append(buf, 0, read);
            }
        } while (read>=0);
    } catch (IOException e) {
        Log.e("IOException readTextFile", e.getMessage());
    }
    return sb.toString();
}

4 个答案:

答案 0 :(得分:3)

这个例子并不好。它充满了不好的做法(隐藏异常,不关闭finally块中的流,不指定显式编码等)。它使用1024字节长的缓冲区,因为它无法知道输入流的长度。

阅读Java IO tutorial以了解如何从文件中读取文字。

答案 1 :(得分:2)

您正在将文件读入1024字节的缓冲区。 然后将这1024个字节写入outputStream。 重复此过程,直到将整个文件读入outputStream。 正如JB Nizet所说,这个例子充满了不良做法。

答案 2 :(得分:0)

要从文件中读取,我可以使用Scanner和StringBuilder。

        Scanner scan = new Scanner(new BufferedInputStream(new FileInputStream(filename)), "UTF-8");
        StringBuilder sb = new StringBuilder();
        while (scan.hasNextLine()) {
            sb.append(scan.nextLine());
            sb.append("\n");
        }
        scan.close

        return sb.toString();

尝试抛弃异常,而不是吞下它们。调用者必须知道读取文件时出现问题。

编辑:另请注意,使用BufferedInputStream非常重要。否则它将尝试按字节读取字节,这可能很慢。

答案 3 :(得分:0)

  

我不想将其初始化为文本文件的长度吗?另外,我不想使用char,而不是byte?

是的,是的......正如其他答案所说的那样,你已经选择了一个包含许多错误的例子。

然而,两者都有理论上的问题;即使用字符缓冲区而不是字节缓冲区将缓冲区长度设置为文件长度。问题是文件大小是以字节为单位测量的,但缓冲区的大小需要以字符为单位进行测量。这通常很好,但理论上可能你需要的字符数多于文件大小(以字节为单位);例如如果输入文件使用6位字符集并将4个字符打包成3个字节。