Hoje iremos começar mais uma série de artigos e estes agora serão voltados a manipulação de arquivos, nesse projeto serão criadas três rotinas que são:
1º - criação de arquivos
2º - leitura de arquivos
3º - obter o System Root (diretório de armazenamento externo do Android)
Um detalhe importante para esse projeto é que será necessário habilitar a permissão WRITE_EXTERNAL_STORAGE no arquivo de manifest, é graças a essa permissão que seu aplicativo pode gravar arquivos no SD Card.
Como já de costume todos os fontes abaixo estão com vários comentários para facilitar o aprendizado.
Arquivo main.xml, layout da única tela apresentada nesse projeto:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:text="Root:"
android:id="@+id/txtRoot2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="Nome do arquivo:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edtNomeArq"
android:text="teste.txt"
android:layout_height="wrap_content"
android:layout_width="fill_parent"/>
<TextView
android:text="Texto do arquivo a ser salvo:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edtSalvar"
android:text="Escrever arquivo"
android:layout_height="wrap_content"
android:layout_width="fill_parent"/>
<TextView
android:text="Arquivo lido:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edtLer"
android:text=""
android:layout_height="wrap_content"
android:layout_width="fill_parent"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<Button
android:layout_width="0dip"
android:layout_weight="1.0"
android:layout_height="wrap_content"
android:onClick="click_Salvar"
android:text="Salvar" />
<Button
android:layout_width="0dip"
android:layout_weight="1.0"
android:layout_height="wrap_content"
android:onClick="click_Ler"
android:text="Abrir" />
<Button
android:layout_width="0dip"
android:layout_weight="1.0"
android:layout_height="wrap_content"
android:onClick="click_Limpar"
android:text="Limpar" />
</LinearLayout>
</LinearLayout>
Arquivo AndroidManifest.xml, contém configurações iniciais do aplicativo:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.EscolaDeAndroid.ArquivoTexto"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".main"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>
Arquivo main.java, classe que contém todo o fonte necessário para este projeto:
package br.com.EscolaDeAndroid.ArquivoTexto;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class main extends Activity {
private TextView txtRoot;
private TextView txtNomeArq;
private TextView txtSalvar;
private TextView txtLer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
setContentView(R.layout.main);
txtRoot = (TextView) findViewById(R.id.txtRoot2);
txtNomeArq = (TextView) findViewById(R.id.edtNomeArq);
txtSalvar = (TextView) findViewById(R.id.edtSalvar);
txtLer = (TextView) findViewById(R.id.edtLer);
txtRoot.append(GetRoot());
} catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
public void click_Salvar(View v)
{
SalvarArquivo();
}
public void click_Ler(View v)
{
LerArquivo();
}
public void click_Limpar(View v)
{
txtNomeArq.setText("teste.txt");
txtSalvar.setText("");
txtLer.setText("");
}
//Exibir o diretório de armazenamento externo do Android
private String GetRoot()
{
File root = android.os.Environment.getExternalStorageDirectory();
return root.toString();
}
private void SalvarArquivo()
{
String lstrNomeArq;
File arq;
byte[] dados;
try
{
//pega o nome do arquivo a ser gravado
lstrNomeArq = txtNomeArq.getText().toString();
arq = new File(Environment.getExternalStorageDirectory(), lstrNomeArq);
FileOutputStream fos;
//transforma o texto digitado em array de bytes
dados = txtSalvar.getText().toString().getBytes();
fos = new FileOutputStream(arq);
//escreve os dados e fecha o arquivo
fos.write(dados);
fos.flush();
fos.close();
} catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
private void LerArquivo()
{
String lstrNomeArq;
File arq;
String lstrlinha;
try
{
//pega o nome do arquivo a ser lido
lstrNomeArq = txtNomeArq.getText().toString();
//limpa a caixa de texto que irá receber os dados do arquivo
txtLer.setText("");
arq = new File(Environment.getExternalStorageDirectory(), lstrNomeArq);
BufferedReader br = new BufferedReader(new FileReader(arq));
//efetua uma leitura linha a linha do arquivo a carrega
//a caixa de texto com a informação lida
while ((lstrlinha = br.readLine()) != null) {
if (!txtLer.getText().toString().equals(""))
{
txtLer.append("\n");
}
txtLer.append(lstrlinha);
}
} catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
public void toast (String msg)
{
Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
}
private void trace (String msg)
{
toast (msg);
}
}
Abaixo temos o resultado prático de nosso projeto:
O funcionamento do projeto será o seguinte:
1º - na primeira caixa de texto será o local onde o usuário irá informar o nome do arquivo a ser salvo, por padrão o nome do arquivo será teste.txt, mas o usuário poderá informar o nome que desejar.
2º - na segunda caixa de texto será para digitar o conteúdo de nosso arquivo, em seguida o usuário deve clicar no botão "Salvar" para efetuar a gravação do arquivo.
3º - clicando no botão "Abrir" o sistema irá buscar o arquivo de acordo com a primeira caixa de texto e exibir o conteúdo na terceira caixa de texto.
4º - clicando no botão "Limpar" o aplicativo limpará a segunda e a terceira caixa de texto.
Obs.: não fiz tratamento de erro do tipo, arquivo não encontrado, se deseja substituir o arquivo já existente, esses serão temas para os próximos artigos.
Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.
Desenv com qualidade!

