Android читає текстовий файл сировини ресурсу


123

Речі прості, але не працюють як слід.

У мене додається текстовий файл як сировинний ресурс. Текстовий файл містить такий текст:

б) ЯКЩО ЗАСТОСУВАННЯ ЗАКОНОДАВСТВА ЗАБЕЗПЕЧАЄ ЯКІ-небудь гарантії, що стосуються програмного забезпечення, ВСІ ТАКІ ГАРАНТІЇ ОБ'ЄДНАНІ В ДОВОЛЬНІСТЬ ДО 90 НЕДОЛІК (90) ДНІВ З ДАТОМ ДОСТАВКИ.

(c) АБО НЕ УСЬКА АБО ПИСЬМА ІНФОРМАЦІЯ ТА РЕКЛАМА, ЩО ПОДАЄТЬСЯ ВІРТУАЛЬНОГО ОРІЄНТЕРІЄРИНГУ, ЇЇ ПРОДАВЦІ, ДИСТРИБУРАТОРИ, АГЕНТИ АБО РОБОТОДАВЦІ НЕ БУДЬ СТВОРИТИ ГАРАНТІЮ АБО БУДЬ ЯКЩО СПОСОБУВАТИ ОБ'ЄМНІСТЬ, ЯКІ ЗАБЕЗПЕЧЕННЯ ЗАЯВЛЕНО.

(d) (лише для США) ДЕЯКІ ДЕРЖАВИ НЕ ДОЗВОЛЯЮТЬ ВИКЛЮЧЕННЯ ВПРОВАДЖЕНИХ ГАРАНТІЙ, Тому ВИНАХОДЖЕННЯ ВИКЛЮЧЕННЯ НЕ МОЖЕ ЗАЯВИТИсь до вас. ЦЕ ГАРАНТІЯ ДАЄ ВАС СПЕЦИФІЧНІ ПРАВОВІ ПРАВА, А ВИ МОЖЕТЕ ТАКОЖ ІНШІ ПРАВОВІ ПРАВА, ЩО ВЗАЄМО З ДЕРЖАВИ ДО ДЕРЖАВИ.

На екрані у мене такий макет:

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

3
Підказка: Ви можете анотувати свій параметр rawRes за допомогою @RawRes, щоб Android Studio очікував на сировинні ресурси.
Roel

Робоче рішення повинно бути розміщено у вигляді відповіді, де воно може бути використане.
LarsH

Відповіді:


65

Що робити, якщо ви використовуєте на основі символів BufferedReader замість InputStream на основі байтів?

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

Не забувайте, що readLine()пропускає нові рядки!


162

Ви можете скористатися цим:

    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.");
    }

5
Я не впевнений, що Inputstream.available () є правильним вибором тут, скоріше прочитайте n до ByteArrayOutputStream до n == -1.
ThomasRS

15
Це може не працювати для великих ресурсів. Це залежить від розміру буфера зчитування вхідного потоку і може повернути лише частину ресурсу.
d4n3

6
@ d4n3 має рацію, у документації доступного методу вхідного потоку зазначено: "Повертає орієнтовну кількість байтів, які можна прочитати чи пропустити, не блокуючи для додаткового введення. Зауважте, що цей метод дає таку слабку гарантію, що він не дуже корисний у практика "
ozba

Подивіться на андроїд-документи для InputStream.available. Якщо я правильно визнаю, вони кажуть, що це не повинно використовуватися для цієї мети. Хто подумав, що важко прочитати вміст дурного файлу ...
anhoppe

2
І не слід ловити загального винятку. Ловіть натомість IOException.
alcsan

30

Якщо ви використовуєте IOUtils від apache "commons-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'

1
Що потрібно імпортувати, щоб використовувати IOUtils?
ТЕ uSeFuL

1
Бібліотека Apache commons-io ( commons.apache.org/proper/commons-io ). Або якщо ви використовуєте Maven ( mvnrepository.com/artifact/commons-io/commons-io ).
tbraun

8
For gradle: compile "commons-io: commons-io: 2.1"
JustinMorris

9
Але загалом імпорт зовнішніх сторонніх ліжок, щоб уникнути написання ще 3 рядків коду .. здається зайвим.
milosmns

12

Добре з Kotlin u може це зробити лише в одному рядку коду:

resources.openRawResource(R.raw.rawtextsample).bufferedReader().use { it.readText() }

Або навіть оголосити функцію розширення:

fun Resources.getRawTextFile(@RawRes id: Int) =
        openRawResource(id).bufferedReader().use { it.readText() }

А потім просто скористайтеся ним прямо:

val txtFile = resources.getRawTextFile(R.raw.rawtextsample)


Це було єдине, що працювало на мене! Дякую!
fuomag9

Приємно! Ти зробив мій день!
цезард

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

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


Вам потрібно закрити потік, відкритий openRawResource()?
Олексій Семенюк

Я не знаю, але це, звичайно, стандарт. Оновлення прикладів.
ThomasRS

2

Це ще один метод, який, безумовно, спрацює, але я не можу змусити його читати декілька текстових файлів, щоб переглядати в декількох переглядах текстів за одну діяльність, хто-небудь може допомогти?

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

2

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

2

Тут ви знайдете поєднання рішень тижневика та 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
    }

2

Ось простий спосіб прочитати текстовий файл із сирої папки:

public static String readTextFile(Context context,@RawRes int id){
    InputStream inputStream = context.getResources().openRawResource(id);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

    byte buffer[] = new byte[1024];
    int size;
    try {
        while ((size = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, size);
        }
        outputStream.close();
        inputStream.close();
    } catch (IOException e) {

    }
    return outputStream.toString();
}

2

Ось реалізація в Kotlin

    try {
        val inputStream: InputStream = this.getResources().openRawResource(R.raw.**)
        val inputStreamReader = InputStreamReader(inputStream)
        val sb = StringBuilder()
        var line: String?
        val br = BufferedReader(inputStreamReader)
        line = br.readLine()
        while (line != null) {
            sb.append(line)
            line = br.readLine()
        }
        br.close()

        var content : String = sb.toString()
        Log.d(TAG, content)
    } catch (e:Exception){
        Log.d(TAG, e.toString())
    }

1

1. Спочатку створіть папку «Каталог» та вкажіть її в сировині всередині папки res. 2. створіть .txt-файл у папці, яку ви створили раніше, і дайте їй будь-яке ім’я, наприклад ,.articles.txt .... 3.копіюйте та вставте папку текст, який ви хочете, щоб у файлі .txt ви створили "Article.txt" 4.не забудьте включити перегляд тексту у свій 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();
}

Сподіваюся, це спрацювало!


1
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());
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.