Файл активов не читается правильно InputStream / Reader - PullRequest
0 голосов
/ 14 января 2019

Я хочу создать свой собственный генератор паролей. Поэтому я создал файлы, содержащие все символы, которые в данный момент лежат в созданной вручную папке «assets». Я также создал метод, который должен возвращать содержимое одного файла в виде массива строк. Кажется, что метод уже распознает заданные файлы, потому что он не ловит "FileNotFoundException" и правильно получает количество строк в файле. Теперь моя проблема в том, что возвращаемый массив не содержит содержимого файла, а содержит только сумму "null"s, соответствующую количеству строк в файле. Я надеюсь, что информация подойдет. Кто-нибудь может мне помочь?

Я уже пробовал использовать разные Charsets и перемещать файлы в папку "/res/raw/".

public String[] getList(String filename) {

    String[] zeichenliste = new String[0];

    try {
        InputStream is = getAssets().open(filename);
        BufferedReader br = new BufferedReader (new InputStreamReader(is));
        int length = 0;

        while (br.readLine() != null) length++;
        zeichenliste = new String[length];

        br = new BufferedReader (new InputStreamReader(is));
        for (int i = 0; i < length; i++) zeichenliste[i] = br.readLine();
        br.close();
        is.close();

    } catch (IOException e) {
        e.printStackTrace();
        return(null);
    }
    return zeichenliste;
}

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Я решил проблему:

public String[] getZeichenListe(String dateiname) {
String str = "";
try {
    InputStream is = getAssets().open(dateiname);
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String buffer = "";

    while ((buffer = br.readLine()) != null) str = buffer + ";" + str;
    is.close();
    br.close();

} catch (IOException e) {
    e.printStackTrace();
}
return str.split(";");

}

Хотя я не совсем уверен, что, по-моему, проблема в том, что я переинициализировал только BufferedReader, но не InputStream.

0 голосов
/ 15 января 2019

Вот пример того, как вы могли это сделать. Я включил заметки в код.

// We return a collection to:
//  1: Have a variable-length 'array' returned.
//  2: Abstract the internal implementation of the actual collection used.
// We take an InputStream, so our function is more dynamic in what way it can parse lines (i.e. not just from files)
//  Note: this won't really work on a stream that does not end.
// We renamed the function, to be more representable to what it does
public Collection<String> readAllLines(InputStream stream) 
    throws IOException // We do not handle this ourselves, since that would take away some abstraction. But it is up to you.
{
    // We're not doing try-with-resources now, because the caller owns the stream.
    // We're also passing a charset, so that we support all languages.
    BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));

    // BufferedReader has a built-in stream for all its lines.
    Stream<String> linesStream = reader.lines();

    // We collect all our lines using a built-in collector that returns it as a list.
    List<String> lines = linesStream.collect(Collectors.toList());

    return lines;
}

А потом назвать это:

Collection<String> lines;
try(InputStream stream = getAssets().open(filename))
{
    lines = readAllLines(stream);
}

Как я указывал в своем комментарии: при вашем подходе вы пытались прочитать, пройдя конец файла, как вы уже итерировали по нему один раз, чтобы сосчитать все строки. Коллекция - хороший способ решить эту проблему.

PS: Если вам нужна коллекция на основе индекса, вы можете изменить определение readAllLines, чтобы вместо него возвращалось List.

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