Java: чтение до x символов из файла в массив - PullRequest
2 голосов
/ 01 марта 2012

Я хочу прочитать текстовый файл и сохранить его содержимое в массиве, где каждый элемент массива содержит до 500 символов из файла (то есть продолжайте читать 500 символов за раз, пока не останется больше символов для чтения).

У меня проблемы с этим, потому что у меня проблемы с пониманием различий между всеми различными способами выполнения ввода-вывода в Java, и я не могу найти ни одного, который бы выполнял задачу, которую я хочу.

И нужно ли мне использовать список массивов, поскольку я изначально не знаю, сколько элементов в массиве?

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Было бы трудно избежать использования 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). Это немного уродливо, но это лучший способ сделать это.

0 голосов
/ 01 марта 2012

Не уверен, что это будет работать, но вы можете попробовать что-то вроде этого (Внимание: непроверенный код):

  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();
        }
    }

}
0 голосов
/ 01 марта 2012

ArrayList определенно подойдет, так как вы не знаете, сколько элементов у вас будет.

Есть много способов прочитать файл, но, так как вы хотите сохранить количество символов, чтобы получить 500 из них, вы можете использовать метод read() объекта Reader , который будет читать символ по характеру. После того, как вы собрали 500 символов, которые вам нужны (в строке, я думаю), просто добавьте ее в свой ArrayList (все это в цикле, конечно).

Объект Reader должен быть инициализирован объектом, расширяющим Reader, например InputStreamReader (в этом случае в качестве параметра используется реализация InputStream, FileInputStream при работе с файлом в качестве входных данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...