Aqui está o que eu faço em uma atividade de leitura em buffer estender / modificar para atender às suas necessidades
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(getAssets().open("filename.txt")));
// do reading, usually loop until end of file reading
String mLine;
while ((mLine = reader.readLine()) != null) {
//process line
...
}
} catch (IOException e) {
//log the exception
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
//log the exception
}
}
}
Edição: Minha resposta talvez seja inútil se sua pergunta é sobre como fazê-lo fora de uma atividade. Se sua pergunta é simplesmente como ler um arquivo do ativo, a resposta está acima.
ATUALIZAÇÃO :
Para abrir um arquivo especificando o tipo, adicione o tipo na chamada InputStreamReader da seguinte maneira.
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(getAssets().open("filename.txt"), "UTF-8"));
// do reading, usually loop until end of file reading
String mLine;
while ((mLine = reader.readLine()) != null) {
//process line
...
}
} catch (IOException e) {
//log the exception
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
//log the exception
}
}
}
EDITAR
Como o @Stan diz no comentário, o código que estou dando não está resumindo as linhas. mLine
é substituído a cada passe. Por isso escrevi //process line
. Presumo que o arquivo contenha algum tipo de dados (ou seja, uma lista de contatos) e cada linha deve ser processada separadamente.
Caso você queira simplesmente carregar o arquivo sem nenhum tipo de processamento, será necessário resumir mLine
a cada passagem usando StringBuilder()
e anexando cada passagem.
OUTRA EDIÇÃO
De acordo com o comentário do @Vincent, adicionei o finally
bloco.
Observe também que no Java 7 e superior você pode usar try-with-resources
para usar os recursos AutoCloseable
e Closeable
do Java recente.
CONTEXTO
Em um comentário, @LunarWatcher aponta que getAssets()
é um class
in context
. Portanto, se você chamá-lo fora de um, activity
precisará se referir a ele e passar a instância de contexto para a atividade.
ContextInstance.getAssets();
Isso é explicado na resposta de @Maneesh. Portanto, se isso é útil para você, responda a resposta dele porque foi ele quem apontou isso.
finally {reader.close();}
.context.getAssets(.....)
só funciona em Activity em outra classe que você precise usar
Context
para isso.Faça um construtor para a classe Utils passar referência de atividade (maneira feia) ou contexto de aplicação como um parâmetro para ele. Usando isso, use getAsset () na sua classe Utils.
fonte
Context
.Antes tarde do que nunca.
Tive dificuldades em ler arquivos linha por linha em algumas circunstâncias. O método abaixo é o melhor que encontrei até agora e recomendo.
Uso:
String yourData = LoadData("YourDataFile.txt");
Onde YourDataFile.txt supõe residir em ativos /
fonte
stream.available()
.fonte
input = new BufferedReader(new InputStreamReader(fIn));
.fonte
solução de uma linha para kotlin:
fonte
getAssets()
O método funcionará quando você estiver chamando dentro da classe Activity.Se você chamar esse método na classe não Activity, precisará chamar esse método do Contexto, que é passado da classe Activity. Então abaixo está a linha pela qual você pode acessar o método
ContextInstance
pode ser passado como este da classe Activity.fonte
Os arquivos de leitura e gravação sempre foram detalhados e propensos a erros. Evite essas respostas e use Okio :
fonte
IOException
bloco de tentativa / captura 2) Fechamento de fluxos em caso de exceção 3) Este código lê uma única linha, não o arquivo inteiro. Em termos de desempenho, essa biblioteca é definitivamente única, sem dúvida. Agora, diga-me que ainda devo evitar "essas respostas" e implementar o Okio apenas para ler arquivos? A resposta é NÃO, a menos que já faça parte do seu aplicativo.Aqui está um método para ler um arquivo nos ativos:
fonte
Você pode carregar o conteúdo do arquivo. Considere que o arquivo está presente na pasta de ativos.
Agora você pode obter o conteúdo chamando a função da seguinte maneira
Considerando que o data.json está armazenado em Application \ app \ src \ main \ assets \ data.json
fonte
Em MainActivity.java
Além disso, você pode criar uma classe separada que faz todo o trabalho
Na minha opinião, é melhor criar uma interface, mas não é necessário
fonte
Se você usa outra classe que não seja Activity, pode fazer o seguinte,
fonte
Usando o Kotlin, você pode fazer o seguinte para ler um arquivo de ativos no Android:
fonte
Talvez seja tarde demais, mas para o bem de outras pessoas que procuram as respostas peachy:
fonte
cityfile.txt
fonte
File no longer available That file has now been permanently removed and cannot be recovered
A classe Scanner pode simplificar isso.
fonte
@HpTerm responde à versão do Kotlin:
fonte
var mLine:String
deve servar mLine:String?
var data: String?
deve servar data = ""
tipo de retorno deve serString
Aqui está uma maneira de obter um
InputStream
para um arquivo naassets
pasta sem umContext
,Activity
,Fragment
ouApplication
. A decisão de como você obtém os dadosInputStream
depende disso . Há muitas sugestões para isso em outras respostas aqui.Kotlin
Java
Todas as apostas estão desativadas se um costume
ClassLoader
estiver em jogo.fonte