Arquivo de recursos brutos de texto para leitura do Android

123

As coisas são simples, mas não funcionam como deveriam.

Eu tenho um arquivo de texto adicionado como um recurso bruto. O arquivo de texto contém texto como:

b) SE A LEI APLICÁVEL EXIGIR QUALQUER GARANTIA RELATIVA AO SOFTWARE, TODAS ESSAS GARANTIAS SÃO LIMITADAS EM DURAÇÃO A noventa (90) dias a contar da data de entrega.

(c) NENHUMA INFORMAÇÃO OU CONSELHO ORAL OU ESCRITA FORNECIDA POR ORIENTADORES VIRTUAIS, SEUS REVENDEDORES, DISTRIBUIDORES, AGENTES OU FUNCIONÁRIOS CRIARÃO UMA GARANTIA OU DE QUALQUER FORMA AUMENTARÁ O ÂMBITO DE QUALQUER GARANTIA AQUI FORNECIDA.

(d) (somente EUA) ALGUNS ESTADOS NÃO PERMITEM A EXCLUSÃO DE GARANTIAS IMPLÍCITAS, POR ISSO A EXCLUSÃO ACIMA PODE NÃO SE APLICAR A VOCÊ. ESTA GARANTIA CONCEDE DIREITOS LEGAIS ESPECÍFICOS E PODE TAMBÉM TER OUTROS DIREITOS LEGAIS QUE VARIAM DE ESTADO PARA ESTADO.

Na minha tela, tenho um layout como este:

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

O código para ler o recurso bruto é:

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

O texto é exibido, mas após cada linha eu recebo um caractere estranho [] Como posso remover esse caractere? Eu acho que é New Line.

SOLUÇÃO DE TRABALHO

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();
}
Alin
fonte
3
Dica: você pode anotar seu parâmetro rawRes com @RawRes, para que o Android Studio utilize recursos brutos.
Roel
A solução de trabalho deve ser postada como uma resposta, onde pode ser votada.
LarsH 21/05/19

Respostas:

65

E se você usar um BufferedReader baseado em caracteres em vez de InputStream baseado em bytes?

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

Não esqueça que readLine()pula as novas linhas!

weekens
fonte
162

Você pode usar isto:

    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.");
    }
Vovodroid
fonte
5
Não tenho certeza se o Inputstream.available () é a escolha correta aqui, leia n para um ByteArrayOutputStream até n == -1.
precisa saber é o seguinte
15
Isso pode não funcionar para grandes recursos. Depende do tamanho do buffer de leitura do fluxo de entrada e pode retornar apenas uma parte do recurso.
d4n3
6
@ d4n3 está certo, a documentação do método disponível do fluxo de entrada afirma: "Retorna um número estimado de bytes que podem ser lidos ou ignorados sem bloquear para obter mais entradas. Observe que esse método fornece uma garantia tão fraca que não é muito útil em prática "
ozba 10/04
Veja os documentos do Android para InputStream.available. Se eu entendi direito, eles dizem que não deve ser usado para esse fim. Quem pensava que ser tão difícil de ler o conteúdo de um arquivo estúpido ...
anhoppe
2
E você não deve pegar a exceção geral. Capture IOException.
alcsan
30

Se você usa IOUtils do apache "commons-io", é ainda mais fácil:

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

Dependências: 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'
tbraun
fonte
1
O que devo importar para usar IOUtils?
USUÁRIO
1
Biblioteca Apache commons-io ( commons.apache.org/proper/commons-io ). Ou se você usa o Maven ( mvnrepository.com/artifact/commons-io/commons-io ).
tbraun
8
Para gradle: compile "commons-io: commons-io: 2.1"
JustinMorris 24/10
9
Mas, geralmente, importar bibliotecas externas de terceiros para evitar escrever mais 3 linhas de código .. parece um exagero.
milosmns
12

Bem, com o Kotlin, você pode fazer isso apenas em uma linha de código:

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

Ou até mesmo declarar a função de extensão:

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

E então basta usá-lo imediatamente:

val txtFile = resources.getRawTextFile(R.raw.rawtextsample)
Arsenius
fonte
Você é um anjo.
Robert Liberatore
Esta foi a única coisa que funcionou para mim! Obrigado!
fuomag9 09/02
Agradável! Você fez meu dia!
cesards
3

Em vez disso, faça o seguinte:

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

Em uma atividade , adicione

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

ou de um caso de teste , adicione

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

E observe seu tratamento de erros - não capte e ignore as exceções quando seus recursos existirem ou algo estiver (muito?) Errado.

ThomasRS
fonte
Você precisa fechar o fluxo aberto por openRawResource()?
Alex Semeniuk
Eu não sei, mas isso certamente é padrão. Atualizando exemplos.
precisa saber é o seguinte
2

Esse é outro método que definitivamente funcionará, mas não consigo ler vários arquivos de texto para exibir em várias visualizações de texto em uma única atividade, alguém pode ajudar?

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

@borislemke você pode fazer isso de maneira semelhante como

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();
 }
Manish Sharma
fonte
2

Aqui vai a mistura de soluções semanais e de Vovodroid.

É mais correto que a solução Vovodroid e mais completo que a solução 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
    }
alcsan
fonte
2

Aqui está um método simples para ler o arquivo de texto da pasta bruta :

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

Aqui está uma implementação no 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())
    }
semloh eh
fonte
1

1.Primeiro, crie uma pasta Diretório e nomeie-a como bruta dentro da pasta res 2.Crie um arquivo .txt dentro da pasta de diretório bruto que você criou anteriormente e atribua um nome, por exemplo ,.articles.txt .... 3. copie e cole o arquivo texto que você deseja dentro do arquivo .txt que você criou "articles.txt" 4. não se esqueça de incluir uma visualização de texto em seu 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();
}

Espero que funcionou!

Frankrnz
fonte
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());
sakshi agrawal
fonte