Android ham metin kaynak dosyasını oku


123

İşler basit ama olması gerektiği gibi çalışmıyor.

Ham kaynak olarak eklenmiş bir metin dosyam var. Metin dosyası aşağıdaki gibi metinler içerir:

b) GEÇERLİ YASA YAZILIMLA İLGİLİ HERHANGİ BİR GARANTİ GEREKTİRİRSE, TÜM GARANTİLER TESLİM TARİHİNDEN İTİBAREN DOKUZ (90) GÜNLE SINIRLIDIR.

(c) SANAL ORIENTEERING, BAYİLERİ, DAĞITICILARI, TEMSİLCİLERİ VEYA ÇALIŞANLARI TARAFINDAN VERİLEN HİÇBİR SÖZLÜ VEYA YAZILI BİLGİ VEYA TAVSİYE BİR GARANTİ OLUŞTURMAZ VEYA HERHANGİ BİR ŞEKİLDE BURADA SAĞLANAN HERHANGİ BİR GARANTİNİN KAPSAMINI ARTIRMAZ.

(d) (yalnızca ABD) BAZI DEVLETLER ZIMNİ GARANTİLERİN HARİÇ TUTULMASINA İZİN VERMEMEKTEDİR, BU DURUMDA YUKARIDAKİ MUAFİYET SİZİN İÇİN GEÇERLİ OLMAYABİLİR. BU GARANTİ SİZE BELİRLİ YASAL HAKLAR VERMEKTEDİR VE AYRICA DEVLETLERDEN DEVLETLERE DEĞİŞEN BAŞKA YASAL HAKLARA DA SAHİP OLABİLİRSİNİZ.

Ekranımda şöyle bir düzen var:

<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>

Ham kaynağı okumak için kod:

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

Metin gösteriliyor ama her satırdan sonra garip bir karakter alıyorum [] Bu karakteri nasıl kaldırabilirim? Sanırım New Line.

ÇALIŞMA ÇÖZÜMÜ

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
İpucu: Android Studio'nun ham kaynakları hariç tutması için rawRes Parametrenize @RawRes ile açıklama ekleyebilirsiniz.
Roel

Çalışma çözümü, oylanabileceği bir Cevap olarak yayınlanmalıdır.
LarsH

Yanıtlar:


65

Bayt tabanlı InputStream yerine karakter tabanlı BufferedReader kullanırsanız ne olur?

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

Unutma readLine(), yeni satırları atlıyor!


162

Bunu kullanabilirsiniz:

    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 () 'nin burada doğru seçim olduğundan emin değilim, bunun yerine n == -1'e kadar bir ByteArrayOutputStream'e n'yi okuyun.
ThomasRS

15
Bu, büyük kaynaklar için çalışmayabilir. Giriş akışı okuma arabelleğinin boyutuna bağlıdır ve kaynağın yalnızca bir bölümünü döndürebilir.
d4n3

6
@ d4n3 doğrudur, mevcut giriş akışının dokümantasyonu şu şekildedir: "Daha fazla giriş için engellemeden okunabilen veya atlanabilen tahmini bir bayt sayısı döndürür. Bu yöntemin o kadar zayıf bir garanti sağladığına dikkat edin: uygulama "
ozba

InputStream.available için android belgelerine bakın. Doğru anlarsam bu amaçla kullanılmaması gerektiğini söylüyorlar. Aptal bir dosyanın içeriğini okumanın bu kadar zor olduğunu kim düşünürdü ...
anhoppe

2
Ve genel İstisnayı yakalamamalısınız. Bunun yerine IOException'ı yakalayın.
alcsan

30

Apache "commons-io" dan IOUtils kullanırsanız, daha da kolay:

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

Bağımlılıklar: http://mvnrepository.com/artifact/commons-io/commons-io

Uzman:

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

Gradle:

'commons-io:commons-io:2.4'

1
IOUtils'i kullanmak için neleri içe aktarmalıyım?
KULLANIM

1
Apache commons-io kitaplığı ( commons.apache.org/proper/commons-io ). Veya Maven kullanıyorsanız ( mvnrepository.com/artifact/commons-io/commons-io ).
tbraun

8
Gradle için: "commons-io: commons-io: 2.1"
derleyin

9
Ancak genel olarak, 3 satır daha kod yazmaktan kaçınmak için harici üçüncü taraf kitaplarını içe aktarmak ... aşırı bir şey gibi görünüyor.
milosmns

12

Eh, Kotlin ile bunu yalnızca bir satır kodla yapabilirsiniz:

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

Veya uzantı işlevini beyan edin:

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

Ve sonra hemen kullanın:

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

Sen bir meleksin.
Robert Liberatore

Bu benim için işe yarayan tek şeydi! Teşekkür ederim!
fuomag9

Güzel! Günümü gün ettin!
cesards

3

Bunun yerine şu şekilde yapın:

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

Bir Etkinlikten ekleyin

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

veya bir test senaryosundan ekleyin

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

Ve hata işlemenize dikkat edin - kaynaklarınız olması gerektiğinde veya bir şeyler (çok?) Yanlış olduğunda istisnaları yakalayıp görmezden gelmeyin.


Tarafından açılan akışı kapatmanız mı gerekiyor openRawResource()?
Alex Semeniuk

Bilmiyorum ama bu kesinlikle standart. Örnekler güncelleniyor.
ThomasRS

2

Bu kesinlikle işe yarayacak başka bir yöntem, ancak tek bir etkinlikte birden çok metin görünümünde görüntülemek için birden çok metin dosyasını okuyamıyorum, kimse yardımcı olabilir mi?

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 bunu benzer şekilde yapabilirsiniz.

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

İşte Weekens ve Vovodroid'in çözümlerinin karışımı.

Vovodroid'in çözümünden daha doğru ve weekens'ın çözümünden daha eksiksiz.

    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

İşte okumak için basit bir yöntemdir metin dosyasını gelen ham klasöre:

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

İşte Kotlin'de bir uygulama

    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. İlk olarak bir Dizin klasörü oluşturun ve res klasörünün içinde ham olarak adlandırın 2. daha önce oluşturduğunuz ham dizin klasörünün içinde bir .txt dosyası oluşturun ve ona herhangi bir ad verin, örn. Articles.txt .... 3. kopyalayıp yapıştırın Oluşturduğunuz .txt dosyası içinde istediğiniz metin "makaleler.txt" 4. main.xml MainActivity.java dosyanıza bir metin görünümü eklemeyi unutmayın

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

Umarım işe yaramıştır!


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());
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.