Получить содержимое из текстового файла в строку (Android) (FileNotFound) (Java)

Я хочу получить текст из текстового файла, который у меня есть в моем проекте (студия Android), и преобразовать этот текст в строку. В настоящее время у меня возникают проблемы с получением правильного пути или что-то в этом роде. Я использую два метода, которые я нашел здесь, в Stackoverflow, чтобы преобразовать текстовые файлы в строки. Это методы:

public static String convertStreamToString(InputStream is) throws Exception {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
        sb.append(line).append("\n");
    }
    reader.close();
    return sb.toString();
}

public static String getStringFromFile (String filePath) throws Exception {
    File fl = new File(filePath);
    FileInputStream fin = new FileInputStream(fl);
    String ret = convertStreamToString(fin);
    //Make sure you close all streams.
    fin.close();
    return ret;
}

И я вызываю методы следующим образом, и я пробовал все виды путей, но, похоже, ни один из них не работает:

Log.i("er0r", Solve.getStringFromFile("\\tables\\lowerLayer\\cross\\whiteRed.txt"));

Это просто попытка распечатать содержимое текстового файла. Я получаю следующую ошибку: java.io.FileNotFoundException: .\tables\lowerLayer\cross\whiteRed.txt: open failed: ENOENT (Нет такого файла или каталога)

Вот как я заказал свои пакеты: https://imgur.com/a/rK9R5

Как я могу это исправить? Спасибо

РЕДАКТИРОВАТЬ:

public String LoadData(String inFile) {
    String str = "";
    try{
        StringBuilder buf=new StringBuilder();
        InputStream json=getAssets().open(inFile);
        BufferedReader in=
                new BufferedReader(new InputStreamReader(json, "UTF-8"));
        while ((str=in.readLine()) != null) {
            buf.append(str);
        }
        in.close();
    } catch (Exception e) {
        Log.e("er0r", e.toString());
    }
    return str;
}

Пробовал это с inFile = "assets\whiteRed.txt" Получил эту ошибку: java.io.FileNotFoundException: assets\whiteRed.txt

ДОПОЛНИТЕЛЬНЫЙ КОД: Конструктор класса, вызывающего метод LoadData.

public class Solve {

private Context context;
//constructor

public Solve(Context context){
    this.context = context;
}

person John    schedule 18.04.2017    source источник
comment
("\\tables\\lowerLayer\\cross\\whiteRed.txt". Это несуществующий невозможный путь к файловой системе. Неудивительно, что файл не может быть найден. Как вы пришли к этому пути? Где ваш txt файл на самом деле?   -  person greenapps    schedule 18.04.2017
comment
На картинке, которую я связал, вы можете видеть, как она структурирована. Я новичок в этом, каков правильный путь? Спасибо   -  person John    schedule 18.04.2017
comment
То есть в Android Studio. Как вы думаете, почему они будут в вашем приложении, когда ваш телефон, например, не в городе?   -  person greenapps    schedule 18.04.2017
comment
Ну я хоть бы все такие файлы попали в апк что ли. Если нет, то как мне загрузить файлы в телефон? Спасибо   -  person John    schedule 18.04.2017
comment
Tried this with inFile = "assets\whiteRed.txt". Нет. Попробуйте с inFile = "whiteRed.txt";   -  person greenapps    schedule 18.04.2017
comment
Вместо этого у меня появилась эта ошибка: java.lang.NullPointerException: println требуется сообщение. И мой текстовый файл, кстати, не пустой.   -  person John    schedule 18.04.2017
comment
В вашем коде нет pintln(). Так о чем вы говорите?   -  person greenapps    schedule 18.04.2017
comment
Я пытаюсь распечатать содержимое файла следующим образом; Log.i(er0r, LoadData(whiteRed.txt));   -  person John    schedule 18.04.2017
comment
Взгляните на этот код, где вы возвращаете переменную str после последнего чтения, которое возвращает значение null. Добавьте return buf.toString(); в качестве последней строки в блоке try. Вы не использовали построитель строк! Вы были?   -  person greenapps    schedule 18.04.2017
comment
buf.append(str); Должно быть buf.append(str+"\n");.   -  person greenapps    schedule 18.04.2017
comment
Теперь это работает! Большое спасибо. Трудно диагностировать проблемы, когда вы действительно не имеете ни малейшего представления о том, что делаете. Я у тебя в долгу.   -  person John    schedule 18.04.2017
comment
@greenapps Я полагаю, что опубликованный мной метод не может быть статическим, поскольку getAssets не является статическим? И нужно ли мне иметь этот метод в классе активности?   -  person John    schedule 18.04.2017
comment
Вам нужен контекст, как уже сказал вам CommonsWare. Да. Вы можете сделать это статической функцией. LoadData(Context contex, String fileName), а затем context.getAssets()...   -  person greenapps    schedule 18.04.2017
comment
Я думаю, мне нужно, чтобы метод был статическим. Почему контекст должен быть параметром, разве он не может быть постоянным? Я не понимаю, что это такое и почему это полезно. Не могли бы вы привести пример того, что поставить перед .getAssets()   -  person John    schedule 18.04.2017
comment
Это я тебе уже говорил! Пожалуйста, прочитайте!   -  person greenapps    schedule 18.04.2017
comment
Откуда вы вызываете функцию? CommonsWare уже спрашивал вас об этом.   -  person greenapps    schedule 18.04.2017
comment
Извините, если я глуп, но я ничего не могу с собой поделать и не вижу, где вы это написали. Один ответ удален. Но я вызываю этот метод из другого класса Java. Обычный java-класс, не имеющий никакого отношения к андроиду вообще.   -  person John    schedule 18.04.2017
comment
Повторить: and then context.getAssets()... .   -  person greenapps    schedule 18.04.2017
comment
Да, я могу добавить это как параметр, если хотите. Но тогда я понятия не имею, что отправлять в качестве параметра при вызове метода.   -  person John    schedule 18.04.2017
comment
Можете ли вы добавить конструктор в этот класс Java с параметром Context? Или просто добавить параметр Context в конструктор?   -  person greenapps    schedule 18.04.2017
comment
И где вы создаете этот класс Java?   -  person greenapps    schedule 18.04.2017
comment
У меня нет конструктора в классе, из которого я хочу вызвать метод. Это просто класс, который содержит методы. Должен ли я сделать один в любом случае?   -  person John    schedule 18.04.2017
comment
У меня все классы в одном каталоге.   -  person John    schedule 18.04.2017
comment
Добавьте такой конструктор и сохраните переменную Context в частном члене класса. Затем вы можете использовать его для вызова loadData. Вы не ответили, откуда вы создали экземпляр класса.   -  person greenapps    schedule 18.04.2017
comment
Я не уверен, что вы имеете в виду, когда создаете экземпляр класса. Я только что создал класс в том же каталоге, что и другие классы. Я не создаю объекты этого класса. Но я могу попробовать сделать в нем конструктор.   -  person John    schedule 18.04.2017
comment
Если у вас есть класс, то у вас есть java-файл где-то в Android Studio. Но вы будете использовать этот класс где-то в своем коде. Как? Если методы не являются статическими, вам необходимо создать экземпляр объекта/переменной класса перед использованием метода. ОТКУДА ВЫ ВЫЗЫВАЕТЕ ЭТИ МЕТОДЫ?   -  person greenapps    schedule 18.04.2017
comment
Я добавил конструктор в свой пост. В моем классе много статических методов, которые вызываются из других классов и самого себя. И почти все методы в классе вызывают метод LoadData.   -  person John    schedule 18.04.2017
comment
Статические методы не могут использовать этот параметр Context.   -  person greenapps    schedule 18.04.2017
comment
which are callad from other classes . Ты никогда не дойдешь до сути!? От деятельности?   -  person greenapps    schedule 18.04.2017
comment
Я не знаю, что на это ответить, так как ничего не знаю о Context. Но не кажется ли это слишком продвинутым, чтобы я мог просто прочитать текст из текстового файла?   -  person John    schedule 18.04.2017
comment
Ну вы уже проверили и подтвердили, что это сработало. Так где ты это сделал?   -  person greenapps    schedule 18.04.2017
comment
Класс вызывается из активности, да.   -  person John    schedule 18.04.2017
comment
Я вызвал метод из класса, в котором он находится (класс активности). Но когда я пытаюсь вызвать метод из другого класса, у меня возникают проблемы со статическими вещами.   -  person John    schedule 18.04.2017
comment
Если вы используете статические методы своего класса, дайте каждому методу, использующему loadData, дополнительный параметр Context. И вызовите метод из такого действия, как MyClass.myMethod(это, другие параметры);   -  person greenapps    schedule 18.04.2017
comment
Итак, я должен вызвать метод LoadData из действия? Я хочу вызвать его из обычного класса. Или я вас неправильно понял?   -  person John    schedule 18.04.2017
comment
Может быть, вы можете избавиться от всех этих параметров контекста и использовать что-то вроде getApplicationContex().getAssets()... Или getBaseContext().getAssets()... Пожалуйста, попробуйте их все.   -  person greenapps    schedule 18.04.2017
comment
Да, ты меня неправильно понял. Вы будете вызывать loadData из ваших методов, которые вы сказали. Я просто рассказываю вам, как вы можете «переслать» ему контекст, используя дополнительный параметр Context.   -  person greenapps    schedule 18.04.2017
comment
Когда я пытался использовать getApplicationContex().getAssets() и другой, я получаю нестатический метод getApplicationContext, на который нельзя ссылаться из статического контекста.   -  person John    schedule 18.04.2017
comment
Что ж, вы попробовали, и теперь вы знаете. Или сделайте loadData нестатичным или продолжите с дополнительными параметрами.   -  person greenapps    schedule 18.04.2017
comment
У меня нет проблем с использованием дополнительного параметра. Я просто не знаю, каким должен быть этот параметр. Я попытался вызвать метод с параметром getApplicationContext(), но это, конечно, не сработало. Что я должен отправить в качестве параметра?   -  person John    schedule 18.04.2017
comment
Это я вам уже точно сказал!   -  person greenapps    schedule 18.04.2017
comment
Может быть, у вас есть, но я не вижу, где. Я создал частный контекст с именем context. Итак, что ТОЧНО я должен ввести в качестве второго параметра?   -  person John    schedule 18.04.2017
comment
Повторить: And call the method from an activity like MyClass.myMethod(this, other parameters).   -  person greenapps    schedule 18.04.2017
comment
Покажите, как вы вызываете такой статический метод из действия.   -  person greenapps    schedule 18.04.2017
comment
@greenapps Но я не хочу вызывать метод из действия. Я хочу вызвать его из обычного класса.   -  person John    schedule 18.04.2017
comment
Ваши слова: The class is called from the activity, yes. .   -  person greenapps    schedule 18.04.2017
comment
Возможно, вы знаете, что есть разница между классом и методом. Метод LoadData находится в действии. Но я хочу вызвать его из класса, который не является деятельностью.   -  person John    schedule 18.04.2017
comment
Пожалуйста, не учи меня. Кажется, я уже все сказал. Просто объедините вещи.   -  person greenapps    schedule 18.04.2017
comment
Похоже, вы не знаете.   -  person John    schedule 18.04.2017
comment
Что я должен ввести в качестве параметра контекста?   -  person John    schedule 18.04.2017


Ответы (1)


Если во время разработки в Android Studio вы хотите предоставить файлы, которые ваше приложение может читать во время выполнения, поместите их в папку ресурсов вашего проекта Android Studio.

Возможно, вам нужно сначала создать эту папку с ресурсами.

После этого ваше приложение сможет читать эти файлы из ресурсов с помощью диспетчера ресурсов.

Просто погуглите, как именно это сделать. Здесь все уже много раз выкладывалось.

person greenapps    schedule 18.04.2017
comment
Я не нашел ничего работающего... Я создал каталог ресурсов, но не могу заставить его работать. - person John; 18.04.2017
comment
Хорошо опубликуйте код, который вы пробовали, в своем посте. А потом рассказать о трудностях. Начните с одного файла в каталоге ресурсов, чтобы упростить задачу. - person greenapps; 18.04.2017
comment
Прости за тот беспорядок. - person John; 18.04.2017