2010-11-03 13 views
95

Rzeczy są proste, ale nie działają zgodnie z założeniami.Android odczytuje plik źródłowy surowca

Mam plik tekstowy dodany jako surowiec. Plik tekstowy zawiera tekst jak:

b) Jeżeli obowiązujące prawo wymaga ŻADNYCH GWARANCJI W ODNIESIENIU DO OPROGRAMOWANIA, WSZELKIE TAKIE GWARANCJE SĄ ograniczone w czasie do dziewięćdziesięciu (90) DNI OD DATY DOSTAWY .

(c) nie USTNE lub informacja pisemna lub UDZIELONA wirtualne orientację, ITS DEALERZY, dystrybutorów, środki lub pracowników nie stanowią GWARANTUJE w żaden sposób ZWIĘKSZENIE zakresu jakiegokolwiek GWARANCJI zapewnianych niniejszym .

(d) (tylko USA) Niektóre członkowskie nie POZWOLI NA WYŁĄCZENIE GWARANCJI DOMNIEMANYCH , WIĘC POWYŻSZE WYŁĄCZENIE MOŻE NIE ZASTOSOWANIA. NINIEJSZA GWARANCJA DAJE PAŃSTWU OKREŚLONEGO PRAWA I MOŻE PAŃSTWO POSIADAĆ INNE PRAWA PRAWNE, KTÓRE RÓŻNIĄ SIĘ W ZALEŻNOŚCI OD STANU DO STANU.

na ekranie mam układ takiego:

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

kodu do odczytu zasób surowca wynosi:

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

Tekst dostać pokazały jednak po każdym wierszu otrzymuję dziwna postać [] Jak mogę usunąć tę postać? Myślę, że to Nowa Linia.

roztwór roboczy

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

Odpowiedz

54

Co jeśli użyć BufferedReader znaków oparte zamiast InputStream bajtów oparte?

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

Nie zapomnij, że readLine() pomija nowe linie!

140

Można to wykorzystać:

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

nie jestem pewien, że Inputstream.available() jest poprawny wybór tutaj raczej czytać n do ByteArrayOutputStream aż n == -1. – ThomasRS

+12

To może nie działać w przypadku dużych zasobów. Zależy od rozmiaru bufora odczytu strumienia wejściowego i może tylko zwrócić część zasobu. – d4n3

+4

@ d4n3 ma rację, dokumentacja dostępnej metody strumienia wejściowego stwierdza: "Zwraca szacowaną liczbę bajtów, które można odczytać lub pominąć bez blokowania w celu uzyskania większej ilości danych wejściowych: Należy zauważyć, że ta metoda zapewnia tak słabą gwarancję, że nie jest bardzo przydatne w praktyce " – ozba

2

Jest to kolejna metoda, która na pewno działa, ale nie mogę zmusić go do odczytu wielu plików tekstowych do wyświetlenia w wielu TextView w jednej aktywności, ktoś może pomóc?

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 można to zrobić przez podobny sposób jak

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

Jeśli używasz IOUtils Apache "commons-io" to jeszcze łatwiej:

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

Zależności : 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

Co należy zaimportować, aby korzystać z IOUtils? –

+1

Biblioteka Apache commons-io (http://commons.apache.org/proper/commons-io/). Lub jeśli używasz Mavena (http://mvnrepository.com/artifact/commons-io/commons-io). – tbraun

+6

Dla gradle: compile "commons-io: commons-io: 2.1" – JustinMorris

3

raczej zrobić to w ten sposób:

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

Z Aktywny, dodać

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

lub z przypadku testowym, dodać

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

i oglądać obsługę błędów - nie złapać i ignorować wyjątki, kiedy musi istnieć swoimi zasobami lub coś jest (bardzo?) Źle.

+0

Czy chcesz zamknąć strumień otwarty przez 'openRawResource()'? –

+0

Nie wiem, ale to z pewnością jest standardowe. Aktualizowanie przykładów. – ThomasRS

1

1. Najpierw utwórz folder katalogu i nadaj mu nazwę surową w folderze res 2. Utwórz plik .txt wewnątrz utworzonego wcześniej katalogu surowych katalogów i nadaj mu dowolną nazwę, np.articles.txt .... 3.KOPIA i wklej tekst, który ma wewnątrz pliku txt został utworzony „articles.txt” 4.dont zapomnij podać TextView w 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(); 
} 

nadzieję, że to działa!

0

Tutaj idzie mieszanka rozwiązań Weekensów i Vovodroid.

To jest bardziej poprawne niż rozwiązanie Vovodroid i bardziej kompletne niż rozwiązanie tygodniowe.

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()); 
Powiązane problemy