<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Ficheiros</id>
	<title>Ficheiros - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Ficheiros"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Ficheiros&amp;action=history"/>
	<updated>2026-10-21T13:15:57Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=Ficheiros&amp;diff=57527&amp;oldid=prev</id>
		<title>Carrion: /* Memoria Externa: XML do Layaout */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Ficheiros&amp;diff=57527&amp;oldid=prev"/>
		<updated>2015-10-25T23:49:24Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Memoria Externa: XML do Layaout&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Introdución==&lt;br /&gt;
*O tratamento dos ficheiros en Android é idéntico a Java.&lt;br /&gt;
&lt;br /&gt;
===Introdución á E/S en Java===&lt;br /&gt;
*O paquete &amp;#039;&amp;#039;&amp;#039;java.io&amp;#039;&amp;#039;&amp;#039; contén as clases para manipular a E/S.&lt;br /&gt;
*En java a entrada/saída xestionase a través de &amp;#039;&amp;#039;&amp;#039;streams (fluxos)&amp;#039;&amp;#039;&amp;#039; , e estes poden interactuar cun teclado, a consola, un porto, un ficheiro, outro stream, etc.&lt;br /&gt;
*Todo stream ten un orixe e un destino.&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Streams&amp;quot; widths=&amp;quot;350&amp;quot; heights=&amp;quot;300px&amp;quot; perrow=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
Image:Es_lectura.gif| &amp;#039;&amp;#039;&amp;#039;Stream/fluxo de lectura&amp;#039;&amp;#039;&amp;#039; (Da fonte dos dato ao programa, ou dun stream a outro stream).&lt;br /&gt;
Image:Es_escritura.gif| &amp;#039;&amp;#039;&amp;#039;Stream/fluxo de escritura&amp;#039;&amp;#039;&amp;#039; (Do programa ao destino dos datos, ou dun stream a outro stream).&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*O fluxo máis básico de E/S son os fluxos de bytes, pero un fluxo de bytes pode ser a entrada doutro fluxo máis complexo, até chegar a ter fluxos de caracteres, e de buffers e o mesmo á inversa.&lt;br /&gt;
&lt;br /&gt;
*Para aquel usuario que desexe repasar ou afondar na E/S en java déixanse os seguintes enlaces:&lt;br /&gt;
**Curso de [[Java]] nos Manuais do IES San Clemente: [[Entrada/Saída]]&lt;br /&gt;
**Diagramas moi gráficos (valga a redundancia) das xerarquías de clases de E/S, onde se poden ver as clases, atributos, construtores, métodos, etc dun modo moi claro:&lt;br /&gt;
**http://www.falkhausen.de/en/diagram/html/java.io.Writer.html (Neste caso da xerarquía writer).&lt;br /&gt;
**A modo de exemplo amósase un exemplo de diagrama da xerarquía &amp;#039;&amp;#039;Reader&amp;#039;&amp;#039;:&lt;br /&gt;
**Observar no diagrama como os costrutores da clase &amp;#039;&amp;#039;&amp;#039;InputStreamReader&amp;#039;&amp;#039;&amp;#039; reciben como parámetro outro stream/fluxo de tipo &amp;#039;&amp;#039;&amp;#039;InputStream&amp;#039;&amp;#039;&amp;#039; (Que está noutra xerarquía).&lt;br /&gt;
[[Image:java-io-class-hierarchy-diagram.gif|800px]]&lt;br /&gt;
&lt;br /&gt;
===Introdución aos ficheiros en Android===&lt;br /&gt;
*Os ficheiros en Android poden servirnos para almacenar información de modo temporal, para pasar información entre dispositivos, para ter unha &amp;quot;mini&amp;quot; base de datos, etc.&lt;br /&gt;
*En Android os ficheiros poden almacenarse en tres sitios (e dentro dun deles en 2 directorios distintos).&lt;br /&gt;
**Na &amp;#039;&amp;#039;&amp;#039;propia aplicación&amp;#039;&amp;#039;&amp;#039; a modo de recurso (como cando incluímos unha imaxe): &amp;#039;&amp;#039;&amp;#039;/res/raw/ficheiro...&amp;#039;&amp;#039;&amp;#039; (raw significa cru).&lt;br /&gt;
**Na &amp;#039;&amp;#039;&amp;#039;memoria interna&amp;#039;&amp;#039;&amp;#039;, no subdirectorio &amp;#039;&amp;#039;files&amp;#039;&amp;#039; da carpeta da aplicación: &amp;#039;&amp;#039;&amp;#039;/data/data/paquete_java/files/ficheiro...&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
**Na &amp;#039;&amp;#039;&amp;#039;tarxeta SD&amp;#039;&amp;#039;&amp;#039;, se existe, en 2 posibles subdirectorios:&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;/storage/sdcard/directorio que indique o programador, se indica/ficheiro...&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;/storage/sdcard/Android/data/paquete_java/files/ficheiro...&amp;#039;&amp;#039;&amp;#039; (Algo parecido á memoria interna). Deste xeito se se desinstala a aplicación, tamén se borraría o ficheiro automaticamente, cousa que non pasaría no caso anterior&lt;br /&gt;
&lt;br /&gt;
==Ficheiro como recurso da aplicación==&lt;br /&gt;
*Este ficheiro xa vai no instalable, no *.apk.&lt;br /&gt;
*O ficheiro debe estar en: /res/raw/ficheiro...&lt;br /&gt;
*Imos traballar cun poema de Rosalía de Castro, que máis dun século despois está de vigorosa actualidade.&lt;br /&gt;
&lt;br /&gt;
===Ficheiro raw: Caso práctico===&lt;br /&gt;
*Crear o proxecto: &amp;#039;&amp;#039;&amp;#039;U4_10_FicheiroRaw&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Ficheiro raw&amp;quot; widths=&amp;quot;350&amp;quot; heights=&amp;quot;300px&amp;quot; perrow=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
Image:Android_2014_U4_10_FicheiroRaw_01.jpg| Cargamos a aplicación, e ao premer no botón ...&lt;br /&gt;
Image:Android_2014_U4_10_FicheiroRaw_02.jpg| para ler o ficheiro no recurso e amosámolo no TextView. Dispúxose un scroll para poder ver todo o poema.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ficheiro raw: O XML do layout===&lt;br /&gt;
&lt;br /&gt;
*Observar como envolvemos o TextView nun scroll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;14-16,24&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;LinearLayout xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&lt;br /&gt;
    xmlns:tools=&amp;quot;http://schemas.android.com/tools&amp;quot;&lt;br /&gt;
    android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
    android:layout_height=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
    android:orientation=&amp;quot;vertical&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Button&lt;br /&gt;
        android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:layout_gravity=&amp;quot;center&amp;quot;&lt;br /&gt;
        android:onClick=&amp;quot;onButtonClick&amp;quot;&lt;br /&gt;
        android:text=&amp;quot;Amosar poesía&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;ScrollView&lt;br /&gt;
        android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
        android:layout_height=&amp;quot;wrap_content&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;TextView&lt;br /&gt;
            android:id=&amp;quot;@+id/tv&amp;quot;&lt;br /&gt;
            android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
            android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
            android:gravity=&amp;quot;center&amp;quot;&lt;br /&gt;
            android:text=&amp;quot;Aquí amosarase unha poesía de\nRosalía de Castro:\n&amp;amp;apos;A xustiza pola Man&amp;amp;apos;&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/ScrollView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ficheiro raw: O recurso raw===&lt;br /&gt;
*Creamos o cartafol &amp;#039;&amp;#039;&amp;#039;raw&amp;#039;&amp;#039;&amp;#039; dentro da carpeta &amp;#039;&amp;#039;&amp;#039;/res&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*Introducimos o seguinte ficheiro (ou outro calquera): [[File:Xustiza.txt]] (Ollo que o ficheiro debe ter o nome en minúscula).&lt;br /&gt;
*[[Image:Android_2014_U4_10_FicheiroRaw_03.jpg]]&lt;br /&gt;
&lt;br /&gt;
===Ficheiro raw: Código java da aplicación===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;36-43&amp;quot;&amp;gt;&lt;br /&gt;
package com.example.u4_10_ficheiroraw;&lt;br /&gt;
&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
&lt;br /&gt;
import android.app.Activity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.Menu;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.TextView;&lt;br /&gt;
&lt;br /&gt;
public class U4_10_FicheiroRaw extends Activity {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
		super.onCreate(savedInstanceState);&lt;br /&gt;
		setContentView(R.layout.activity_u4_10__ficheiro_raw);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public boolean onCreateOptionsMenu(Menu menu) {&lt;br /&gt;
		// Inflate the menu; this adds items to the action bar if it is present.&lt;br /&gt;
		getMenuInflater().inflate(R.menu.u4_10__ficheiro_raw, menu);&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void onButtonClick(View v) {&lt;br /&gt;
		TextView tv = (TextView) findViewById(R.id.tv);&lt;br /&gt;
		String verso;&lt;br /&gt;
&lt;br /&gt;
		tv.setText(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			InputStream is = getResources().openRawResource(R.raw.xustiza);&lt;br /&gt;
			BufferedReader br = new BufferedReader(new InputStreamReader(is));&lt;br /&gt;
&lt;br /&gt;
			while ((verso = br.readLine()) != null)&lt;br /&gt;
				tv.append(verso + &amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			br.close();&lt;br /&gt;
			is.close();&lt;br /&gt;
		} catch (Exception ex) {&lt;br /&gt;
			Log.e(&amp;quot;FICHEIROS&amp;quot;, &amp;quot;Error ao ler ficheiro dende recurso raw&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liña 36&amp;#039;&amp;#039;&amp;#039;: Creamos un fluxo de tipo InputStream cuxa entrada é o ficheiro xustiza. Ollo que non se lle puxo a extensión.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liña 37&amp;#039;&amp;#039;&amp;#039;: A partir do fluxo anterior creamos un fluxo de tipo BufferReader.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liña 38&amp;#039;&amp;#039;&amp;#039;: Lemos cada liña do ficheiro e asignámoslla a &amp;#039;&amp;#039;verso&amp;#039;&amp;#039;, até que sexa fin de ficheiro.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liña 39&amp;#039;&amp;#039;&amp;#039;: Engádese ao TextView cada unha das liñas cun retorno de carro ao final de cada unha delas.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 42-43&amp;#039;&amp;#039;&amp;#039;: Pechamos os fluxos abertos no momento da súa creación.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 35 e 44&amp;#039;&amp;#039;&amp;#039;: habilitamos un control de excepcións, por se hai problemas cos fluxos.&lt;br /&gt;
&lt;br /&gt;
==Ficheiro na memoria interna==&lt;br /&gt;
*Como sabemos cando se instala a aplicación no dispositivo esta instálase na memoria interna (salvo que se diga o contraio) na ruta &amp;#039;&amp;#039;&amp;#039;/data/data/paquete_java&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
*No subdirectorio &amp;#039;&amp;#039;&amp;#039;files&amp;#039;&amp;#039;&amp;#039; dese directorio é onde se crea o ficheiro por defecto.&lt;br /&gt;
*Ollo que cando se almacena na memoria interna debemos ter en conta o espazo que ten o dispositivo asignado a esta memoria.&lt;br /&gt;
&lt;br /&gt;
*Para &amp;#039;&amp;#039;&amp;#039;crear&amp;#039;&amp;#039;&amp;#039; un ficheiro na memoria interna, Android facilítanos o método: &amp;#039;&amp;#039;&amp;#039;openFileOutput (ficheiro, modo_acceso_ao_ficheiro)&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
**Este método abre o ficheiro indicado no modo indicado, que pode ser:&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;MODE_PRIVATE&amp;#039;&amp;#039;&amp;#039;: para acceso privado dende a nosa app, e non dende outras.&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;MODE_APPEND&amp;#039;&amp;#039;&amp;#039;: para engadir datos a un ficheiro existente&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;MODE_WORLD_READABLE&amp;#039;&amp;#039;&amp;#039;: permitir que outras app lean o ficheiro &lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;MODE_WORLD_WRITEABLE&amp;#039;&amp;#039;&amp;#039;: permitir que outras app lean/escriban o ficheiro &lt;br /&gt;
**O método devolve un stream asociado ao ficheiro de tipo &amp;#039;&amp;#039;&amp;#039;FileOutputStream&amp;#039;&amp;#039;&amp;#039;, a partir de aquí xa podemos operar con ese fluxo como o faríamos en Java.&lt;br /&gt;
**O método crea o ficheiro no directorio: &amp;#039;&amp;#039;&amp;#039;/data/data/paquete_java/files/ficheiro&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
**Tamén poderíamos crear ese ficheiro cunha clase tradicional de java como é: &amp;#039;&amp;#039;&amp;#039;FileOutputStream(ficheiro)&amp;#039;&amp;#039;&amp;#039; ou &amp;#039;&amp;#039;&amp;#039;fileOutputStream(ficheiro,engadir)&amp;#039;&amp;#039;&amp;#039;, onde:&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;Ficheiro:&amp;#039;&amp;#039;&amp;#039; é a ruta ao ficheiro que lle temos que indicar nós ou ben a &amp;#039;&amp;#039;lume&amp;#039;&amp;#039; (/data/data/.../files) ou facendo uso do método: &amp;#039;&amp;#039;&amp;#039;getFilesDir()&amp;#039;&amp;#039;&amp;#039;, que devolve a ruta ao directorio &amp;#039;&amp;#039;&amp;#039;files&amp;#039;&amp;#039;&amp;#039; da aplicación.&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;Engadir&amp;#039;&amp;#039;&amp;#039;: se o ficheiro se abre en modo sobrescritura ou append.&lt;br /&gt;
***Recoméndase consultar a clase Java FileOutputStream se se desexa operar con ela.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Para &amp;#039;&amp;#039;&amp;#039;ler&amp;#039;&amp;#039;&amp;#039; un ficheiro da memoria interna, temos o método: &amp;#039;&amp;#039;&amp;#039;openFileInput(ficheiro)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
**E xa abre directamente o &amp;#039;&amp;#039;ficheiro&amp;#039;&amp;#039; que se atopa en:&amp;#039;&amp;#039;&amp;#039;/data/data/paquete_java/files/ficheiro&amp;#039;&amp;#039;&amp;#039; (Se existe, claro).&lt;br /&gt;
**Devolve un stream, manipulable dende Java, do tipo &amp;#039;&amp;#039;&amp;#039;InputStreamReader&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Nos dous casos operaremos aínda con fluxos de nivel superior (OutputStreamWriter e BufferReader, respectivamente) para poder manipular cadeas de texto directamente.&lt;br /&gt;
&lt;br /&gt;
*Referencias:&lt;br /&gt;
**http://developer.android.com/reference/android/content/Context.html#openFileOutput%28java.lang.String,%20int%29&lt;br /&gt;
**http://developer.android.com/reference/android/content/Context.html#openFileInput%28java.lang.String%29&lt;br /&gt;
**http://developer.android.com/reference/android/content/Context.html#deleteFile%28java.lang.String%29&lt;br /&gt;
**http://developer.android.com/reference/android/content/ContextWrapper.html#getFilesDir%28%29&lt;br /&gt;
&lt;br /&gt;
===Memoria Interna: Caso práctico===&lt;br /&gt;
*Crear o proxecto: &amp;#039;&amp;#039;&amp;#039;U4_11_FicheiroInterna&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*Imos realizar nun só proxecto todas as operacións con ficheiros na memoria interna:&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Escribir&amp;#039;&amp;#039;&amp;#039;: tanto en modo &amp;#039;&amp;#039;append&amp;#039;&amp;#039; como sobrescribindo.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Ler&amp;#039;&amp;#039;&amp;#039;: o ficheiro se existe, e senón dar un aviso&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Borrar&amp;#039;&amp;#039;&amp;#039;: o ficheiro se existe, e senón dar un erro&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Listar&amp;#039;&amp;#039;&amp;#039;: o contido dun directorio.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Memoria Interna&amp;quot; widths=&amp;quot;350&amp;quot; heights=&amp;quot;300px&amp;quot; perrow=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
Image:Android_2014_U4_11_FicheiroInterna_01.jpg| Entramos na aplicación.&lt;br /&gt;
Image:Android_2014_U4_11_FicheiroInterna_02.jpg| Prememos en &amp;#039;&amp;#039;&amp;#039;Ler&amp;#039;&amp;#039;&amp;#039; e non hai ningún ficheiro para ler.&lt;br /&gt;
Image:Android_2014_U4_11_FicheiroInterna_03.jpg| Prememos en &amp;#039;&amp;#039;&amp;#039;Borrar&amp;#039;&amp;#039;&amp;#039; e non hai ningún ficheiro para borrar.&lt;br /&gt;
Image:Android_2014_U4_11_FicheiroInterna_04.jpg| Escribimos un texto e prememos en &amp;#039;&amp;#039;&amp;#039;Escribir/Engadir&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
Image:Android_2014_U4_11_FicheiroInterna_05.jpg| Escribimos outro texto e prememos en &amp;#039;&amp;#039;&amp;#039;Escribir/Engadir&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
Image:Android_2014_U4_11_FicheiroInterna_06.jpg| Prememos en &amp;#039;&amp;#039;&amp;#039;Ler&amp;#039;&amp;#039;&amp;#039; e lemos o ficheiro, que amosa o que escribimos antes.&lt;br /&gt;
Image:Android_2014_U4_11_FicheiroInterna_07.jpg| Marcamos &amp;#039;&amp;#039;&amp;#039;Sobrescribir&amp;#039;&amp;#039;&amp;#039;, escribimos un novo texto e prememos en &amp;#039;&amp;#039;&amp;#039;Escribir/Engadir&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
Image:Android_2014_U4_11_FicheiroInterna_08.jpg| Prememos &amp;#039;&amp;#039;&amp;#039;Ler&amp;#039;&amp;#039;&amp;#039; e vemos que o ficheiro foi sobrescrito co novo texto.&lt;br /&gt;
Image:Android_2014_U4_11_FicheiroInterna_09.jpg| Prememos en &amp;#039;&amp;#039;&amp;#039;Listar&amp;#039;&amp;#039;&amp;#039; e vemos o contido do directorio &amp;#039;&amp;#039;files&amp;#039;&amp;#039; da aplicación.&lt;br /&gt;
Image:Android_2014_U4_11_FicheiroInterna_10.jpg| A través do DDMS, pódese ver o ficheiro que se creou  dende a aplicación.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Memoria Interna: XML do Layout ===&lt;br /&gt;
&lt;br /&gt;
*Observar que os botóns, neste caso, foron organizados facendo uso dun &amp;#039;&amp;#039;&amp;#039;TableLayout&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;33,40,47,54,59-67&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;LinearLayout xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&lt;br /&gt;
    xmlns:tools=&amp;quot;http://schemas.android.com/tools&amp;quot;&lt;br /&gt;
    android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
    android:layout_height=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
    android:orientation=&amp;quot;vertical&amp;quot;&lt;br /&gt;
    android:padding=&amp;quot;2dp&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;EditText&lt;br /&gt;
        android:id=&amp;quot;@+id/etTexto&amp;quot;&lt;br /&gt;
        android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
        android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:hint=&amp;quot;Escribe algún texto&amp;quot;&lt;br /&gt;
        android:inputType=&amp;quot;textMultiLine&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;CheckBox&lt;br /&gt;
        android:id=&amp;quot;@+id/cbSobrescribir&amp;quot;&lt;br /&gt;
        android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:layout_gravity=&amp;quot;center_horizontal&amp;quot;&lt;br /&gt;
        android:text=&amp;quot;Sobrescribir ficheiro&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;TableLayout&lt;br /&gt;
        android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
        android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:stretchColumns=&amp;quot;*&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;TableRow&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;Button&lt;br /&gt;
                android:id=&amp;quot;@+id/bEscribirEngadir&amp;quot;&lt;br /&gt;
                android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:onClick=&amp;quot;onEscribirEngadirClick&amp;quot;&lt;br /&gt;
                android:text=&amp;quot;Escribir/\nEngadir&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;Button&lt;br /&gt;
                android:id=&amp;quot;@+id/bLer&amp;quot;&lt;br /&gt;
                android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:onClick=&amp;quot;onLerClick&amp;quot;&lt;br /&gt;
                android:text=&amp;quot;Ler\n&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;Button&lt;br /&gt;
                android:id=&amp;quot;@+id/bBorrar&amp;quot;&lt;br /&gt;
                android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:onClick=&amp;quot;onBorrarClick&amp;quot;&lt;br /&gt;
                android:text=&amp;quot;Borrar\n&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;Button&lt;br /&gt;
                android:id=&amp;quot;@+id/bListar&amp;quot;&lt;br /&gt;
                android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
                android:onClick=&amp;quot;onListarClick&amp;quot;&lt;br /&gt;
                android:text=&amp;quot;Listar\n&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/TableRow&amp;gt;&lt;br /&gt;
    &amp;lt;/TableLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;ScrollView&lt;br /&gt;
        android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:layout_height=&amp;quot;wrap_content&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;TextView&lt;br /&gt;
            android:id=&amp;quot;@+id/tvAmosar&amp;quot;&lt;br /&gt;
            android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
            android:layout_height=&amp;quot;match_parent&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/ScrollView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 33,40,47,54&amp;#039;&amp;#039;&amp;#039;: observar a que métodos chaman ao facer Click nos botóns.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 59-67&amp;#039;&amp;#039;&amp;#039;: O TextView está dentro dun &amp;#039;&amp;#039;&amp;#039;ScrollView&amp;#039;&amp;#039;&amp;#039; por se desbordamos a pantalla pola parte inferior á hora de amosar o contido do ficheiro.&lt;br /&gt;
&lt;br /&gt;
===Memoria Interna: O código java da aplicación===&lt;br /&gt;
*Imos analizar cada un dos bloques de código.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;20,21,28,39,64,85,98&amp;quot; &amp;gt;&lt;br /&gt;
package com.example.u4_11_ficheirointerna;&lt;br /&gt;
&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.OutputStreamWriter;&lt;br /&gt;
&lt;br /&gt;
import android.app.Activity;&lt;br /&gt;
import android.content.Context;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.Menu;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.CheckBox;&lt;br /&gt;
import android.widget.EditText;&lt;br /&gt;
import android.widget.TextView;&lt;br /&gt;
import android.widget.Toast;&lt;br /&gt;
&lt;br /&gt;
public class U4_11_FicheiroInterna extends Activity {&lt;br /&gt;
	TextView tv;&lt;br /&gt;
	public static String nomeFicheiro = &amp;quot;ficheiro_interno.txt&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
		super.onCreate(savedInstanceState);&lt;br /&gt;
		setContentView(R.layout.activity_u4_11__ficheiro_interna);&lt;br /&gt;
&lt;br /&gt;
		tv = (TextView) findViewById(R.id.tvAmosar);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public boolean onCreateOptionsMenu(Menu menu) {&lt;br /&gt;
		// Inflate the menu; this adds items to the action bar if it is present.&lt;br /&gt;
		getMenuInflater().inflate(R.menu.u4_11__ficheiro_interna, menu);&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void onEscribirEngadirClick(View v) {&lt;br /&gt;
		EditText etTexto = (EditText) findViewById(R.id.etTexto);&lt;br /&gt;
		CheckBox cbSobrescribir = (CheckBox) findViewById(R.id.cbSobrescribir);&lt;br /&gt;
		int contexto;&lt;br /&gt;
		tv.setText(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		if (cbSobrescribir.isChecked())&lt;br /&gt;
			contexto = Context.MODE_PRIVATE;&lt;br /&gt;
		else&lt;br /&gt;
			contexto = Context.MODE_APPEND;&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
&lt;br /&gt;
			OutputStreamWriter osw = new OutputStreamWriter(openFileOutput(nomeFicheiro, contexto));&lt;br /&gt;
&lt;br /&gt;
			osw.write(etTexto.getText() + &amp;quot;\n&amp;quot;);&lt;br /&gt;
			osw.close();&lt;br /&gt;
&lt;br /&gt;
			etTexto.setText(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		} catch (Exception ex) {&lt;br /&gt;
			Log.e(&amp;quot;INTERNA&amp;quot;, &amp;quot;Error escribindo no ficheiro&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void onLerClick(View v) {&lt;br /&gt;
		String linha = &amp;quot;&amp;quot;;&lt;br /&gt;
		TextView tv = (TextView) findViewById(R.id.tvAmosar);&lt;br /&gt;
		tv.setText(linha);&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
&lt;br /&gt;
			BufferedReader br = new BufferedReader(new InputStreamReader(openFileInput(nomeFicheiro)));&lt;br /&gt;
&lt;br /&gt;
			while ((linha = br.readLine()) != null)&lt;br /&gt;
				tv.append(linha + &amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			br.close();&lt;br /&gt;
&lt;br /&gt;
		} catch (Exception ex) {&lt;br /&gt;
			Toast.makeText(this, &amp;quot;Problemas lendo o ficheiro&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
			Log.e(&amp;quot;INTERNA&amp;quot;, &amp;quot;Erro lendo o ficheiro. &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void onBorrarClick(View v) {&lt;br /&gt;
		File directorio_app = getFilesDir();&lt;br /&gt;
		File ruta_completa = new File(directorio_app, &amp;quot;/&amp;quot; + nomeFicheiro);&lt;br /&gt;
&lt;br /&gt;
		if (ruta_completa.delete())&lt;br /&gt;
			Log.i(&amp;quot;INTERNA&amp;quot;, &amp;quot;Ficheiro borrado&amp;quot;);&lt;br /&gt;
		else {&lt;br /&gt;
			Log.e(&amp;quot;INTERNA&amp;quot;, &amp;quot;Problemas borrando o ficheiro&amp;quot;);&lt;br /&gt;
			Toast.makeText(this, &amp;quot;Problemas borrando o ficheiro&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void onListarClick(View v) {&lt;br /&gt;
		tv.setText(&amp;quot;&amp;quot;);&lt;br /&gt;
		File directorio_app = getFilesDir();&lt;br /&gt;
		// File directorio_app = new File (&amp;quot;/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		tv.append(directorio_app.getAbsolutePath() + &amp;quot;\nContido:&amp;quot;);&lt;br /&gt;
		try {&lt;br /&gt;
			String[] files = directorio_app.list();&lt;br /&gt;
&lt;br /&gt;
			for (int i = 0; i &amp;lt; files.length; i++) {&lt;br /&gt;
				File subdir = new File(directorio_app, &amp;quot;/&amp;quot; + files[i]);&lt;br /&gt;
				if (subdir.isDirectory())&lt;br /&gt;
					tv.append(&amp;quot;\n  Subdirectorio: &amp;quot; + files[i]);&lt;br /&gt;
				else&lt;br /&gt;
					tv.append(&amp;quot;\n  Ficheiro: &amp;quot; + files[i]);&lt;br /&gt;
			}&lt;br /&gt;
			Log.i(&amp;quot;INTERNA&amp;quot;, &amp;quot;Listado realizado&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		} catch (Exception ex) {&lt;br /&gt;
			Log.e(&amp;quot;INTERNA&amp;quot;, &amp;quot;Erro listando o directorio&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 39-62&amp;#039;&amp;#039;&amp;#039;: Escribir/Engadir no ficheiro&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liñas 45-48&amp;#039;&amp;#039;&amp;#039;: revisamos o estado do botón Sobrescribir e actuamos en consecuencia&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 52&amp;#039;&amp;#039;&amp;#039;: obtemos un fluxo de tipo OuputStreamWriter que nos permite manipular cadeas de texto. Pero como parámetro recibe o ficheiro creado en función do contexto. Observar que non lle indicamos ningunha ruta para o ficheiro.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 54&amp;#039;&amp;#039;&amp;#039;: Escribimos no ficheiro o contido do EditText. Pero &amp;#039;&amp;#039;&amp;#039;Ollo!!!&amp;#039;&amp;#039;&amp;#039; engadimos ao final un retorno de carro, para que cada entrada vaia nunha única liña e non concatenadas.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 55&amp;#039;&amp;#039;&amp;#039;: Pechamos o fluxo.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 60&amp;#039;&amp;#039;&amp;#039;: Se se produciu algunha excepción no manipulación do fluxo sacamos unha mensaxe a través de LogCat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 64-83&amp;#039;&amp;#039;&amp;#039;: Ler o ficheiro.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 67&amp;#039;&amp;#039;&amp;#039;: Limpamos o TextView&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 71&amp;#039;&amp;#039;&amp;#039;: Creamos un fluxo de tipo BufferReader para poder manipular cadeas de texto. Este fluxo recibe como a apertura do ficheiro indicado. Observar que non lle indicamos ningunha ruta para o ficheiro.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liñas 73-74&amp;#039;&amp;#039;&amp;#039;: Mentres non sexa fin de ficheiro imos lendo liña a liña e presentándoa no TextView. Observar que introducimos un retorno de carro ao final de cada liña.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liñas 79-80&amp;#039;&amp;#039;&amp;#039;: se se produciu algunha excepción, por exemplo o ficheiro non existe, sacamos un Toast e unha mensaxe por LogCat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 85-96&amp;#039;&amp;#039;&amp;#039;: Borrar o ficheiro&lt;br /&gt;
**Neste caso hai método (&amp;#039;&amp;#039;&amp;#039;deleteFile(ficheiro)&amp;#039;&amp;#039;&amp;#039;) que xa nos borra o ficheiro e devolve un boolean indicando o éxito da operación.&lt;br /&gt;
**Pero para introducir a clase &amp;#039;&amp;#039;&amp;#039;File&amp;#039;&amp;#039;&amp;#039; imos facelo de outra maneira.&lt;br /&gt;
***Información sobre a clase File: http://developer.android.com/reference/java/io/File.html&lt;br /&gt;
***Esta clase permite representar obxectos do sistema de ficheiros (directorios e ficheiros) a través das rutas relativas ou absolutas.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liñas 86-87&amp;#039;&amp;#039;&amp;#039;: creamos unha ruta completa até o ficheiro. Para iso usamos o método &amp;#039;&amp;#039;&amp;#039;getFilesDir()&amp;#039;&amp;#039;&amp;#039; que nos devolve a ruta até o directorio &amp;#039;&amp;#039;files&amp;#039;&amp;#039; da aplicación. E logo construímos un novo obxecto File concatenando esa ruta coa barra de directorio e o nome do ficheiro.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 89&amp;#039;&amp;#039;&amp;#039;: comprobamos o éxito do proceso de borrado do ficheiro. Esa liña podería ser substituída por &amp;quot;&amp;#039;&amp;#039;&amp;#039;if (deleteFile(nomeFicheiro))&amp;#039;&amp;#039;&amp;#039;&amp;quot; e non precisaríamos o código das liñas 86 e 87.&lt;br /&gt;
**Tamén controlamos as posibles excepcións.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 98-120&amp;#039;&amp;#039;&amp;#039;: Listar o contido dun directorio.&lt;br /&gt;
**Ao igual que no caso anterior existe un método que xa nos devolve a lista de ficheiros do directorio &amp;#039;&amp;#039;files&amp;#039;&amp;#039; da aplicación: &amp;#039;&amp;#039;&amp;#039;fileList()&amp;#039;&amp;#039;&amp;#039;. Pero imos apoiarnos outra vez na clase File, para obter o listado de ficheiros dun directorio.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 100&amp;#039;&amp;#039;&amp;#039;: Obtemos a ruta ao directorio &amp;#039;&amp;#039;&amp;#039;files&amp;#039;&amp;#039;&amp;#039; da aplicación.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 103&amp;#039;&amp;#039;&amp;#039;: Amosamos a ruta completa a ese directorio.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 105&amp;#039;&amp;#039;&amp;#039;: Obtemos un array de obxectos (directorios e ficheiros) que contén o directorio en cuestión. Esta liña podería ser substituída por:  &amp;#039;&amp;#039;&amp;#039; String[] files = fileList(nomeFicheiro);&amp;#039;&amp;#039;&amp;#039; e non precisaríamos a liña 100.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liñas 107-113&amp;#039;&amp;#039;&amp;#039;: Percorremos o array anterior e comprobamos se cada elemento é un ficheiro o un directorio e amosamos o seu nome.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 101&amp;#039;&amp;#039;&amp;#039;: descomentar esa liña e realizar un listado da raíz do sistema. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Memoria Externa - Tarxeta SD==&lt;br /&gt;
*Todo canto se vai ver nesta parte apóiase no visto no apartado anterior de Memoria Interna.&lt;br /&gt;
*Vaise realizar o mesmo proceso que no caso anterior, so que neste caso na Memoria Externa.&lt;br /&gt;
*Co cal antes de pasar a este caso asegurarse de ter asimilado o referente a Memoria Interna.&lt;br /&gt;
*Aquí simplemente imos explicar as diferenzas co caso anterior.&lt;br /&gt;
&lt;br /&gt;
===Memoria Externa: Caso práctico===&lt;br /&gt;
*Comezar creando o proxecto: &amp;#039;&amp;#039;&amp;#039;U4_12_FicheiroSD&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
*As seguintes imaxes amosan un aplicación semellante á anterior, so que esta traballa coa tarxeta SD no canto de coa memoria interna.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Memoria Externa&amp;quot; widths=&amp;quot;350&amp;quot; heights=&amp;quot;300px&amp;quot; perrow=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
Image:Android_2014_U4_12_FicheiroSD_01.jpg| A operativa será igual que no caso anterior.&lt;br /&gt;
Image: .|&lt;br /&gt;
Image:Android_2014_U4_12_FicheiroSD_02.jpg| Se usamos o método: &amp;#039;&amp;#039;&amp;#039;getExternalFilesDir(null)&amp;#039;&amp;#039;&amp;#039;. O ficheiro gardarase na ruta da SD Card &amp;#039;&amp;#039;&amp;#039;/storage/sdcard/Android/data/paquete_java/files/ficheiro&amp;#039;&amp;#039;&amp;#039;.&amp;lt;br&amp;gt;Esta ruta é a ruta da aplicación na SD card, de modo que, se se desinstala a aplicación tamén se vai borrar esta ruta no proceso de desinstalación.&lt;br /&gt;
Image:Android_2014_U4_12_FicheiroSD_03.jpg| Se usamos o método: &amp;#039;&amp;#039;&amp;#039;Environment.getExternalStorageDirectory()&amp;#039;&amp;#039;&amp;#039; o ficheiro gardaríase na ruta da raíz da SD Card (/storage/sdcard), salvo que se indique outra cousa.&amp;lt;br&amp;gt;Se se desinstala a aplicación non se vai borrar o ficheiro creado da SD Card.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
*En ámbolos dous casos o ficheiro pode ser borrado, manipulado polo usuario, ben dende o propio dispositivo usando calquera explorador de ficheiros ou ben montando a tarxeta SD nun ordenador, por exemplo, e actuando dende aí.&lt;br /&gt;
&lt;br /&gt;
===Memoria Externa: permisos de escritura na tarxeta SD=== &lt;br /&gt;
*Se imos ler na tarxeta SD:&lt;br /&gt;
:* Se a versión do S.O. Android é inferior á 4.1 non precisamos ningún permiso.&lt;br /&gt;
:* Se a versión do S.O. Android é superior ou igual á 4.1 debemos engadir o permiso: &amp;#039;&amp;#039;&amp;#039;&amp;lt;uses-permission android:name=&amp;quot;android.permission.READ_EXTERNAL_STORAGE&amp;quot;/&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Se imos escribir na tarxeta SD:&lt;br /&gt;
:* Se a versión do S.O. Android é inferior á 4.4 o permiso é: &amp;#039;&amp;#039;&amp;#039;&amp;lt;uses-permission android:name=&amp;quot;android.permission.WRITE_EXTERNAL_STORAGE&amp;quot;/&amp;gt; &amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
:* Se a versión do S.O. Android é a 4.4 ou superior. Podemos poñer o mesmo permiso anterior pero as aplicacións dispoñen dun cartafol para escribir na SD (cartafol Android/data/paquete/) sen necesidade de ter o permiso anterior.&lt;br /&gt;
&lt;br /&gt;
Os permisos necesarios son  postos no ficheiro &amp;#039;&amp;#039;&amp;#039;AndroidManifest.xml&amp;#039;&amp;#039;&amp;#039; da aplicación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Permiso escritura na Memoria Externa&amp;quot; widths=&amp;quot;350&amp;quot; heights=&amp;quot;300px&amp;quot; perrow=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
Image:Android_2014_U4_12_FicheiroSD_04.jpg| No ficheiro AndroidManifest.xml ir á lapela &amp;#039;&amp;#039;&amp;#039;Permisos&amp;#039;&amp;#039;&amp;#039; e premer en Engadir. &lt;br /&gt;
Image:Android_2014_U4_12_FicheiroSD_05.jpg| Engadir un permiso do tipo &amp;#039;&amp;#039;&amp;#039;uses-permission&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
Image:Android_2014_U4_12_FicheiroSD_06.jpg| Engadir o permiso: &amp;#039;&amp;#039;&amp;#039;android.permission.WRITE_EXTERNAL_STORAGE&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
Image:Android_2014_U4_12_FicheiroSD_07.jpg| Comprobar que o permiso está no ficheiro XML.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Memoria Externa: XML do Layout===&lt;br /&gt;
*O layout, neste caso é o mesmo, que o que se usou para a aplicación de Memoria Interna.&lt;br /&gt;
&lt;br /&gt;
===Memoria Externa: o código Java da Aplicación===&lt;br /&gt;
*O código é o mesmo que o da aplicación Memoria Interna, salvo nos detalles que a continuación se relatan.&lt;br /&gt;
*No caso de usar a tarxeta SD, é preciso comprobar se esta está dispoñible e en que estado: modo lectura ou escritura.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Para iso faremos uso do método: &amp;#039;&amp;#039;&amp;#039;Environment.getExternalStorageState()&amp;#039;&amp;#039;&amp;#039;, que nos pode devolver un dos seguintes estados:&lt;br /&gt;
** MEDIA_UNKNOWN, MEDIA_REMOVED, MEDIA_UNMOUNTED, MEDIA_CHECKING, MEDIA_NOFS, MEDIA_MOUNTED, MEDIA_MOUNTED_READ_ONLY, MEDIA_SHARED, MEDIA_BAD_REMOVAL, ou MEDIA_UNMOUNTABLE. &lt;br /&gt;
**Imos quedarnos con:&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;MEDIA_MOUNTED&amp;#039;&amp;#039;&amp;#039;: indica que a tarxeta está dispoñible e ademais que se pode escribir nela.&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;MEDIA_MOUNTED_READ_ONLY&amp;#039;&amp;#039;&amp;#039;: indica que a tarxeta está dispoñible, pero só en modo lectura.&lt;br /&gt;
**Referencias: http://developer.android.com/reference/android/os/Environment.html#getExternalStorageState%28java.io.File%29&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;22-26,38,39,50-59,61-69,78,82,86,106,109,128,144&amp;quot; &amp;gt;&lt;br /&gt;
package com.example.u4_12_ficheirosd;&lt;br /&gt;
&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.OutputStreamWriter;&lt;br /&gt;
&lt;br /&gt;
import android.app.Activity;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.os.Environment;&lt;br /&gt;
import android.util.Log;&lt;br /&gt;
import android.view.Menu;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.widget.CheckBox;&lt;br /&gt;
import android.widget.EditText;&lt;br /&gt;
import android.widget.TextView;&lt;br /&gt;
import android.widget.Toast;&lt;br /&gt;
&lt;br /&gt;
public class U4_12_FicheiroSD extends Activity {&lt;br /&gt;
	boolean sdDisponhible = false;&lt;br /&gt;
	boolean sdAccesoEscritura = false;&lt;br /&gt;
	File dirFicheiroSD;&lt;br /&gt;
	File rutaCompleta;&lt;br /&gt;
	public static String nomeFicheiro = &amp;quot;ficheiro_SD.txt&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	TextView tv;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
		super.onCreate(savedInstanceState);&lt;br /&gt;
		setContentView(R.layout.activity_u4_12__ficheiro_sd);&lt;br /&gt;
&lt;br /&gt;
		tv = (TextView) findViewById(R.id.tvAmosar);&lt;br /&gt;
&lt;br /&gt;
		comprobarEstadoSD();&lt;br /&gt;
		establecerDirectorioFicheiro();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public boolean onCreateOptionsMenu(Menu menu) {&lt;br /&gt;
		// Inflate the menu; this adds items to the action bar if it is present.&lt;br /&gt;
		getMenuInflater().inflate(R.menu.u4_12__ficheiro_sd, menu);&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void comprobarEstadoSD() {&lt;br /&gt;
		String estado = Environment.getExternalStorageState();&lt;br /&gt;
		Log.e(&amp;quot;SD&amp;quot;, estado);&lt;br /&gt;
&lt;br /&gt;
		if (estado.equals(Environment.MEDIA_MOUNTED)) {&lt;br /&gt;
			sdDisponhible = true;&lt;br /&gt;
			sdAccesoEscritura = true;&lt;br /&gt;
		} else if (estado.equals(Environment.MEDIA_MOUNTED_READ_ONLY))&lt;br /&gt;
			sdDisponhible = true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void establecerDirectorioFicheiro() {&lt;br /&gt;
&lt;br /&gt;
		if (sdDisponhible) {&lt;br /&gt;
			// dirFicheiroSD = Environment.getExternalStorageDirectory();&lt;br /&gt;
			dirFicheiroSD = getExternalFilesDir(null);&lt;br /&gt;
			rutaCompleta = new File(dirFicheiroSD.getAbsolutePath(), nomeFicheiro);&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void onEscribirEngadirClick(View v) {&lt;br /&gt;
&lt;br /&gt;
		EditText etTexto = (EditText) findViewById(R.id.etTexto);&lt;br /&gt;
		CheckBox cbSobrescribir = (CheckBox) findViewById(R.id.cbSobrescribir);&lt;br /&gt;
&lt;br /&gt;
		boolean sobrescribir = false;&lt;br /&gt;
&lt;br /&gt;
		sobrescribir = !(cbSobrescribir.isChecked());&lt;br /&gt;
&lt;br /&gt;
		tv.setText(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		if (sdAccesoEscritura) {&lt;br /&gt;
&lt;br /&gt;
			try {&lt;br /&gt;
&lt;br /&gt;
				OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(rutaCompleta, sobrescribir));&lt;br /&gt;
&lt;br /&gt;
				osw.write(etTexto.getText() + &amp;quot;\n&amp;quot;);&lt;br /&gt;
				osw.close();&lt;br /&gt;
&lt;br /&gt;
				etTexto.setText(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			} catch (Exception ex) {&lt;br /&gt;
				Log.e(&amp;quot;SD&amp;quot;, &amp;quot;Error escribindo no ficheiro&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else&lt;br /&gt;
			Toast.makeText(this, &amp;quot;A tarxeta SD non está en modo acceso escritura&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void onLerClick(View v) {&lt;br /&gt;
		String linha = &amp;quot;&amp;quot;;&lt;br /&gt;
		TextView tv = (TextView) findViewById(R.id.tvAmosar);&lt;br /&gt;
		tv.setText(linha);&lt;br /&gt;
&lt;br /&gt;
		if (sdDisponhible) {&lt;br /&gt;
			try {&lt;br /&gt;
&lt;br /&gt;
				BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(rutaCompleta)));&lt;br /&gt;
&lt;br /&gt;
				while ((linha = br.readLine()) != null)&lt;br /&gt;
					tv.append(linha + &amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
				br.close();&lt;br /&gt;
&lt;br /&gt;
			} catch (Exception ex) {&lt;br /&gt;
				Toast.makeText(this, &amp;quot;Problemas lendo o ficheiro&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
				Log.e(&amp;quot;SD&amp;quot;, &amp;quot;Erro lendo o ficheiro. &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		} else&lt;br /&gt;
			Toast.makeText(this, &amp;quot;A tarxeta SD non está dispoñible&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void onBorrarClick(View v) {&lt;br /&gt;
&lt;br /&gt;
		if (sdAccesoEscritura) {&lt;br /&gt;
&lt;br /&gt;
			if (rutaCompleta.delete())&lt;br /&gt;
				Log.i(&amp;quot;SD&amp;quot;, &amp;quot;Ficheiro borrado&amp;quot;);&lt;br /&gt;
			else {&lt;br /&gt;
				Log.e(&amp;quot;SD&amp;quot;, &amp;quot;Problemas borrando o ficheiro&amp;quot;);&lt;br /&gt;
				Toast.makeText(this, &amp;quot;Problemas borrando o ficheiro&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		} else&lt;br /&gt;
			Toast.makeText(this, &amp;quot;A tarxeta SD non está en modo acceso escritura&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void onListarClick(View v) {&lt;br /&gt;
		tv.setText(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		if (sdDisponhible) {&lt;br /&gt;
&lt;br /&gt;
			tv.append(dirFicheiroSD.getAbsolutePath() + &amp;quot;\nContido:&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			try {&lt;br /&gt;
				String[] files = dirFicheiroSD.list();&lt;br /&gt;
&lt;br /&gt;
				for (int i = 0; i &amp;lt; files.length; i++) {&lt;br /&gt;
					File subdir = new File(dirFicheiroSD, &amp;quot;/&amp;quot; + files[i]);&lt;br /&gt;
					if (subdir.isDirectory())&lt;br /&gt;
						tv.append(&amp;quot;\n  Subdirectorio: &amp;quot; + files[i]);&lt;br /&gt;
					else&lt;br /&gt;
						tv.append(&amp;quot;\n  Ficheiro: &amp;quot; + files[i]);&lt;br /&gt;
				}&lt;br /&gt;
				Log.i(&amp;quot;SD&amp;quot;, &amp;quot;Listado realizado&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			} catch (Exception ex) {&lt;br /&gt;
				Log.e(&amp;quot;SD&amp;quot;, &amp;quot;Erro listando o directorio&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		} else&lt;br /&gt;
			Toast.makeText(this, &amp;quot;A tarxeta SD non está dispoñible&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 22-26&amp;#039;&amp;#039;&amp;#039;: Definición de atributos.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 22&amp;#039;&amp;#039;&amp;#039;: sdDisponhible: boolean que usaremos para antes de realizar calquera operación na SD card comprobar se está dispoñible.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 23&amp;#039;&amp;#039;&amp;#039;: sdAccesoEscritura: boolean que usaremos para antes de escribir na SD card comprobar se poida realizar esa operación.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 24&amp;#039;&amp;#039;&amp;#039;: dirFicheiroSD: imos usar esta variable para indicar para decidir se o ficheiro se vai crear na raíz da SD Card ou no directorio de aplicación na SD Card.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 25&amp;#039;&amp;#039;&amp;#039;: rutaCompleta: nesta variable teremos a ruta ao directorio concatenada co nome do ficheiro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Comprobar estado da SD Card&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 28&amp;#039;&amp;#039;&amp;#039;: chamamos ao método que comproba o estado da SD Card.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liñas 50-58&amp;#039;&amp;#039;&amp;#039;: comprobamos o estado&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;Liña 51&amp;#039;&amp;#039;&amp;#039;: obtemos o estado da tarxeta.&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;Liña 54&amp;#039;&amp;#039;&amp;#039;: comprobamos se a tarxeta está en modo escritura.&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;Liña 57&amp;#039;&amp;#039;&amp;#039;: comprobamos se a tarxeta está accesible en modo lectura.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Determinar o directorio no que escribir/ler o ficheiro na SD Card&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 27&amp;#039;&amp;#039;&amp;#039;: chamamos ao método.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liñas 61-69&amp;#039;&amp;#039;&amp;#039;: definimos as rutas ao directorio e ao ficheiro.&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;Liña 64&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;&amp;#039;//dirFicheiroSD = Environment.getExternalStorageDirectory();&amp;#039;&amp;#039;&amp;#039; devolvería a ruta da raíz da SD card:(/storage/sdcard)&lt;br /&gt;
***&amp;#039;&amp;#039;&amp;#039;Liña 65&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;&amp;#039; dirFicheiroSD = getExternalFilesDir(null);&amp;#039;&amp;#039;&amp;#039; devolve a ruta de &amp;#039;&amp;#039;files&amp;#039;&amp;#039; no directorio da aplicación na SD card (/storage/sdcard/Android/data/paquete_java/files).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 71-99&amp;#039;&amp;#039;&amp;#039;: Escribir/Engadir no ficheiro&lt;br /&gt;
**É basicamente igual ao proceso de Memoria Interna, salvo:&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 78&amp;#039;&amp;#039;&amp;#039;: como imos usar un fluxo dos de Java imos indicarlle no construtor se o ficheiro se abre en modo escritura ou append a través dun boolean.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 82&amp;#039;&amp;#039;&amp;#039;: Comprobamos se a tarxeta SD está dispoñible en modo escritura, en caso contrario sacamos un Toast.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 86&amp;#039;&amp;#039;&amp;#039;: non dispomos dun método que nos permita abrir o ficheiro, con simplemente indicarlle o nome, por tanto usamos a clase &amp;#039;&amp;#039;&amp;#039;FileOutputStream&amp;#039;&amp;#039;&amp;#039; pasándolle a ruta completa ao ficheiro e se se abre en modo append ou non.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 101-124&amp;#039;&amp;#039;&amp;#039;: Ler o ficheiro.&lt;br /&gt;
**É basicamente igual ao proceso de Memoria Interna, salvo:&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 82&amp;#039;&amp;#039;&amp;#039;: Comprobamos se a tarxeta SD está dispoñible (dá igual o modo), en caso contrario sacamos un Toast.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;Liña 86&amp;#039;&amp;#039;&amp;#039;: non dispomos dun método que nos permita abrir o ficheiro, con simplemente indicarlle o nome, por tanto usamos a clase &amp;#039;&amp;#039;&amp;#039;FileInputStream&amp;#039;&amp;#039;&amp;#039; pasándolle a ruta completa ao ficheiro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 126-139&amp;#039;&amp;#039;&amp;#039;: Borrar o ficheiro&lt;br /&gt;
**A estas alturas o usuario xa debe ser quen de interpretar ese código, estudando as explicacións anteriores e a correspondente para Memoria Interna.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Liñas 141-166&amp;#039;&amp;#039;&amp;#039;: Listar o contido dun directorio.&lt;br /&gt;
**A estas alturas o usuario xa debe ser quen de interpretar ese código, estudando as explicacións anteriores e a correspondente para Memoria Interna.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; -- [[Usuario:angelfg|Ángel D. Fernández González]] e [[Usuario:Carrion|Carlos Carrión Álvarez]] -- (2015).&lt;/div&gt;</summary>
		<author><name>Carrion</name></author>
	</entry>
</feed>