DOSYA İŞLEMLERİ GİRİŞ/ÇIKIŞ I/O
Dosya işlemleri başlığından da anlaşılacağı gibi bugün dosyadan veri alma, ekleme, üstüne yazma vb gibi işlemler yapacağız.
Javada Dosya İşlemleri
- InputStream : Byte tabanlıdır. Dizilerin ya da byte’ların tek tek okunmasını sağlar.
- FileInputStream *
- ByteArrayInputStream
- FilterInputStream
- OutputStream : Byte tabanlıdır. Dizilerin ya da byte’ların tek tek okunmasını sağlar.
- FileOutputStream *
- ByteArrayOutputStream
- FilterOutputStream
- Reader : Karakter tabanlı dosyalardaki karakterlerin okunmasını sağlar.
- BufferedReader *
- InputStreamReader
- StringReader
- Writer : Karakterlerin dosyalara yazılmasını sağlar.
- BufferedWriter *
- OutputStreamWriter
- StringWriter
- PrintWriter
Üstteki listede yalnızca yanında * olanları işledik.
InputStream ve OutputStream Writer ve Reader
Bu dersimizde birçok sınıfı import etmemiz gerekecek. Dosya işlemlerinde Giriş/Çıkış için sınıflarının bulunduğu paketi tek seferde import edelim.
import java.io.*;
File Sınıfı
Bu sınıf sayesinde disk üzerinde bulunan dosyayı program içinde bir nesne haline getirip programcının dosya üzerinde işlem yapabilmesine olanak sağlar.
Kullanımı;
File f = new File("dosya yolu")
Dosya yolunu belirtirken bir şeye dikkat etmek gerek. Örneğin dosya yolu C:\Users\karak\Desktop\javva47.txt olan bir dosyanın yolunu aşağıdaki gibi belirtmek lazım.
File f2 = new File("C:\\Users\\karak\\Desktop\\javva47.txt");
Ters çizgiden 2 defa kullanılır. Bunun böyle olmasının bazı sebepleri var. Satır atlama vb işlemler içinde de aynı karakterin kullanılmasıdır.
Eğer belirtilen yolda o dosya yok ise işlem yapılamayacağından hata verir. Ki zaten bunu kodlarken try catch ile kontrol altına almak gerek.
Aşağıdaki örneğimizde dosyalar ile işlem yaparken sıkça kullanacağımız bazı metotlar bulunmakta. Örneği inceleyin.
import java.io.*;
public class Main {
private static File f = new File("C:\\Users\\karak\\Desktop\\ornek.txt");
public static void main(String[] args) throws Exception {
if(f.exists()) // Dosyanın var olup olmadığı kontrol edilir.
{
kullanilanBaziMetotlar();
f.delete(); // Dosyayı siler
}
else {
kullanilanBaziMetotlar();
f.createNewFile(); // Dosya yok ise oluşturur.
}
}
private static void kullanilanBaziMetotlar(){
System.out.println("Dosya adı : " + f.getName());
System.out.println("Dosya yolu : " + f.getAbsolutePath());
System.out.println("Dosya boyutu : " + f.getTotalSpace());
System.out.println("Dosya okunabilrmi : " + f.canRead());
System.out.println("Dosya Yazilabilirmi : " + f.canWrite());
System.out.println("Dosya mı? : " + f.isFile()); // Klasör ise false döner
}
}
Çıktısı;
Dosya adı : ornek.txt
Dosya yolu : C:\Users\karak\Desktop\ornek.txt
Dosya boyutu : 475361439744
Dosya okunabilrmi : true
Dosya Yazilabilirmi : true
Dosya mı? : true // Dosya olduğunu gördü ve true döndü. Ama örneğimizde işlemlerden sonra dosyanın silinmesini istedik. Yani programı bir kez daha çalıştırırsak dosya olmadığından dolayı false dönecek.
Şimdi dosya okuma işlemine geçelim. Dosyamızın içinde bir yazı bulunsun ve biz yazıyı ekrana bastıralım. ornek.txt dosyamızın içine kendimiz “Merhaba bu bir deneme yazısıdır” şeklinde bir yazı yazalım ve daha sonra aşağıdaki kodları programımıza döküp çalıştıralım.
import java.io.*;
public class Main {
public static void main(String[] args) {
File f = new File("C:\\Users\\karak\\Desktop\\ornek.txt");
char veriler [] = new char[(int) f.length()];
try
{
FileReader fr = new FileReader(f);
fr.read(veriler);
String okunan = new String(veriler);
System.out.println(okunan);
}catch(FileNotFoundException ex)
{
ex.printStackTrace();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
Çıktısı;
Merhaba bu bir deneme yazısıdır
Dosya bir şey yazdık ve daha sonra bu yazdığımız veriyi FileReader ile aldık. Şimdi de program sayesinde veri girip ve daha sonra veriyi alalım.
Dosyaya bir şeyler yazdırmak için FileWriter kullanılır.
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
File mrcaracal = new File("C:\\Users\\karak\\Desktop\\ornek.txt");
try {
// Yazdırma İşlemleri
/*NOT : FileWriter sınıfı kullanırken eğer dosya yok ise oluşturur. Var ise de sıkıntı yok :) */
FileWriter fileWriter = new FileWriter(mrcaracal, true); // true ile dosyanın davamına yazacağımızı belirttik
// FileWriter fileWriter1 = new FileWriter(mrcaracal); // Tek parametre verilirse üstüne yazma işlemi yapar
String yazilacak = "Öğrenmek için öğretmeye çalış";
fileWriter.write(yazilacak);
fileWriter.close();
// Okuma İşlemleri
char verilerimiz [] = new char[(int) mrcaracal.length()];
FileReader fileReader = new FileReader(mrcaracal);
fileReader.read(verilerimiz);
String okunan_veri = new String(verilerimiz);
System.out.println(okunan_veri);
}catch (Exception ex){
ex.printStackTrace();
}
}
}
Çıktısı;
Öğrenmek için öğretmeye çalışÖğrenmek için öğretmeye çalışÖğrenmek için öğretmeye çalışÖğrenmek için öğretmeye çalış
Çıktıya baktığınızda aynı mesajın defalarca yazıldığını göreceksiniz. Bunun sebebi programı defalarca çalıştırmam. Her defasında dosyanın üzerine ekleme yaptı. Ben varolan yazının üstüne ekleme yapmak istiyorum derseniz aşağıdaki kod satırında true parametresini ya false yapın ya da silin gitsin.
FileWriter fileWriter = new FileWriter(mrcaracal, true);
veya
FileWriter fileWriter = new FileWriter(mrcaracal);
Ayrıca önemli bir noktaya değinmek isterim (Kodların arasında bir yorum satırında zaten bahsettim). FileWriter kullanırken belirttiğimiz dosya yok ise oluşturur. Var ise de sıkıntı yok.
Şimdi FileInputStream ve FileOutputStream sınıfları ile ilgili birer örnek yapalım
FileInputStream örneği;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
File file = new File("C:\\Users\\karak\\Desktop\\ornek.txt");
try {
FileInputStream fileInputStream = new FileInputStream(file);
byte dizi [] = new byte[(int) file.length()];
fileInputStream.read(dizi);
String okunan_veri = new String(dizi);
System.out.println(okunan_veri);
}catch (Exception e){
e.printStackTrace();
}
}
}
Çıktısı;
Öğrenmek için öğretmeye çalış
FileOutputStream örneği;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
File file = new File("C:\\Users\\karak\\Desktop\\ornek.txt");
try {
FileOutputStream fileOutputStream = new FileOutputStream(file, true); //true ya da false olarak değiştir
String metin = "Yeni metnimiz budur!";
byte veriler [] = metin.getBytes();
fileOutputStream.write(veriler);
fileOutputStream.close();
char okunacak [] = new char[(int) file.length()];
FileReader fileReader = new FileReader(file);
fileReader.read(okunacak);
String okunan_veri = new String(okunacak);
System.out.println(okunan_veri);
}catch (Exception e){
e.printStackTrace();
}
}
}
Çıktısı;
öğrenmek için öğretmeye çalış!Yeni metnimiz budur!Yeni metnimiz budur!
BufferedReader ve BufferedWriter kullanımıyla da ilgili örnekler yapıp bu dersin sonuna gelelim.
BufferedReader örneği;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
try {
File file = new File("C:\\Users\\karak\\Desktop\\ornek.txt");
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String satir = bufferedReader.readLine();
while (satir != null){
System.out.println(satir);
satir = bufferedReader.readLine();
}
bufferedReader.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
Çıktısı;
öğrenmek için öğretmeye çalış!
BufferedWriter örneği;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
File f = new File("C:\\Users\\karak\\Desktop\\ornek.txt");
FileWriter fw = new FileWriter(f,false);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("Bu bir deneme yazzzzisidir"); //buffer a yazar
bw.flush(); //buffer dan dosyaya yazar
bw.close();
}
}
Programı çalıştırdığımızda dosyamıza mesajın yazdırıldığını göreceksiniz.
Bir sonraki dersimiz de bu dersin devamı niteliğinde olacak. Ama birazcık farklı sınıflar da işleyebiliriz.