2016-12-27 2 views
2

У меня есть текстовый файл в папке с ресурсами, каталог является основным/src/assets/socso.txt, и что происходит, когда я пытаюсь его прочитать, там возникают ошибки. Я прочитал много другого вопроса, который включает в себя тот, который может быть помещен в текстовый файл, и я очень уверен, что я сделал это правильно, и большая часть примера использует буферизованный читатель, который мне не нужен, поэтому я изменяю его, но все же произошла ошибка. То, что я пытаюсь сделать, это использовать сканер для чтения двойного типа данных из текстового файла слово за словом и, следовательно, не следует использовать буферизованный считыватель. Ниже приведены некоторые из моего кода были использованы:Чтение double из текстового файла в активах со сканером без буферизованного считывателя

InputStreamReader sc = new InputStreamReader(getAssets().open("socso.txt")); 
Vector v = new Vector(); 
Iterator i = v.iterator(); 
String llimit; 
while((llimit = sc.toString()) != null) 
{ 
    Socso s = new Socso(); 
    s.setLowerlimit(Double.parseDouble(llimit)); 
    s.setUpperlimit(Double.parseDouble(sc.toString())); 
    s.setEmployershares(Double.parseDouble(sc.toString())); 
    s.setEmployeeshares(Double.parseDouble(sc.toString())); 
    s.setType2(Double.parseDouble(sc.toString())); 

    v.add(s); 
} 

sc.close(); 
//when I run this, I can;t even run as error occur 

Другим вариантом

//InputStream is = resources.getAssets().open("socso.txt"); (When I use this it appears as error too) 
FileInputStream is = new FileInputStream(socso.txt); //(use this appear FileNotFoundException) 
Scanner sc = new Scanner(is); 
Vector v = new Vector(); 
Iterator i = v.iterator(); 
while(sc.hasNext()) 
{ 
    Socso s = new Socso(); 
    s.setLowerlimit(sc.nextDouble()); 
    s.setUpperlimit(sc.nextDouble()); 
    s.setEmployershares(sc.nextDouble()); 
    s.setEmployeeshares(sc.nextDouble()); 
    s.setType2(sc.nextDouble()); 

    v.add(s); 
} 

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

+0

Вы используете этот код из фрагмента или из какого-либо мероприятия? – EyadMhanna

+0

«У меня есть текстовый файл внутри папки с активами» - затем используйте 'open (" socso.txt ")' в 'AssetManager'. Актив - это файл на вашей машине разработки, а не на устройстве, поэтому 'FileInputStream' не будет работать. Кроме того, 'llimit = sc.toString()' бессмысленно, поскольку 'toString()' на 'InputStreamReader' ничего не возвращает из потока. Помимо этого, я бы рекомендовал использовать более современный формат файла данных (например, JSON, XML), чем кажется вашим текстовым файлом. – CommonsWare

+0

Eyad Mhanna, это на самом деле фрагмент кода из метода внутри класса Java, поэтому я думаю, что это не активность. –

ответ

3

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

InputStream is = getActivity().getResources.getAssets().open("socso.txt"); 

И:

InputStreamReader sc = new InputStreamReader(getActivity().getAssets().open("socso.txt")); 

Если вы хотите, чтобы вызывать эти функции в классе Java, создать метод, который вы передаете параметр типа контекст к нему, контекст в деятельности является сама деятельность, в то время как это getActivity() во фрагменте, поэтому этот метод должен быть таким:

public void readDoubleFromText(Context context) { 
    InputStreamReader sc = new InputStreamReader(context.getAssets().open("socso.txt")); 
//rest of function.... 
} 
+0

Я заменил его на первый, но похоже, что он не может разрешить часть getActivity(), потому что код появляется в методе класса Java? –

+0

, если вы используете его внутри метода в классе JAVA, вы должны передать параметр типа «Контекст» этому методу и заменить getActivity() на этот параметр – EyadMhanna

+0

. Я обновлю свой ответ – EyadMhanna

Смежные вопросы