web-dev-qa-db-fra.com

Fichier de ressource brute en lecture de texte Android

Les choses sont simples mais ne fonctionnent pas comme prévu.

J'ai un fichier texte ajouté en tant que ressource brute. Le fichier texte contient du texte comme:

b) SI LE DROIT APPLICABLE EXIGE TOUTE GARANTIE CONCERNANT LE LOGICIEL, TOUTES CES GARANTIES SONT. DURÉE LIMITÉE À NINETY (90) JOURS DE LA DATE DE LIVRAISON.

(c) AUCUN ORAL OR INFORMATIONS ÉCRITES OU CONSEIL DONNÉ PAR L’ORIENTATION VIRTUELLE, SES REVENDEURS, DISTRIBUTEURS, AGENTS OU LES EMPLOYÉS CRÉENT UNE GARANTIE OU DE TOUTE MANIÈRE AUGMENTER LA PORTÉE DE TOUT GARANTIE FOURNIE DANS LA PRÉSENTE. 

(d) (États-Unis uniquement) CERTAINS ÉTATS NE POUVENT PAS PERMETTENT L’EXCLUSION DES IMPLICITES GARANTIES, SO L’EXCLUSION PRÉCÉDENTE PEUT NE PAS APPLIQUER À VOUS. CETTE GARANTIE DONNE VOUS DROITS SPÉCIFIQUES ET VOUS POUVEZ AUSSI AUSSI D'AUTRES DROITS JURIDIQUES QUE VARIENT D'UN ÉTAT À L'AUTRE.

Sur mon écran, j'ai une disposition comme celle-ci:

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

Le code pour lire la ressource brute est:

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

Le texte est affiché mais après chaque ligne, un caractère étrange apparaît [] Comment supprimer ce caractère? Je pense que c'est New Line.

SOLUTION DE TRAVAIL

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

Que faire si vous utilisez un BufferedReader basé sur des caractères au lieu d'un InputStream basé sur des octets?

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

N'oubliez pas que readLine() saute les nouvelles lignes!

55
weekens

Vous pouvez utiliser ceci:

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

Si vous utilisez IOUtils d'Apache "commons-io", c'est encore plus simple:

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

Dépendances: 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'
28
tbraun

Faites-le plutôt de cette façon:

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

D'un Activité , ajouter

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

ou à partir d'un test case , add

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

Et surveillez votre gestion des erreurs - ne détectez pas et ignorez les exceptions lorsque vos ressources doivent exister ou que quelque chose ne va pas. 

4
ThomasRS

C’est une autre méthode qui fonctionnera à coup sûr, mais je ne peux pas l’obtenir pour lire plusieurs fichiers texte à afficher dans plusieurs vues de texte en une seule activité. Quelqu'un peut-il aider?

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

@borislemke vous pouvez le faire de la même manière, comme 

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

Voici le mélange des solutions de weekens et de Vovodroid.

C'est plus correct que la solution de Vovodroid et plus complet que la solution de weekens.

    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
    }
1
alcsan

1. Créez d'abord un dossier de répertoire et nommez-le brut dans le dossier res 2.créez un fichier .txt dans le dossier de répertoire brut que vous avez créé précédemment et nommez-le, par exemple, articles.txt .... 3.copiez et collez le texte souhaité dans le fichier .txt que vous avez créé "articles.txt" 4.sans oublier d’inclure une vue de texte dans votre fichier 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();
}

J'espère que ça a fonctionné!

1
Fuser14

Voici une implémentation à 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
semloh eh
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());
1
sakshi agrawal

Voici une méthode simple pour lire le fichier text à partir du dossier raw:

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