Java - Dosyalar ve G / Ç

Java.io paketi, Java'da girdi ve çıktı (G / Ç) gerçekleştirmek için ihtiyaç duyabileceğiniz hemen hemen her sınıfı içerir. Tüm bu akışlar bir giriş kaynağını ve bir çıkış hedefini temsil eder. Java.io paketindeki akış, ilkel öğeler, nesne, yerelleştirilmiş karakterler gibi birçok veriyi destekler.

Akış

Bir akış, bir veri dizisi olarak tanımlanabilir. İki tür Akış vardır -

  • InPutStream - InputStream, bir kaynaktan veri okumak için kullanılır.

  • OutPutStream - OutputStream, verileri bir hedefe yazmak için kullanılır.

Java, dosyalar ve ağlarla ilgili G / Ç için güçlü ancak esnek destek sağlar ancak bu eğitim, akışlar ve G / Ç ile ilgili çok temel işlevleri kapsar. En sık kullanılan örnekleri tek tek göreceğiz -

Bayt Akışları

Java bayt akışları, 8 bitlik baytların giriş ve çıkışını gerçekleştirmek için kullanılır. Bayt akışlarıyla ilgili birçok sınıf olmasına rağmen, en sık kullanılan sınıflar şunlardır:FileInputStream ve FileOutputStream. Aşağıda, bir girdi dosyasını bir çıktı dosyasına kopyalamak için bu iki sınıfı kullanan bir örnek verilmiştir -

Example

import java.io.*;
public class CopyFile {

   public static void main(String args[]) throws IOException {  
      FileInputStream in = null;
      FileOutputStream out = null;

      try {
         in = new FileInputStream("input.txt");
         out = new FileOutputStream("output.txt");
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

Şimdi bir dosya alalım input.txt aşağıdaki içerikle -

This is test for copy file.

Bir sonraki adım olarak, yukarıdaki programı derleyin ve çalıştırın, bu da input.txt'deki ile aynı içeriğe sahip output.txt dosyası oluşturmaya neden olacaktır. O halde yukarıdaki kodu CopyFile.java dosyasına koyalım ve aşağıdakileri yapalım -

$javac CopyFile.java
$java CopyFile

Karakter Akışları

Java Byte akışlar, 8 bitlik baytların giriş ve çıkışını gerçekleştirmek için kullanılırken, Java Characterakışlar, 16 bitlik unicode için girdi ve çıktı gerçekleştirmek için kullanılır. Karakter akışlarıyla ilgili birçok sınıf olsa da en sık kullanılan sınıflar şunlardır:FileReader ve FileWriter. FileReader dahili olarak FileInputStream kullanıyor ve FileWriter FileOutputStream kullanıyor ancak buradaki en büyük fark, FileReader'ın bir seferde iki bayt okuması ve FileWriter'ın bir seferde iki bayt yazmasıdır.

Yukarıdaki örneği yeniden yazabiliriz, bu da bu iki sınıfın bir girdi dosyasını (unicode karakterleri olan) bir çıktı dosyasına kopyalamak için kullanmasını sağlar -

Example

import java.io.*;
public class CopyFile {

   public static void main(String args[]) throws IOException {
      FileReader in = null;
      FileWriter out = null;

      try {
         in = new FileReader("input.txt");
         out = new FileWriter("output.txt");
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

Şimdi bir dosya alalım input.txt aşağıdaki içerikle -

This is test for copy file.

Bir sonraki adım olarak, yukarıdaki programı derleyin ve çalıştırın, bu da input.txt'deki ile aynı içeriğe sahip output.txt dosyası oluşturmaya neden olacaktır. O halde yukarıdaki kodu CopyFile.java dosyasına koyalım ve aşağıdakileri yapalım -

$javac CopyFile.java
$java CopyFile

Standart Akışlar

Tüm programlama dilleri, kullanıcının programının bir klavyeden girdi alabildiği ve ardından bilgisayar ekranında bir çıktı üretebildiği standart G / Ç için destek sağlar. C veya C ++ programlama dillerinin farkındaysanız, üç standart cihaz STDIN, STDOUT ve STDERR konusunda bilgi sahibi olmalısınız. Benzer şekilde, Java aşağıdaki üç standart akışı sağlar -

  • Standard Input - Bu, verileri kullanıcının programına beslemek için kullanılır ve genellikle bir klavye standart giriş akışı olarak kullanılır ve şu şekilde temsil edilir: System.in.

  • Standard Output - Bu, kullanıcının programı tarafından üretilen verilerin çıktısını almak için kullanılır ve genellikle standart çıktı akışı için bir bilgisayar ekranı kullanılır ve şu şekilde gösterilir: System.out.

  • Standard Error - Bu, kullanıcının programı tarafından üretilen hata verilerini çıkarmak için kullanılır ve genellikle standart hata akışı için bir bilgisayar ekranı kullanılır ve şu şekilde gösterilir: System.err.

Aşağıdaki basit bir programdır. InputStreamReader kullanıcı "q" yazana kadar standart giriş akışını okumak için -

Example

import java.io.*;
public class ReadConsole {

   public static void main(String args[]) throws IOException {
      InputStreamReader cin = null;

      try {
         cin = new InputStreamReader(System.in);
         System.out.println("Enter characters, 'q' to quit.");
         char c;
         do {
            c = (char) cin.read();
            System.out.print(c);
         } while(c != 'q');
      }finally {
         if (cin != null) {
            cin.close();
         }
      }
   }
}

Yukarıdaki kodu ReadConsole.java dosyasında tutalım ve aşağıdaki programda gösterildiği gibi derleyip çalıştırmaya çalışalım. Bu program, 'q' tuşuna basana kadar aynı karakteri okumaya ve çıktı vermeye devam eder -

$javac ReadConsole.java
$java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q

Dosyaları Okuma ve Yazma

Daha önce açıklandığı gibi, bir akış bir veri dizisi olarak tanımlanabilir. InputStream bir kaynaktan veri okumak için kullanılır ve OutputStream bir hedefe veri yazmak için kullanılır.

Burada, Giriş ve Çıkış akışlarıyla ilgilenmek için bir sınıf hiyerarşisi verilmiştir.

İki önemli akım FileInputStream ve FileOutputStream, bu eğitimde tartışılacak.

FileInputStream

Bu akış, dosyalardan veri okumak için kullanılır. Anahtar sözcük kullanılarak nesneler oluşturulabilirnew ve çeşitli yapıcı türleri mevcuttur.

Aşağıdaki kurucu, dosyayı okumak üzere bir giriş akışı nesnesi oluşturmak için dize olarak bir dosya adı alır -

InputStream f = new FileInputStream("C:/java/hello");

Aşağıdaki kurucu, dosyayı okumak üzere bir giriş akışı nesnesi oluşturmak için bir dosya nesnesi alır. Öncelikle aşağıdaki gibi File () yöntemini kullanarak bir dosya nesnesi oluşturuyoruz -

File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);

Elinizde InputStream nesnesine sahip olduğunuzda, akışa okumak veya akış üzerinde diğer işlemleri yapmak için kullanılabilecek yardımcı yöntemlerin bir listesi vardır.

Sr.No. Yöntem ve Açıklama
1

public void close() throws IOException{}

Bu yöntem, dosya çıkış akışını kapatır. Dosyayla ilişkili tüm sistem kaynaklarını serbest bırakır. Bir IOException oluşturur.

2

protected void finalize()throws IOException {}

Bu yöntem, dosyaya olan bağlantıyı temizler. Bu dosya çıkış akışının kapatma yönteminin, bu akışa başka başvuru olmadığında çağrılmasını sağlar. Bir IOException oluşturur.

3

public int read(int r)throws IOException{}

Bu yöntem, InputStream'den belirtilen veri baytını okur. Bir int döndürür. Bir sonraki veri baytını döndürür ve dosyanın sonu ise -1 döndürülür.

4

public int read(byte[] r) throws IOException{}

Bu yöntem, girdi akışından r.length baytlarını bir diziye okur. Okunan toplam bayt sayısını döndürür. Dosyanın sonuysa -1 döndürülür.

5

public int available() throws IOException{}

Bu dosya giriş akışından okunabilen bayt sayısını verir. Bir int döndürür.

Kullanılabilir başka önemli giriş akışları da vardır, daha fazla ayrıntı için aşağıdaki bağlantılara başvurabilirsiniz -

  • ByteArrayInputStream

  • DataInputStream

FileOutputStream

FileOutputStream, bir dosya oluşturmak ve içine veri yazmak için kullanılır. Akış, çıktı için açmadan önce, zaten mevcut değilse bir dosya oluşturur.

Burada bir FileOutputStream nesnesi oluşturmak için kullanılabilecek iki yapıcı vardır.

Aşağıdaki kurucu, dosyayı yazmak üzere bir giriş akışı nesnesi oluşturmak için dizge olarak bir dosya adı alır -

OutputStream f = new FileOutputStream("C:/java/hello")

Aşağıdaki kurucu, dosyayı yazmak üzere bir çıktı akış nesnesi oluşturmak için bir dosya nesnesi alır. Öncelikle File () yöntemini kullanarak aşağıdaki gibi bir dosya nesnesi oluşturuyoruz -

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

Elinizde OutputStream nesnesine sahip olduğunuzda, akışa yazmak veya akış üzerinde diğer işlemleri yapmak için kullanılabilecek yardımcı yöntemlerin bir listesi vardır.

Sr.No. Yöntem ve Açıklama
1

public void close() throws IOException{}

Bu yöntem, dosya çıkış akışını kapatır. Dosyayla ilişkili tüm sistem kaynaklarını serbest bırakır. Bir IOException oluşturur.

2

protected void finalize()throws IOException {}

Bu yöntem, dosyaya olan bağlantıyı temizler. Bu dosya çıkış akışının kapatma yönteminin, bu akışa başka başvuru olmadığında çağrılmasını sağlar. Bir IOException oluşturur.

3

public void write(int w)throws IOException{}

Bu yöntemler, belirtilen baytı çıktı akışına yazar.

4

public void write(byte[] w)

Belirtilen bayt dizisindeki w.length baytlarını OutputStream'e yazar.

Diğer önemli çıktı akışları da vardır, daha fazla ayrıntı için aşağıdaki bağlantılara başvurabilirsiniz -

  • ByteArrayOutputStream

  • DataOutputStream

Example

InputStream ve OutputStream'i gösteren örnek aşağıdadır -

import java.io.*;
public class fileStreamTest {

   public static void main(String args[]) {
   
      try {
         byte bWrite [] = {11,21,3,40,5};
         OutputStream os = new FileOutputStream("test.txt");
         for(int x = 0; x < bWrite.length ; x++) {
            os.write( bWrite[x] );   // writes the bytes
         }
         os.close();
     
         InputStream is = new FileInputStream("test.txt");
         int size = is.available();

         for(int i = 0; i < size; i++) {
            System.out.print((char)is.read() + "  ");
         }
         is.close();
      } catch (IOException e) {
         System.out.print("Exception");
      }	
   }
}

Yukarıdaki kod, test.txt dosyasını oluşturacak ve verilen sayıları ikili biçimde yazacaktır. Aynı standart çıkış ekranındaki çıktı da olacaktır.

Dosyada Gezinme ve G / Ç

Dosya Gezinme ve G / Ç'nin temellerini öğrenmek için kullanacağımız birkaç sınıf daha var.

  • Dosya Sınıfı

  • FileReader Sınıfı

  • FileWriter Sınıfı

Java'daki dizinler

Bir dizin, diğer dosya ve dizinlerin bir listesini içerebilen bir Dosyadır. KullanFilenesne dizinler yaratmak, bir dizinde bulunan dosyaları listelemek için. Tam ayrıntı için, Dosya nesnesinde çağırabileceğiniz tüm yöntemlerin ve dizinlerle ilgili olanların bir listesini kontrol edin.

Dizinler Oluşturma

İki yararlı var File dizinler oluşturmak için kullanılabilecek yardımcı program yöntemleri -

  • mkdir( )yöntem bir dizin oluşturur ve başarı durumunda true, başarısızlık durumunda false döndürür. Hata, File nesnesinde belirtilen yolun zaten mevcut olduğunu veya yolun tamamı henüz mevcut olmadığı için dizinin oluşturulamayacağını gösterir.

  • mkdirs() yöntem hem bir dizin hem de dizinin tüm üst öğelerini oluşturur.

Aşağıdaki örnek "/ tmp / user / java / bin" dizinini oluşturur -

Example

import java.io.File;
public class CreateDir {

   public static void main(String args[]) {
      String dirname = "/tmp/user/java/bin";
      File d = new File(dirname);
      
      // Create directory now.
      d.mkdirs();
   }
}

"/ Tmp / user / java / bin" oluşturmak için yukarıdaki kodu derleyin ve çalıştırın.

Note- Java, UNIX ve Windows'daki yol ayırıcıları kurallara göre otomatik olarak halleder. Java'nın Windows sürümünde eğik çizgi (/) kullanırsanız, yol yine de doğru şekilde çözülecektir.

Listeleme Dizinleri

Kullanabilirsiniz list( ) tarafından sağlanan yöntem File aşağıdaki gibi bir dizinde bulunan tüm dosyaları ve dizinleri listelemek için nesne -

Example

import java.io.File;
public class ReadDir {

   public static void main(String[] args) {
      File file = null;
      String[] paths;
  
      try {      
         // create new file object
         file = new File("/tmp");

         // array of files and directory
         paths = file.list();

         // for each name in the path array
         for(String path:paths) {
            // prints filename and directory name
            System.out.println(path);
         }
      } catch (Exception e) {
         // if any error occurs
         e.printStackTrace();
      }
   }
}

Bu, cihazınızda bulunan dizinlere ve dosyalara dayalı olarak aşağıdaki sonucu verecektir. /tmp dizin -

Output

test1.txt
test2.txt
ReadDir.java
ReadDir.class