Bugünki dersimizde external storage üzerinde private ve public dosyalar oluşturmayı ve de aralarındaki farklardan bahsediyoruz.
Öncelikle şunu belirteyim ki yapılacak işlemler aslında internal storage ve cache storage da yapılan işlemlerden çok da farklı olmayacak. Dosyaya yazarken FileOutputStream, dosyadan okurken FileInputStream kullanacağız. Bu yüzden bu işlemleri içeren writeToFile(veri_yazilacak_dosya, veri) methodu ile readFromFile(veri_okunacak_dosya) methodları kullanılmıştır.
Private dosyaları oluştururken;
1 2 3 4 5 6 7 |
String data=etExternalPrivate.getText().toString(); File dosyaDizini=getExternalFilesDir("myFolder"); File dosya=new File(dosyaDizini, "myExternalPrivate.txt"); writeToFile(dosya, data); |
Private dosyaları okurken;
1 2 3 4 5 6 7 |
File dosyaDizini=getExternalFilesDir("myFolder"); File dosya=new File(dosyaDizini, "myExternalPrivate.txt"); String dosyaIcerigi=readFromFile(dosya); txvExternalPrivate.setText(dosyaIcerigi); |
Buradaki dosyalar uygulamaya özgüdür, uygulama kaldırıldığında silinir. Bu alana veri yazarken veya okurken kullanıcıdan izin istememiz gerekmez, direk erişebiliriz. Ama public dosyalar için aynı durum söz konusu değildir.
Public dosyaları oluştururken, kendi klasörümüzü oluşturabiliriz. Ama tavsiye edilen tanımlanmış sabit klasörleri kullanmaktır.
1 2 3 4 5 6 7 8 9 |
String data=etExternalPublic.getText().toString(); //File dosyaYolu=Environment.getExternalStoragePublicDirectory("kendiKlasorum"); File dosyaYolu=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOAD); File file=new File(dosyaYolu, "myExternalPublic.txt"); writeToFile(file, data); |
Public dosyaları okurken;
1 2 3 4 5 6 7 |
File dosyaYolu=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOAD); File dosya=new File(dosyaYolu, "myExternalPublic.txt"); String dosyaIcerigi=readFromFile(dosya); txvExternalPublic.setText(dosyaIcerigi); |
Yukarıdaki methodlar ve kodlar her ne kadar doğru da olsa bizi sonuca ulaştırmıyor. Çünkü external storage’daki public dosyalara erişmek veya oluşturmak için kullanıcıdan izin almamız gerekiyor. Öncelikle bu izinleri manifest dosyasında dosyasında tanımlamalıyız.
1 2 3 |
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> |
Bu tanım api 23 öncesi cihazlarda yeterliyken, api 23 ve sonrasındaki cihazlar için yeterli değildir. Kullanıcından çalışma anında bu izinleri istememiz ve de external storage üzerinde işlem yapabilmemiz için kullanıcının bu izinleri vermiş olması gerekir. Bu işlemi bir sonraki derste yapacağız.
Şuana kadar gördüğümüz kavramları tek bir resimde gösterirsek daha iyi anlaşılacaktır.
Bu derste yazılan kodlar aşağıdaki gibidir. AndroidFileSystemOrnek projesinin bitmiş son halini buradaki linkten indirebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
import android.os.Bundle; import android.os.Environment; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class ExternalStorageDemo extends AppCompatActivity { private EditText etExternalPrivate, etExternalPublic; private TextView txvExternalPrivate, txvExternalPublic; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.external_storage); etExternalPrivate = (EditText) findViewById(R.id.etExternalPrivate); etExternalPublic = (EditText) findViewById(R.id.etExternalPublic); txvExternalPrivate = (TextView) findViewById(R.id.txvExternalPrivate); txvExternalPublic = (TextView) findViewById(R.id.txvExternalPublic); } public void saveToExternalPrivate(View view) { String data=etExternalPrivate.getText().toString(); File dosyaDizini=getExternalFilesDir("myFolder"); File dosya=new File(dosyaDizini, "myExternalPrivate.txt"); writeToFile(dosya, data); } public void saveToExternalPublic(View view) { String data=etExternalPublic.getText().toString(); //File dosyaYolu=Environment.getExternalStoragePublicDirectory("kendiKlasorum"); File dosyaYolu=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOAD); File file=new File(dosyaYolu, "myExternalPublic.txt"); writeToFile(file, data); } public void loadFromExternalPrivate(View view) { File dosyaDizini=getExternalFilesDir("myFolder"); File dosya=new File(dosyaDizini, "myExternalPrivate.txt"); String dosyaIcerigi=readFromFile(dosya); txvExternalPrivate.setText(dosyaIcerigi); } public void loadFromExternalPublic(View view) { File dosyaYolu=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOAD); File dosya=new File(dosyaYolu, "myExternalPublic.txt"); String dosyaIcerigi=readFromFile(dosya); txvExternalPublic.setText(dosyaIcerigi); } private void writeToFile(File file, String data){ FileOutputStream fos = null; try { fos = new FileOutputStream(file); fos.write(data.getBytes()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); Toast.makeText(this, "Dosyaya Yazıldı", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } } } private String readFromFile(File veriOkunacakDosya){ StringBuffer buffer=new StringBuffer(); FileInputStream fis=null; try { fis=new FileInputStream(veriOkunacakDosya); int read; while((read = fis.read()) != -1){ buffer.append((char) read); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { if(fis != null){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } return buffer.toString(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp" tools:context="com.example.emrealtunbilek.androidfilesystemornek.ExternalStorageDemo"> <EditText android:id="@+id/etExternalPrivate" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="External Private Data" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="saveToExternalPrivate" android:text="External Private Kaydet" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="loadFromExternalPrivate" android:text="External Private Verı Getir" /> <TextView android:id="@+id/txvExternalPrivate" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="Dosya İçeriği" android:textColor="@android:color/black" android:textSize="18sp" /> <EditText android:id="@+id/etExternalPublic" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="50dp" android:hint="External Public Data" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="saveToExternalPublic" android:text="External Public kaydet" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="loadFromExternalPublic" android:text="External Public veri getir" /> <TextView android:id="@+id/txvExternalPublic" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="Dosya İçeriği" android:textColor="@android:color/black" android:textSize="18sp" /> </LinearLayout> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void openInternalStorageDemoActivity(View view) { Intent intent=new Intent(this, InternalStorageDemo.class); startActivity(intent); } public void openCacheStorageDemoActivity(View view) { Intent intent=new Intent(this, CacheStorageDemo.class); startActivity(intent); } public void openExternalStorageDemoActivity(View view) { Intent intent=new Intent(this, ExternalStorageDemo.class); startActivity(intent); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp" tools:context="com.example.emrealtunbilek.androidfilesystemornek.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Internal Storage Demo" android:onClick="openInternalStorageDemoActivity"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Cache Storage Demo" android:onClick="openCacheStorageDemoActivity"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="External Storage Demo" android:onClick="openExternalStorageDemoActivity"/> </LinearLayout> |