2010-11-03 2 views
95

Все просто, но не работает так, как предполагалось.Файл с сырым файлом для чтения Android

У меня есть текстовый файл, добавленный как сырьевой ресурс. Текстовый файл содержит текст, как:

б) если применимое законодательство требует НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ВСЕ ЭТИ ГАРАНТИИ ОГРАНИЧЕН ДЕВЯНОСТА (90) ДНЕЙ С ДАТЫ ПОСТАВКИ ,

(с) НЕТ УСТНЫХ ИЛИ ПИСЬМЕННЫЕ СВЕДЕНИЯ ИЛИ КОНСУЛЬТАЦИИ ПРЕДОСТАВЛЕННЫХ ВИРТУАЛЬНОМ ориентирования, ЕЕ ПРОДАВЦЫ, РАСПРОСТРАНИТЕЛИ, АГЕНТЫ ИЛИ СОТРУДНИКОВ НЕ СОЗДАЮТ ГАРАНТИИ ИЛИ какой-либо образом ПОВЫШЕНИЯ объема каких-либо ГАРАНТИЙ, представленных здесь, ,

(г) (только США) В некоторых странах не РАЗРЕШЕНЫ ИСКЛЮЧЕНИЕ ПОДРАЗУМЕВАЕМЫХ ГАРАНТИЙ , ТАК ВЫШЕУКАЗАННОЕ ОГРАНИЧЕНИЕ МОЖЕТ К ВАМ НЕ ОТНОСИТСЯ. НАСТОЯЩАЯ ГАРАНТИЯ ДАЕТ ВАШИ СПЕЦИАЛЬНЫЕ ПРАВОВЫЕ ПРАВА И ВЫ МОЖЕТЕ ТАКЖЕ ИМЕЕТ ДРУГИЕ ЮРИДИЧЕСКИЕ ПРАВА, ЧТО ВАРИАНТЫ ОТ ГОСУДАРСТВА В ГОСУДАРСТВО.

На моем экране у меня есть макет, как это:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:gravity="center" 
        android:layout_weight="1.0" 
        android:layout_below="@+id/logoLayout" 
        android:background="@drawable/list_background"> 

      <ScrollView android:layout_width="fill_parent" 
         android:layout_height="fill_parent"> 

        <TextView android:id="@+id/txtRawResource" 
           android:layout_width="fill_parent" 
           android:layout_height="fill_parent" 
           android:padding="3dip"/> 
      </ScrollView> 

    </LinearLayout> 

код на необработанный ресурс является:

TextView txtRawResource= (TextView)findViewById(R.id.txtRawResource); 

txtDisclaimer.setText(Utils.readRawTextFile(ctx, R.raw.rawtextsample); 

public static String readRawTextFile(Context ctx, int resId) 
{ 
    InputStream inputStream = ctx.getResources().openRawResource(resId); 

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

    int i; 
    try { 
     i = inputStream.read(); 
     while (i != -1) 
     { 
      byteArrayOutputStream.write(i); 
      i = inputStream.read(); 
     } 
     inputStream.close(); 
    } catch (IOException e) { 
     return null; 
    } 
    return byteArrayOutputStream.toString(); 
} 

Текст получить показал, но после каждой строки я получаю странный характер [] Как я могу удалить этот символ? Я думаю, что это новая линия.

РАБОЧИЙ РАСТВОР

public static String readRawTextFile(Context ctx, int resId) 
{ 
    InputStream inputStream = ctx.getResources().openRawResource(resId); 

    InputStreamReader inputreader = new InputStreamReader(inputStream); 
    BufferedReader buffreader = new BufferedReader(inputreader); 
    String line; 
    StringBuilder text = new StringBuilder(); 

    try { 
     while ((line = buffreader.readLine()) != null) { 
      text.append(line); 
      text.append('\n'); 
     } 
    } catch (IOException e) { 
     return null; 
    } 
    return text.toString(); 
} 

ответ

54

Что делать, если вы используете BufferedReader символов на основе вместо байт на основе InputStream?

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
String line = reader.readLine(); 
while (line != null) { ... } 

Не забывайте, что readLine() пропускает новые линии!

140

Вы можете использовать это:

try { 
     Resources res = getResources(); 
     InputStream in_s = res.openRawResource(R.raw.help); 

     byte[] b = new byte[in_s.available()]; 
     in_s.read(b); 
     txtHelp.setText(new String(b)); 
    } catch (Exception e) { 
     // e.printStackTrace(); 
     txtHelp.setText("Error: can't show help."); 
    } 
+4

Я не уверен, что Inputstream.available() является правильным выбором здесь, а читать п к ByteArrayOutputStream нед п == -1. – ThomasRS

+12

Это может не работать для больших ресурсов. Это зависит от размера буфера чтения входного потока и может возвращать только часть ресурса. – d4n3

+4

@ d4n3 прав, в документации доступного метода входного потока указано: «Возвращает оценочное количество байтов, которое может быть прочитано или пропущено без блокировки для большего ввода. Обратите внимание, что этот метод обеспечивает такую ​​слабую гарантию, что он не является очень полезно на практике » – ozba

2

Это еще один метод, который, безусловно, работать, но я не могу заставить его прочитать несколько текстовых файлов для просмотра в нескольких TextViews в одной деятельности, кто может помочь?

TextView helloTxt = (TextView)findViewById(R.id.yourTextView); 
    helloTxt.setText(readTxt()); 
} 

private String readTxt(){ 

InputStream inputStream = getResources().openRawResource(R.raw.yourTextFile); 
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

int i; 
try { 
i = inputStream.read(); 
while (i != -1) 
    { 
    byteArrayOutputStream.write(i); 
    i = inputStream.read(); 
    } 
    inputStream.close(); 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 

return byteArrayOutputStream.toString(); 
} 
1

@borislemke вы можете сделать это таким же образом, как

TextView tv ; 
findViewById(R.id.idOfTextView); 
tv.setText(readNewTxt()); 
private String readNewTxt(){ 
InputStream inputStream = getResources().openRawResource(R.raw.yourNewTextFile); 
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

int i; 
try { 
i = inputStream.read(); 
while (i != -1) 
    { 
    byteArrayOutputStream.write(i); 
    i = inputStream.read(); 
    } 
    inputStream.close(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
e.printStackTrace(); 
} 

return byteArrayOutputStream.toString(); 
} 
24

Если вы используете IOUtils от апача "достоянию-IO" это еще проще:

InputStream is = getResources().openRawResource(R.raw.yourNewTextFile); 
String s = IOUtils.toString(is); 
IOUtils.closeQuietly(is); // don't forget to close your streams 

Зависимости : http://mvnrepository.com/artifact/commons-io/commons-io

Maven:

<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.4</version> 
</dependency> 

Gradle:

'commons-io:commons-io:2.4' 
+0

Что нужно импортировать для использования IOUtils? –

+1

Библиотека Apache commons-io (http://commons.apache.org/proper/commons-io/). Или если вы используете Maven (http://mvnrepository.com/artifact/commons-io/commons-io). – tbraun

+6

Для градации: скомпилируйте «commons-io: commons-io: 2.1» – JustinMorris

3

Скорее сделать это таким образом:

// reads resources regardless of their size 
public byte[] getResource(int id, Context context) throws IOException { 
    Resources resources = context.getResources(); 
    InputStream is = resources.openRawResource(id); 

    ByteArrayOutputStream bout = new ByteArrayOutputStream(); 

    byte[] readBuffer = new byte[4 * 1024]; 

    try { 
     int read; 
     do { 
      read = is.read(readBuffer, 0, readBuffer.length); 
      if(read == -1) { 
       break; 
      } 
      bout.write(readBuffer, 0, read); 
     } while(true); 

     return bout.toByteArray(); 
    } finally { 
     is.close(); 
    } 
} 

    // reads a string resource 
public String getStringResource(int id, Charset encoding) throws IOException { 
    return new String(getResource(id, getContext()), encoding); 
} 

    // reads an UTF-8 string resource 
public String getStringResource(int id) throws IOException { 
    return new String(getResource(id, getContext()), Charset.forName("UTF-8")); 
} 

От деятельности, добавьте

public byte[] getResource(int id) throws IOException { 
     return getResource(id, this); 
} 

или из теста, добавьте

public byte[] getResource(int id) throws IOException { 
     return getResource(id, getContext()); 
} 

И следите за обработку ошибок - не поймать и игнорировать исключения, когда ваши ресурсы должны существовать или что-то (очень?) Неправильно.

+0

Вам нужно закрыть поток, открытый 'openRawResource()'? –

+0

Я не знаю, но это, безусловно, стандарт. Обновление примеров. – ThomasRS

1

1.First создать папку каталога и назовите его сырым внутри папки Реза 2.Create .txt файл внутри сырой папки каталога, созданной ранее, и дать ему любое имя eg.articles.txt .... 3.Copy и вставить текст, который вы хотите в файл .txt вы создали «articles.txt» 4.dont забудьте включить TextView в вашем main.xml MainActivity.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_gettingtoknowthe_os); 

    TextView helloTxt = (TextView)findViewById(R.id.gettingtoknowos); 
    helloTxt.setText(readTxt()); 

    ActionBar actionBar = getSupportActionBar(); 
    actionBar.hide();//to exclude the ActionBar 
} 

private String readTxt() { 

    //getting the .txt file 
    InputStream inputStream = getResources().openRawResource(R.raw.articles); 

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

    try { 
     int i = inputStream.read(); 
     while (i != -1) { 
      byteArrayOutputStream.write(i); 
      i = inputStream.read(); 
     } 
     inputStream.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return byteArrayOutputStream.toString(); 
} 

Надеется, что это сработало!

0

Здесь представлено сочетание решений для выходных и Vovodroid.

Это вернее решения Vovodroid и более полного, чем решение для выходных.

try { 
     InputStream inputStream = res.openRawResource(resId); 
     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
      try { 
       StringBuilder result = new StringBuilder(); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        result.append(line); 
       } 
       return result.toString(); 
      } finally { 
       reader.close(); 
      } 
     } finally { 
      inputStream.close(); 
     } 
    } catch (IOException e) { 
     // process exception 
    } 
0
InputStream is=getResources().openRawResource(R.raw.name); 
BufferedReader reader=new BufferedReader(new InputStreamReader(is)); 
StringBuffer data=new StringBuffer(); 
String line=reader.readLine(); 
while(line!=null) 
{ 
data.append(line+"\n"); 
} 
tvDetails.seTtext(data.toString()); 
Смежные вопросы