Java:从文件到数组中读取x个字符

时间:2012-03-01 04:20:04

标签: java io

我想读取一个文本文件并将其内容存储在一个数组中,其中数组的每个元素最多可容纳500个字符(即一次读取500个字符,直到没有更多字符可读)。

我在执行此操作时遇到了麻烦,因为我无法理解在Java中执行IO的所有不同方法之间的差异,而我无法找到执行我想要的任务的任何方法。

我是否需要使用数组列表,因为我最初不知道数组中有多少项?

3 个答案:

答案 0 :(得分:1)

很难避免使用ArrayList或类似的东西。如果您知道该文件是ASCII,则可以执行

int partSize = 500;
File f = new File("file.txt");
String[] parts = new String[(f.length() + partSize - 1) / partSize];

但是如果文件使用像UTF-8这样的可变宽度编码,那么这将不起作用。这段代码可以完成这项工作。

static String[] readFileInParts(String fname) throws IOException {
    int partSize = 500;
    FileReader fr = new FileReader(fname);
    List<String> parts = new ArrayList<String>();
    char[] buf = new char[partSize];
    int pos = 0;

    for (;;) {
        int nRead = fr.read(buf, pos, partSize - pos);
        if (nRead == -1) {
            if (pos > 0)
                parts.add(new String(buf, 0, pos));
            break;
        }
        pos += nRead;
        if (pos == partSize) {
            parts.add(new String(buf));
            pos = 0;
        }
    }
    return parts.toArray(new String[parts.size()]);
}

请注意FileReader使用平台默认编码。要指定特定编码,请将其替换为new InputStreamReader(new FileInputStream(fname), charSet)。它有点难看,但这是最好的方法。

答案 1 :(得分:0)

ArrayList肯定会更合适,因为你不知道你将拥有多少元素。

有很多种方法可以读取文件,但是由于您希望保留字符数以获得500个,您可以使用Reader对象的read()方法来读取字符按性格。一旦你收集了你需要的500个字符(我想在一个字符串中),只需将它添加到你的ArrayList(当然是循环中的所有字符)。

Reader对象需要使用扩展Reader的对象进行初始化,就像InputStreamReader一样(这个将InputStream的实现作为参数,使用文件作为输入时使用FileInputStream)。

答案 2 :(得分:0)

不确定这是否有效,但您可能想尝试这样的事情(警告:未经测试的代码):

  private void doStuff() {
    ArrayList<String> stringList = new ArrayList<String>();
    BufferedReader in = null;
    try {
        in = new BufferedReader(new FileReader("file.txt"));
        String str;
        int count = 0;
        while ((str = in.readLine()) != null) {
            String temp = "";
            for (int i = 0; i <= str.length(); i++) {
                temp += str.charAt(i);
                count++;
                if(count>500) {
                    stringList.add(temp);
                    temp = "";
                    count = 0;
                }
            }
            if(count>500) {
                stringList.add(temp);
                temp = "";
                count = 0;
            }

        }
    } catch (IOException e) {
        // handle
    } finally {
        try {
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}