Skip to content

4. Yaygın Olarak Kullanılan Sınıflar

Bu bölümde, yaygın olarak kullanılan bazı Java sınıflarını tanıtıyoruz. Bu sınıfların çok sayıda özniteliği, yöntemi ve oluşturucusu vardır. Her seferinde, sınıfların sadece küçük bir kısmını ele alıyoruz. Bunların ayrıntıları, şimdi tanıtacağımız Java yardımında mevcuttur.

4.1. Belgeler

Sun'ın JDK paketini <jdk> klasörüne kurduysanız, belgelere <jdk>\docs klasöründen ulaşabilirsiniz:

Image

Bazen jdk dosyası bulunur, ancak dokümantasyon yoktur. Dokümantasyon, Sun'ın http://www.sun.com adresindeki web sitesinde bulunabilir. docs klasöründe, JDK yardım dosyasının başlangıç noktası olan index.html dosyası bulunur:

Image

Image

Yukarıdaki API & Language bağlantısı, Java sınıflarına erişim sağlar. Demos/Tutorials bağlantısı, Java program örneklerine ulaşmak için özellikle yararlıdır. API & Language bağlantısını takip edelim:

Image

Java 2 Platformu bağlantısını (API) takip edelim:

Image

Bu sayfa, sınıflarla ilgili belgelerin asıl başlangıç noktasıdır. Hızlı erişim için bu sayfaya bir kısayol oluşturulabilir. URL, <jdk>\docs\api\index.html konumundadır. Burada, JDK'teki yüzlerce Java sınıfına ilişkin bağlantılar bulunur. Başlangıçta karşılaşılan en büyük zorluk, bu farklı sınıfların ne işe yaradığını bilmektir. Dolayısıyla ilk etapta, bu yardım ancak bilgi almak istediğiniz sınıfın adını biliyorsanız anlamlıdır. Ayrıca, genellikle sınıfın işlevini belirten sınıf adlarından da yol gösterici olarak yararlanabilirsiniz.

Bir örnek verelim ve dinamik bir dizi uygulayan Vector sınıfı hakkında bilgi arayalım. Sol taraftaki çerçeve içindeki sınıflar listesinde Vector sınıfının bağlantısını aramak yeterlidir:

Image

ve sınıfın tanımını görmek için bu bağlantıya tıklamak yeterlidir:

Image

Burada

  • sınıfın bulunduğu hiyerarşi, bu örnekte java.util.Vector
  • sınıfın alan (öznitelik) listesi
  • yapıcıların listesi
  • yöntemlerin listesi

Bundan sonra çeşitli sınıfları tanıtacağız. Okuyucuyu, kullanılan sınıfların tam tanımlarını sistematik olarak kontrol etmeye davet ediyoruz.

4.2. Test sınıfları

Aşağıdaki örneklerde zaman zaman personne ve enseignant sınıfları kullanılmaktadır. Bu sınıfların tanımlarını burada tekrar hatırlatıyoruz.

public class personne{
    // soyadı, adı, yaşı
  private String prenom;
  private String nom;
  private int age;

  // yapıcı 1
  public personne(String P, String N, int age){
    this.prenom=P;
    this.nom=N;
    this.age=age;
  }

   // yapıcı 2
  public personne(personne P){
    this.prenom=P.prenom;
    this.nom=P.nom;
    this.age=P.age;
  }

  // toString
  public String toString(){
    return "personne("+prenom+","+nom+","+age+")";
  }

  // yardımcılar
  public String getPrenom(){
    return prenom;
  }
  public String getNom(){
    return nom;
  }
  public int getAge(){
    return age;
  }

  //değiştiriciler
  public void setPrenom(String P){
    this.prenom=P;
  }
  public void setNom(String N){
    this.nom=N;
  }
  public void setAge(int age){
    this.age=age;
  }
}

enseignant sınıfı, personne sınıfından türetilmiştir ve şu şekilde tanımlanmıştır:

class enseignant extends personne{
// öznitelikler
  private int section;

    // oluşturucu
  public enseignant(String P, String N, int age,int section){
    super(P,N,age);
    this.section=section;
  }
    // toString
  public String toString(){
    return "etudiant("+super.toString()+","+section+")";    
  }
}

Ayrıca, personne sınıfından türetilen ve aşağıdaki gibi tanımlanan etudiant sınıfını da kullanacağız:


class etudiant extends personne{
  String numero;

  public etudiant(String P, String N, int age,String numero){
    super(P,N,age);
    this.numero=numero;
  }

  public String toString(){
    return "etudiant("+super.toString()+","+numero+")";    
  }    
}

4.3. String sınıfı

String sınıfı, karakter dizilerini temsil eder. nom bir karakter dizisi değişkeni olsun:

String isim;

nom, henüz başlatılmamış bir nesneye ait bir referanstır. Bu değişkeni iki şekilde başlatabiliriz:

nom="at" veya nom=new String("at")

Her iki yöntem de eşdeğerdir. Daha sonra nom="balık" yazılırsa, nom yeni bir nesneye referans verir. Eski nesne String("cheval") kaybolur ve işgal ettiği bellek alanı geri kazanılır.

String sınıfı, birçok öznitelik ve yönteme sahiptir. İşte bunlardan bazıları:

public char charAt(int i)
dizgedeki i karakterini verir; ilk karakterin indeksi 0'dır. Dolayısıyla String("at").charAt(3) 'v' karakterine eşittir
public int compareTo(dize2)
chaine1.compareTo(dize2), dize1 ile dize2'yi karşılaştırır ve dize1 = dize2 ise 0, dize1 > dize2 ise 1, dize1 < dize2 ise -1 değerini döndürür
public boolean equals(Object anObject)
chaine1.equals(dize2), dize1 = dize2 ise true, aksi takdirde false değerini döndürür
public String toLowerCase()
chaine1.toLowerCase() dizge1'i küçük harfe dönüştürür
public String toUpperCase()
chaine1.toUpperCase() string1'i büyük harflerle döndürür
public String trim()
chaine1.trim(), chaine1'in başındaki ve sonundaki boşlukları temizler
public String substring(int beginIndex, int endIndex)
String("chapeau").subString(2,4), "ape" dizesini döndürür
public char[] toCharArray()
dizgideki karakterleri bir karakter dizisine yerleştirir
int length()
dizenin karakter sayısı
int indexOf(String chaine2)
geçerli dizede chaine2'in ilk konumunu döndürür; chaine2 mevcut değilse -1 döndürür
int indexOf(String chaine2, int startIndex)
geçerli dizede chaine2'in ilk konumunu döndürür; chaine2 mevcut değilse -1 döndürür. Arama, startIndex numaralı karakterden başlar.
int lastIndexOf(String chaine2)
geçerli dizede chaine2'in son konumunu döndürür; chaine2 mevcut değilse -1 döndürür
boolean startsWith(String chaine2)
geçerli dize chaine2 ile başlıyorsa true değerini döndürür
boolean endsWith(String chaine2)
Geçerli olur, eğer geçerli dize chaine2 ile bitiyorsa
boolean matches(String regex)
Geçerli dize, regex düzenli ifadesine uyuyorsa true değerini döndürür.
String[] split(String regex)
Geçerli dize, regex düzenli ifadesiyle modellenen bir karakter dizisiyle ayrılmış alanlardan oluşur. split yöntemi, alanları bir dizide geri almayı sağlar.
String replace(char oldChar, char newChar)
geçerli dizgedeki oldChar karakterini newChar karakteriyle değiştirir.

İşte bir örnek program:

// ithalatlar
import java.io.*;

public class string1{
    // bir örnek sınıf
    public static void main(String[] args){
        String uneChaine="l'oiseau vole au-dessus des nuages";
        affiche("uneChaine="+uneChaine);
        affiche("uneChaine.Length="+uneChaine.length());
        affiche("chaine[10]="+uneChaine.charAt(10));
        affiche("uneChaine.IndexOf(\"vole\")="+uneChaine.indexOf("vole"));
        affiche("uneChaine.IndexOf(\"x\")="+uneChaine.indexOf("x"));
        affiche("uneChaine.LastIndexOf('a')="+uneChaine.lastIndexOf('a'));
        affiche("uneChaine.LastIndexOf('x')="+uneChaine.lastIndexOf('x'));
        affiche("uneChaine.substring(4,7)="+uneChaine.substring(4,7));
        affiche("uneChaine.ToUpper()="+uneChaine.toUpperCase());
        affiche("uneChaine.ToLower()="+uneChaine.toLowerCase());
        affiche("uneChaine.Replace('a','A')="+uneChaine.replace('a','A'));
        String[] champs=uneChaine.split("\\s+");
        for (int i=0;i<champs.length;i++){
            affiche("champs["+i+"]=["+champs[i]+"]");
        }//for
        affiche("(\"  abc  \").trim()=["+"  abc  ".trim()+"]");
    }//Ana

  // görüntüler
    public static void affiche(String msg){
        // msg'yi görüntüler
        System.out.println(msg);
    }//görüntüle
}//sınıf

ve elde edilen sonuçlar:

uneChaine=l'oiseau vole au-dessus des nuages
uneChaine.Length=34
chaine[10]=o
uneChaine.IndexOf("vole")=9
uneChaine.IndexOf("x")=-1
uneChaine.LastIndexOf('a')=30
uneChaine.LastIndexOf('x')=-1
uneChaine.substring(4,7)=sea
uneChaine.ToUpper()=L'OISEAU VOLE AU-DESSUS DES NUAGES
uneChaine.ToLower()=l'oiseau vole au-dessus des nuages
uneChaine.Replace('a','A')=l'oiseAu vole Au-dessus des nuAges
champs[0]=[l'oiseau]
champs[1]=[vole]
champs[2]=[au-dessus]
champs[3]=[des]
champs[4]=[nuages]
("  abc  ").trim()=[abc]

4.4. Vector sınıfı

Vektör, elemanları nesne referansları olan dinamik bir dizidir. Dolayısıyla, boyutu zaman içinde değişebilen bir nesne dizisidir; bu, şimdiye kadar karşılaştığımız statik dizilerde mümkün olmayan bir özelliktir. İşte bu sınıfın bazı alanları, oluşturucuları ve yöntemleri:

public Vector()
boş bir vektör oluşturur
public final int size()
vektördeki eleman sayısı
public final void addElement(Object obj)
obj tarafından referans verilen nesneyi vektöre ekler
public final Object elementAt(int index)
vektördeki index numaralı nesneye referans verir - indeksler 0'dan başlar
public final Enumeration elements()
vektördeki tüm elemanları bir enumerasyon olarak döndürür
public final Object firstElement()
vektörün ilk elemanına referans
public final Object lastElement()
vektörün son elemanının referansı
public final boolean isEmpty()
vektör boşsa true değerini döndürür
public final void removeElementAt(int index)
index indeksindeki öğeyi kaldırır
public final void removeAllElements()
vektördeki tüm elemanları siler
public final String toString()
vektörün kimlik dizesini döndürür

İşte bir test programı:


// ithal edilen sınıflar
import java.util.*;

public class test1{

// ana program main - static - sınıf yöntemi

  public static void main(String arg[]){

// sınıf örneklerinin oluşturulması
    personne p=new personne("Jean","Dupont",30);
    enseignant en=new enseignant("Paula","Hanson",56,27);
    etudiant et=new etudiant("Chris","Garot",22,"19980405");
    System.out.println("p="+p.toString());
    System.out.println("en="+en.toString());
    System.out.println("et="+et.toString());

// polimorfizm
    personne p2=(personne)en;
    System.out.println("p2="+p2.toString());
    personne p3=(personne)et;
    System.out.println("p3="+p3.toString());

// bir vektör
    Vector V=new Vector();
    V.addElement(p);V.addElement(en);V.addElement(et);
    System.out.println("Taille du vecteur V = "+V.size());
    for(int i=0;i<V.size();i++){
      p2=(personne) V.elementAt(i);
      System.out.println("V["+i+"]="+p2.toString());
    }
} // main sonu
}// sınıf sonu

Bu programı derleyelim:

E:\data\serge\JAVA\poly juin 2002\Chapitre 3\vector>dir
10/06/2002  10:41                1 134 personne.class
10/06/2002  10:41                  619 enseignant.class
10/06/2002  10:41                  610 etudiant.class
10/06/2002  10:42                1 035 test1.java
E:\data\serge\JAVA\poly juin 2002\Chapitre 3\vector>javac test1.java

E:\data\serge\JAVA\poly juin 2002\Chapitre 3\vector>dir
10/06/2002  10:41                1 134 personne.class
10/06/2002  10:41                  619 enseignant.class
10/06/2002  10:41                  610 etudiant.class
10/06/2002  10:42                1 035 test1.java
10/06/2002  10:43                1 506 test1.class

test1.class dosyasını çalıştıralım:

E:\data\serge\JAVA\poly juin 2002\Chapitre 3\vector>java test1
p=personne(Jean,Dupont,30)
en=etudiant(personne(Paula,Hanson,56),27)
et=etudiant(personne(Chris,Garot,22),19980405)
p2=etudiant(personne(Paula,Hanson,56),27)
p3=etudiant(personne(Chris,Garot,22),19980405)
Taille du vecteur V = 3
V[0]=personne(Jean,Dupont,30)
V[1]=etudiant(personne(Paula,Hanson,56),27)
V[2]=etudiant(personne(Chris,Garot,22),19980405)

Bundan sonra, test programlarının derlenmesi ve çalıştırılması sürecini tekrarlamayacağız. Yukarıda yapılanları tekrarlamak yeterlidir.

4.5. ArrayList sınıfı

ArrayList sınıfı, Vector sınıfına benzerdir. Temel olarak, yalnızca birden fazla yürütme iş parçacığı tarafından aynı anda kullanıldığında farklılık gösterir. Bir Vector veya bir ArrayList'e erişim için iş parçacıklarını senkronize etme yöntemleri farklıdır. Bu durum dışında, ikisinden herhangi biri aynı şekilde kullanılabilir. İşte bu sınıfın bazı alanları, oluşturucuları veya yöntemleri:

ArrayList()
boş bir dizi oluşturur
int size()
dizideki öğe sayısı
void add(Object obj)
obj tarafından referans verilen nesneyi diziye ekler
void add(int index, Object obj)
obj tarafından referans verilen nesneyi, index konumunda diziye ekler
Object get(int index)
dizideki index numaralı nesnenin referansı - indeksler 0'dan başlar
boolean isEmpty()
dizi boşsa true değerini döndürür
void remove(int index)
index indeksindeki öğeyi kaldırır
void clear()
dizideki tüm öğeleri siler
Object[] toArray()
dinamik diziyi klasik bir diziye dönüştürür
String toString()
dizinin kimlik dizesini döndürür

İşte bir test programı:

// ithal edilen sınıflar
import java.util.*;

public class test1{

// ana program main - static - sınıf yöntemi

  public static void main(String arg[]){

// sınıf örneklerinin oluşturulması
    personne p=new personne("Jean","Dupont",30);
    enseignant en=new enseignant("Paula","Hanson",56,27);
    etudiant et=new etudiant("Chris","Garot",22,"19980405");
    System.out.println("p="+p);
    System.out.println("en="+en);
    System.out.println("et="+et);

// polimorfizm
    personne p2=(personne)en;
    System.out.println("p2="+p2);
    personne p3=(personne)et;
    System.out.println("p3="+p3);

// bir vektör
    ArrayList personnes=new ArrayList();
    personnes.add(p);personnes.add(en);personnes.add(et);
    System.out.println("Nombre de personnes = "+personnes.size());
    for(int i=0;i<personnes.size();i++){
      p2=(personne) personnes.get(i);
      System.out.println("personnes["+i+"]="+p2);
    }
} // main sonu
}// sınıf sonu

Elde edilen sonuçlar öncekilerle aynıdır.

4.6. Arrays sınıfı

java.util.Arrays sınıfı, diziler üzerinde çeşitli işlemler, özellikle sıralama ve eleman arama işlemlerini gerçekleştirmeye olanak tanıyan statik yöntemlere erişim sağlar. İşte bu yöntemlerden bazıları:

static void sort(dizi)
tableau dizisini, dizi veri türünün (sayı veya karakter dizileri) örtük sıralamasını kullanarak sıralar.
static void sort (Object[] dizi, Comparator C)
tableau dizisini, elemanları karşılaştırmak için C karşılaştırma işlevini kullanarak sıralar
static int binarySearch(dizi, eleman)
élément'in tableau içindeki konumunu döndürür; aksi takdirde <0 değerini döndürür. Dizi önceden sıralanmış olmalıdır.
static int binarySearch(Object[] dizi, Object eleman, Comparator C)
Aynı işlevi yerine getirir, ancak dizideki iki öğeyi karşılaştırmak için C karşılaştırma işlevini kullanır.

İşte ilk örnek:

import java.util.*;

public class sort2 implements Comparator{

   // iç özel sınıf
  private class personne{
    private String nom;
    private int age;
    public personne(String nom, int age){
      this.nom=nom; // kişinin adı
      this.age=age; // yaşı
    }
     // yaşı al
    public int getAge(){
      return age;
    }
     // kişinin kimliği
    public String toString(){
      return ("["+nom+","+age+"]");
    }
  }; // kişi sınıfı

   // üretici
  public sort2() {
     // kişi tablosu
    personne[] amis=new personne[]{new personne("tintin",100),new personne("milou",80),
        new personne("tournesol",40)};
     // kişi tablosunun sıralanması
    Arrays.sort(amis,this);
     // doğrulama
    for(int i=0;i<3;i++)
      System.out.println(amis[i]);
  }//oluşturucu

   // kişileri karşılaştıran işlev
  public int compare(Object o1, Object o2){
    // şunu döndürmelidir
     // -1, eğer o1 "o2'den küçükse"
     // o1 "o2'ye eş" ise 0
     // o1, o2'den "büyükse" +1
    personne p1=(personne)o1;
    personne p2=(personne)o2;
    int age1=p1.getAge();
    int age2=p2.getAge();
    if(age1<age2) return (-1);
      else if (age1==age2) return (0);
        else return +1;
  }//karşılaştırır

    // test fonksiyonu
  public static void main(String[] arg){
    new sort2();
  }//ana

}//sınıf

Bu programı inceleyelim. main işlevi, bir sort2 nesnesi oluşturur. sort2 sınıfının oluşturucusu şöyledir:

   // üretici
  public sort2() {
     // kişi tablosu
    personne[] amis=new personne[]{new personne("tintin",100),new personne("milou",80),
        new personne("tournesol",40)};
     // kişi tablosunun sıralanması
    Arrays.sort(amis,this);
     // doğrulama
    for(int i=0;i<3;i++)
      System.out.println(amis[i]);
  }//üretici

Sıralanacak dizi, personne nesnelerinden oluşan bir dizidir. personne sınıfı, sort2 sınıfının içinde özel olarak (private) tanımlanmıştır. Arrays sınıfının sort statik yöntemi, personne nesnelerinden oluşan bir diziyi nasıl sıralayacağını bilmediğinden, burada void sort(Object[] obj, Comparator C) biçimini kullanmak zorundayız. Comparator, yalnızca bir yöntem tanımlayan bir arayüzdür:

    int compare(Object o1, Object o2)

ve bu yöntem 0 değerini döndürmelidir: o1=o2 ise, -1: o1 < o2 ise, +1: o1 > o2 ise. void sort(Object[] obj, Comparator C) prototipinde ikinci argüman C, Comparator arayüzünü uygulayan bir nesne olmalıdır. sort2 yapıcıda, mevcut this nesnesi seçilmiştir:

     // kişi tablosunun sıralanması
    Arrays.sort(amis,this);

Bu durum iki şey yapmamızı gerektirir:

  1. sort2 sınıfının Comparator arayüzünü uyguladığını belirtmek
public class sort2 implements Comparator{
  1. compare işlevini sort2 sınıfına yazın.

İşlev şu şekildedir:

   // kişileri karşılaştıran işlev
  public int compare(Object o1, Object o2){
    // şunu döndürmelidir
     // o1 "o2'den küçükse" -1
     // o1 "o2'ye eş" ise 0
     // o1, o2'den "büyükse" +1
    personne p1=(personne)o1;
    personne p2=(personne)o2;
    int age1=p1.getAge();
    int age2=p2.getAge();
    if(age1<age2) return (-1);
      else if (age1==age2) return (0);
        else return +1;
  }//karşılaştırır

İki nesneyi (personne) karşılaştırmak için burada yaş kullanılıyor (ad da kullanılabilirdi).

Çalıştırma sonuçları şöyledir:

[tournesol,40]
[milou,80]
[tintin,100]

Comparator arayüzünü uygulamak için farklı bir yol da izlenebilirdi:

import java.util.*;

public class sort2 {

  // özel bir iç sınıf
  private class personne{
…….
  }; // kişi sınıfı

   // yapıcı
  public sort2() {
     // kişi dizisi
    personne[] amis=new personne[]{new personne("tintin",100),new personne("milou",80),
        new personne("tournesol",40)};
     // kişi dizisinin sıralanması
    Arrays.sort(amis,
        new java.util.Comparator(){
          public int compare(Object o1, Object o2){
            return compare1(o1,o2);
        }//karşılaştırma
      }//sınıflandırma
    );
     // doğrulama
    for(int i=0;i<3;i++)
      System.out.println(amis[i]);
  }//oluşturucu

   // kişileri karşılaştıran işlev
  public int compare1(Object o1, Object o2){
    // şunu döndürmelidir
     // -1, eğer o1 "o2'den küçükse"
     // o1 "o2'ye eş" ise 0
     // o1, o2'den "büyükse" +1
    personne p1=(personne)o1;
    personne p2=(personne)o2;
    int age1=p1.getAge();
    int age2=p2.getAge();
    if(age1<age2) return (-1);
      else if (age1==age2) return (0);
        else return +1;
  }//karşılaştırma1

  // ana
  public static void main(String[] arg){
    new sort2();
  }//ana
}//sınıf

Sıralama komutu şu şekilde oldu:

     // kişi tablosunu sıralama
    Arrays.sort(amis,
        new java.util.Comparator(){
          public int compare(Object o1, Object o2){
            return compare1(o1,o2);
        }//karşılaştırma
      }//sınıf
    );

sort yönteminin ikinci parametresi, Comparator arayüzünü uygulayan bir nesne olmalıdır. Burada new java.util.Comparator() ile böyle bir nesne oluşturuyoruz ve {….} işaretinden sonraki metin, nesnesini oluşturduğumuz sınıfı tanımlar. Buna isimsiz sınıf denir, çünkü bir adı yoktur. Comparator arayüzünü uygulaması gereken bu isimsiz sınıfta, söz konusu arayüzün compare yöntemini tanımlıyoruz. Bu yöntem, sort2 sınıfının compare1 yöntemini çağırmakla yetinir. Böylece önceki duruma geri dönülür.

sort2 sınıfı artık Comparator arayüzünü uygulamamaktadır. Dolayısıyla bu sınıfın tanımlaması şu şekilde olur:

public class sort2 {

Şimdi, aşağıdaki örnekte Arrays sınıfının binarySearch yöntemini test ediyoruz:

import java.util.*;

public class sort4 {

  // özel bir iç sınıf
  private class personne{
      // özellikler
    private String nom;
    private int age;

        // yapıcı
    public personne(String nom, int age){
      this.nom=nom; // kişinin adı
      this.age=age; // yaşı
    }

     // adı almayı
    public String getNom(){
      return nom;
    }

     // yaşı al
    public int getAge(){
      return age;
    }
     // kişinin kimliği
    public String toString(){
      return ("["+nom+","+age+"]");
    }
  }; // kişi sınıfı

   // oluşturucu
  public sort4() {
     // kişi tablosu
    personne[] amis=new personne[]{new personne("tintin",100),new personne("milou",80),
        new personne("tournesol",40)};

     // karşılaştırıcılar
    java.util.Comparator comparateur1=
        new java.util.Comparator(){
          public int compare(Object o1, Object o2){
            return compare1(o1,o2);
        }//karşılaştırma
      }//sınıf
      ;
    java.util.Comparator comparateur2=
        new java.util.Comparator(){
          public int compare(Object o1, Object o2){
            return compare2(o1,o2);
        }//karşılaştırma
      }//sınıflandırma
      ;          

     // kişi tablosunu sıralama
    Arrays.sort(amis,comparateur1);
    // doğrulama
    for(int i=0;i<3;i++)
      System.out.println(amis[i]);
    // arama
    cherche("milou",amis,comparateur2);
    cherche("xx",amis,comparateur2);
  }//oluşturucu

   // kişileri karşılaştıran işlev
  public int compare1(Object o1, Object o2){
    // sonuç olarak
     // -1, eğer o1 "o2'den küçükse"
     // o1 "o2'ye eş" ise 0
     // o1, o2'den "büyükse" +1
    personne p1=(personne)o1;
    personne p2=(personne)o2;
    int age1=p1.getAge();
    int age2=p2.getAge();
    if(age1<age2) return (-1);
      else if (age1==age2) return (0);
        else return +1;
  }//compare1

   // bir kişiyi bir isimle karşılaştıran işlev
  public int compare2(Object o1, Object o2){
    // o1 bir kişidir
     // o2 bir String'dir, bir kişinin nom2 adlı adı
     // şunu döndürmelidir
     // o1.nom "nom2'den küçükse" -1
     // o1.nom, nom2'ye "eşitse" 0
     //, o1.nom "nom2'den büyükse" +1
    personne p1=(personne)o1;
    String nom1=p1.getNom();
    String nom2=(String)o2;
    return nom1.compareTo(nom2);
  }//karşılaştırma2

    public void cherche(String ami,personne[] amis, Comparator comparateur){
       // arkadaşlar tablosunda arkadaş arar
    int position=Arrays.binarySearch(amis,ami,comparateur);
     // bulundu mu?
    if(position>=0)
        System.out.println(ami + " a " + amis[position].getAge() + " ans");
    else System.out.println(ami + " n'existe pas dans le tableau");
  }//arıyor

  // ana sayfa
  public static void main(String[] arg){
    new sort4();
  }//el
}//sınıf

Burada, önceki örneklerden biraz farklı bir yol izledik. sort ve binarySearch yöntemleri için gerekli olan iki Comparator nesnesi oluşturuldu ve comparateur1 ile comparateur2 değişkenlerine atandı.

     // karşılaştırıcılar
    java.util.Comparator comparateur1=
        new java.util.Comparator(){
          public int compare(Object o1, Object o2){
            return compare1(o1,o2);
        }//karşılaştır
      }//sınıf
      ;
    java.util.Comparator comparateur2=
        new java.util.Comparator(){
          public int compare(Object o1, Object o2){
            return compare2(o1,o2);
        }//karşılaştırma
      }//sınıf
      ;          

amis tablosunda ikili arama, sort4 oluşturucusunda iki kez yapılır:

     // arama
    cherche("milou",amis,comparateur2);
    cherche("xx",amis,comparateur2);

cherche yöntemi, binarySearch yöntemini çağırmak için ihtiyaç duyduğu tüm parametreleri alır:

    public void cherche(String ami,personne[] amis, Comparator comparateur){
       // arkadaşlar tablosunda arkadaş arama
    int position=Arrays.binarySearch(amis,ami,comparateur);
     // bulundu mu?
    if(position>=0)
        System.out.println(ami + " a " + amis[position].getAge() + " ans");
    else System.out.println(ami + " n'existe pas dans le tableau");
  }//arıyor

binarySearch yöntemi, comparateur2 karşılaştırıcıyla çalışır; bu karşılaştırıcı ise sort4 sınıfının compare2 yöntemini çağırır. rend yöntemi, aranan adın tabloda mevcutsa konumunu, yoksa <0 değerinde bir sayı döndürür. compare2 yöntemi, bir personne nesnesini String türündeki bir adla karşılaştırmak için kullanılır.

   // bir kişiyi bir isimle karşılaştıran işlev
  public int compare2(Object o1, Object o2){
    // o1 bir kişidir
     // o2 bir String'dir, bir kişinin nom2 adlı adı
     // şunu döndürmelidir
     // -1 ise o1.nom "nom2'den küçükse"
     // 0 ise o1.nom "eşittir" isim2
     // +1 eğer o1.nom "nom2'den büyükse"
    personne p1=(personne)o1;
    String nom1=p1.getNom();
    String nom2=(String)o2;
    return nom1.compareTo(nom2);
  }//karşılaştırma2

sort yönteminin aksine, binarySearch yöntemi iki adet personne nesnesi almaz, bunun yerine sırasıyla bir adet personne nesnesi ve bir adet String nesnesi alır. İlk parametre, amis dizisinin bir elemanıdır; ikincisi ise aranan kişinin adıdır.

4.7. Enumeration sınıfı

Enumeration bir arayüzdür, sınıf değildir. Aşağıdaki yöntemlere sahiptir:

public abstract boolean hasMoreElements()
enumerasyonun hala elemanları varsa true değerini döndürür
public abstract Object nextElement()
enumerasyonun bir sonraki elemanının referansını döndürür

Bir enum nasıl kullanılır? Genellikle şu şekilde:

    Enumeration e=…                // bir enumerasyon nesnesi alınır
    while(e.hasMoreElements()){
        // e.nextElement() öğesini kullanır
    }

İşte bir örnek:


// ithal edilen sınıflar
import java.util.*;

public class test1{

// ana program main - static - sınıf yöntemi

  public static void main(String arg[]){

// sınıf örneklerinin oluşturulması
    personne p=new personne("Jean","Dupont",30);
    enseignant en=new enseignant("Paula","Hanson",56,27);
    etudiant et=new etudiant("Chris","Garot",22,"19980405");
    System.out.println("p="+p.toString());
    System.out.println("en="+en.toString());
    System.out.println("et="+et.toString());

// polimorfizm
    personne p2=(personne)en;
    System.out.println("p2="+p2.toString());
    personne p3=(personne)et;
    System.out.println("p3="+p3.toString());

// bir vektör
    Vector V=new Vector();
    V.addElement(p);V.addElement(en);V.addElement(et);
    System.out.println("Taille du vecteur V = "+V.size());
    int i;
    for(i=0;i<V.size();i++){
      p2=(personne) V.elementAt(i);
      System.out.println("V["+i+"]="+p2.toString());
    }

// bir enum
    Enumeration E=V.elements();
    i=0;
    while(E.hasMoreElements()){
      p2=(personne) E.nextElement();
      System.out.println("V["+i+"]="+p2.toString());
      i++;
    }
   }// main sonu
}//sınıf sonu

Şu sonuçlar elde edilir:

p=personne(Jean,Dupont,30)
en=enseignant(personne(Paula,Hanson,56),27)
et=etudiant(personne(Chris,Garot,22),19980405)
p2=enseignant(personne(Paula,Hanson,56),27)
p3=etudiant(personne(Chris,Garot,22),19980405)
Taille du vecteur V = 3
V[0]=personne(Jean,Dupont,30)
V[1]=enseignant(personne(Paula,Hanson,56),27)
V[2]=etudiant(personne(Chris,Garot,22),19980405)
V[0]=personne(Jean,Dupont,30)
V[1]=enseignant(personne(Paula,Hanson,56),27)
V[2]=etudiant(personne(Chris,Garot,22),19980405)

4.8. Hashtable sınıfı

Hashtable sınıfı, bir sözlükün uygulanmasına olanak tanır. Bir sözlük, iki sütunlu bir tablo olarak düşünülebilir:

anahtar
değer
anahtar1
değer1
anahtar2
değer2
..
...

Anahtarlar benzersizdir, c.a.d. Yani iki anahtarın aynı olması mümkün değildir. Hashtable sınıfının başlıca yöntemleri ve özellikleri şunlardır:

public Hashtable()
yapıcı - boş bir sözlük oluşturur
public int size()
sözlükteki öğe sayısı - bir öğe, (anahtar, değer) çiftinden oluşur
public Object put(Object key, Object value)
(anahtar, değer) çiftini sözlüğe ekler
public Object get(Object key)
key anahtarına bağlı nesneyi alır; key anahtarı yoksa null nesnesini alır
public boolean containsKey(Object key)
key anahtarı sözlükte varsa true
public boolean contains(Object value)
value değeri sözlükte varsa true
public Enumeration keys()
sözlüğün anahtarlarını bir enum olarak döndürür
public Object remove(Object key)
(anahtar, değer) çiftini siler; burada anahtar=key
public String toString()
sözlüğü tanımlar

İşte bir örnek:


// ithal edilen sınıflar
import java.util.*;

public class test1{

// ana program main - static - sınıf yöntemi

  public static void main(String arg[]){

// sınıf örneklerinin oluşturulması
    personne p=new personne("Jean","Dupont",30);
    enseignant en=new enseignant("Paula","Hanson",56,27);
    etudiant et=new etudiant("Chris","Garot",22,"19980405");
    System.out.println("p="+p.toString());
    System.out.println("en="+en.toString());
    System.out.println("et="+et.toString());

// polimorfizm
    personne p2=(personne)en;
    System.out.println("p2="+p2.toString());
    personne p3=(personne)et;
    System.out.println("p3="+p3.toString());

// bir sözlük
    Hashtable H=new Hashtable();
    H.put("personne1",p);
    H.put("personne2",en);
    H.put("personne3",et);
    Enumeration E=H.keys();
    int i=0;
    String cle;
    while(E.hasMoreElements()){
      cle=(String) E.nextElement();
      p2=(personne) H.get(cle);
      System.out.println("clé "+i+"="+cle+" valeur="+p2.toString());
      i++;
    }
  }//main sonu
}//sınıf sonu

Elde edilen sonuçlar şunlardır:

p=personne(Jean,Dupont,30)
en=enseignant(personne(Paula,Hanson,56),27)
et=etudiant(personne(Chris,Garot,22),19980405)
p2=enseignant(personne(Paula,Hanson,56),27)
p3=etudiant(personne(Chris,Garot,22),19980405)
clé 0=personne3 valeur=etudiant(personne(Chris,Garot,22),19980405)
clé 1=personne2 valeur=enseignant(personne(Paula,Hanson,56),27)
clé 2=personne1 valeur=personne(Jean,Dupont,30)

4.9. Metin dosyaları

4.9.1. Yazma

Bir dosyaya yazmak için bir yazma akışına sahip olmak gerekir. Bunun için FileWriter sınıfı kullanılabilir. Sıkça kullanılan oluşturucular şunlardır:

FileWriter(String fileName)
fileName adlı dosyayı oluşturur - daha sonra bu dosyaya yazılabilir - aynı adlı bir dosya varsa üzerine yazılır
FileWriter(String fileName,
boolean append)
aynı işlem - aynı isimde bir dosya varsa, ekleme modunda açarak kullanılabilir (append=true)

FileWriter sınıfı, bir dosyaya yazmak için Writer sınıfından miras alınan bir dizi yöntem sunar. Bir metin dosyasına yazmak için, sık kullanılan oluşturucuları aşağıdaki gibi olan PrintWriter sınıfını kullanmak daha uygundur:

PrintWriter(Writer out)
Argüman, Writer veya c.a.d türündedir. Bir yazma akışı (dosyaya, ağa, …)
PrintWriter(Writer out, boolean autoflush)
Aynı şekilde. İkinci argüman, satırların tamponlanmasını yönetir. Değeri false olduğunda (varsayılan ayar), dosyaya yazılan satırlar bellekteki bir tampondan geçer. Tampon dolduğunda, dosya üzerine yazılır. Bu, disk erişimini iyileştirir. Bununla birlikte, özellikle ağa yazarken bu davranış bazen istenmeyen sonuçlara yol açabilir.

PrintWriter sınıfının kullanışlı yöntemleri şunlardır:

void print(Type T)
T verisini (String, int, …) yazar
void println(Type T)
aynı işlemi, satır sonu işaretiyle bitirerek yapar
void flush()
otomatik boşaltma modunda değilse tamponu boşaltır
void close()
yazma akışını kapatır

İşte bir metin dosyasına birkaç satır yazan bir program:

// ithalatlar
import java.io.*;

public class ecrire{
  public static void main(String[] arg){
    // dosyanın açılması
    PrintWriter fic=null;
    try{
      fic=new PrintWriter(new FileWriter("out"));
    } catch (Exception e){
      Erreur(e,1);
    }
     // dosyaya yazma
    try{
      fic.println("Jean,Dupont,27");
      fic.println("Pauline,Garcia,24");
      fic.println("Gilles,Dumond,56");
    } catch (Exception e){
      Erreur(e,3);
    }
     // dosyayı kapatma
    try{
      fic.close();
    } catch (Exception e){
      Erreur(e,2);
    }
  }// main sonu

  private static void Erreur(Exception e, int code){
    System.err.println("Erreur : "+e);
    System.exit(code);
  }//Hata
}//sınıf

Çalıştırma sonucunda elde edilen out dosyası şöyledir:

Jean,Dupont,27
Pauline,Garcia,24
Gilles,Dumond,56

4.9.2. Okuma

Bir dosyanın içeriğini okumak için, dosyaya ait bir okuma akışına sahip olmak gerekir. Bunun için FileReader sınıfı ve aşağıdaki oluşturucu kullanılabilir:

FileReader(String dosyaAdı)
belirtilen dosyadan bir okuma akışı açar. İşlem başarısız olursa bir istisna oluşturur.

FileReader sınıfı, bir dosyadan okuma yapmak için Reader sınıfından miras alınan bir dizi yönteme sahiptir. Bir metin dosyasındaki satırları okumak için, BufferedReader sınıfını aşağıdaki oluşturucu ile kullanmak tercih edilir:

BufferedReader(Reader in)
bir in giriş akışından tamponlu bir okuma akışı açar. Bu Reader türündeki akış, klavyeden, bir dosyadan, ağdan vb. gelebilir.

BufferedReader sınıfının kullanışlı yöntemleri şunlardır:

int read()
bir karakter okur
String readLine()
bir satır metin okur
int read(char[] buffer, int offset, int taille)
dosyadan taille karakter okur ve bunları buffer dizisine offset konumundan itibaren yerleştirir.
void close()
okuma akışını kapatır

İşte daha önce oluşturulan dosyanın içeriğini okuyan bir program:

// ithal edilen sınıflar
import java.util.*;
import java.io.*;

public class lire{
  public static void main(String[] arg){
    personne p=null;
     // dosya açılıyor
    BufferedReader IN=null;
    try{
      IN=new BufferedReader(new FileReader("out"));
    } catch (Exception e){
      Erreur(e,1);
    }
     // veriler
    String ligne=null;
    String[] champs=null;
    String prenom=null;
    String nom=null;
    int age=0;

    // olası hataların yönetimi
    try{
      while((ligne=IN.readLine())!=null){
        champs=ligne.split(",");
        prenom=champs[0];
        nom=champs[1];
        age=Integer.parseInt(champs[2]);
        System.out.println(""+new personne(prenom,nom,age));
      }// while döngüsünün sonu
    } catch (Exception e){
      Erreur(e,2);
    }

     // dosya kapatma
    try{
      IN.close();
    } catch (Exception e){
      Erreur(e,3);
    }
  }// main sonu

   // Hata
  public static void Erreur(Exception e, int code){
    System.err.println("Erreur : "+e);
    System.exit(code);
  }

}// sınıf sonu

Programın çalıştırılması sonucunda şu sonuçlar elde edilir:

personne(Jean,Dupont,27)
personne(Pauline,Garcia,24)
personne(Gilles,Dumond,56)

4.9.3. Bir kişi nesnesinin kaydedilmesi

Az önce gördüklerimizi uygulayarak, personne sınıfına bir kişinin özniteliklerini bir dosyaya kaydetmeye yarayan bir yöntem ekliyoruz. personne sınıfının tanımına sauveAttributs yöntemini ekliyoruz:


    // ------------------------------
  // metin dosyasına kaydet
    // ------------------------------
  public void sauveAttributs(PrintWriter P){
    P.println(""+this);
  }

personne sınıfının tanımlanmasından önce, java.io paketini içe aktarmayı unutmayalım:

import java.io.*;

sauveAttributs yöntemi, yazması gereken PrintWriter akışını tek parametre olarak alır. Bir test programı şu şekilde olabilir:

// içe aktarma
import java.io.*;
// kişi içe aktarma;

public class sauver{
  public static void main(String[] arg){
    // dosya açma
    PrintWriter fic=null;
    try{
      fic=new PrintWriter(new FileWriter("out"));
    } catch (Exception e){
      Erreur(e,1);
    }
     // dosyaya yazma
    try{
      new personne("Jean","Dupont",27).sauveAttributs(fic);
      new personne("Pauline","Garcia",24).sauveAttributs(fic);
      new personne("Gilles","Dumond",56).sauveAttributs(fic);
    } catch (Exception e){
      Erreur(e,3);
    }
     // dosyayı kapatma
    try{
      fic.close();
    } catch (Exception e){
      Erreur(e,2);
    }
  }// main sonu

   // Hata
  private static void Erreur(Exception e, int code){
    System.err.println("Erreur : "+e);
    System.exit(code);
  }//Hata
}//sınıf

Bu programı derleyip çalıştıralım:

E:\data\serge\JAVA\poly juin 2002\Chapitre 3\sauveAttributs>javac sauver.java

E:\data\serge\JAVA\poly juin 2002\Chapitre 3\sauveAttributs>dir
10/06/2002  10:52                1 352 personne.class
10/06/2002  10:53                  842 sauver.java
10/06/2002  10:53                1 258 sauver.class

E:\data\serge\JAVA\poly juin 2002\Chapitre 3\sauveAttributs>java sauver

E:\data\serge\JAVA\poly juin 2002\Chapitre 3\sauveAttributs>dir
10/06/2002  10:52                1 352 personne.class
10/06/2002  10:53                  842 sauver.java
10/06/2002  10:53                1 258 sauver.class
10/06/2002  10:53                   83 out

E:\data\serge\JAVA\poly juin 2002\Chapitre 3\sauveAttributs>more out
personne(Jean,Dupont,27)
personne(Pauline,Garcia,24)
personne(Gilles,Dumond,56)

4.10. İkili dosyalar

4.10.1. RandomAccessFile sınıfı

RandomAccessFile sınıfı, özellikle C/C++ dilinde bilinen sabit yapılı ikili dosyaları yönetmeye olanak tanır. İşte bazı yararlı yöntemler ve oluşturucular:

RandomAccessFile(String dosyaAdı, String mod)
yapıcı - belirtilen dosyayı belirtilen modda açar. Modun değerleri şunlardır:
r: okuma modunda açma
rw: okuma ve yazma modunda açma
void writeTTT(TTT değer)
değer'i dosyaya yazar. TTT, değer'in türünü temsil eder. Değer'in bellekteki temsili olduğu gibi dosyaya yazılır. Böylece writeBoolean, writeByte, writeInt, writeDouble, writeLong, writeFloat,... gibi değerler bulunur. Bir dize yazmak için writeBytes(String dize) kullanılır.
TTT readTTT()
TTT türünde bir değeri okur ve döndürür. Böylece readBoolean, readByte, readInt, readDouble, readLong, readFloat,... gibi değerler bulunur. read() yöntemi bir bayt okur.
long length()
dosya boyutu (bayt cinsinden)
long getFilePointer()
dosya işaretçisinin geçerli konumu
void seek(long pos)
dosya imlecini pos baytına konumlandırır

4.10.2. article sınıfı

Aşağıdaki tüm örneklerde şu article sınıfı kullanılacaktır:

     // makale yapısı
    private static class article{
         // yapı tanımlanıyor
        public String code;
        public String nom;
        public double prix;
        public int stockActuel;
        public int stockMinimum;
  }//ürün sınıfı

Yukarıdaki java sınıfı article, C dilindeki aşağıdaki article yapısına eşdeğer olacaktır

struct article{
    char code[4];
    char nom[20];
    double prix;
    int stockActuel;
    int stockMinimum;
}//yapı

Böylece kodu 4 karakterle, adı ise 20 karakterle sınırlayacağız.

4.10.3. Bir kayıt yazma

Aşağıdaki program, "data" adlı bir dosyaya bir giriş yazar:

// ithal edilen sınıflar
import java.io.*;

public class test1{

// bir yapının (C dilinde olduğu gibi) ikili bir dosyaya yazılmasını test eder

     // makale yapısı
    private static class article{
         // yapıyı tanımlıyoruz
        public String code;
        public String nom;
        public double prix;
        public int stockActuel;
        public int stockMinimum;
  }//"article" sınıfı

    public static void main(String arg[]){

         // makalelerin depolanacağı ikili dosya tanımlanıyor
        RandomAccessFile fic=null;

         // bir makale tanımlanır
        article art=new article();
        art.code="a100";
        art.nom="velo";
        art.prix=1000.80;
        art.stockActuel=100;
        art.stockMinimum=10;

         // dosya tanımlanıyor
        try{
                fic=new RandomAccessFile("data","rw");
        } catch (Exception E){
                erreur("Impossible d'ouvrir le fichier data",1);
        }//try-catch

        // yazılır
        try{
            ecrire(fic,art);
        } catch (IOException E){
                erreur("Erreur lors de l'écriture de l'enregistrement",2);
        }//try-catch

        // bitti
        try{
            fic.close();
        } catch (Exception E){
            erreur("Impossible de fermer le fichier data",2);
        }//try-catch
  }//main

   // yazma yöntemi
  public static void ecrire(RandomAccessFile fic, article art) throws IOException{
        // kod
      fic.writeBytes(art.code);
       // 20 karakterle sınırlı ad
      art.nom=art.nom.trim();
      int l=art.nom.length();
      int nbBlancs=20-l;
      if(nbBlancs>0){
          String blancs="";
          for(int i=0;i<nbBlancs;i++) blancs+=" ";
          art.nom+=blancs;
      } else art.nom=art.nom.substring(0,20);
      fic.writeBytes(art.nom);
       // fiyat
      fic.writeDouble(art.prix);
       // stoklar
      fic.writeInt(art.stockActuel);
      fic.writeInt(art.stockMinimum);
  }// yazma sonu

   // ------------------------hata
  public static void erreur(String msg, int exitCode){
          System.err.println(msg);
          System.exit(exitCode);
  }// hata sonu
}// sınıf sonu

Aşağıdaki program, işlemin doğru bir şekilde gerçekleştirildiğini doğrulamamızı sağlar.

4.10.4. Bir kaydı okumak

// ithal edilen sınıflar
import java.io.*;

public class test2{

// bir yapının (C dilinde olduğu gibi) ikili bir dosyaya yazılmasını test eder

     // article yapısı
    private static class article{
         // yapıyı tanımlıyoruz
        public String code;
        public String nom;
        public double prix;
        public int stockActuel;
        public int stockMinimum;
  }//"article" sınıfı

    public static void main(String arg[]){

         // makalelerin depolanacağı ikili dosya tanımlanıyor
        RandomAccessFile fic=null;

       // dosyayı okuma modunda açıyoruz
      try{
          fic=new RandomAccessFile("data","r");
      } catch (Exception E){
          erreur("Impossible d'ouvrir le fichier data",1);
      }//try-catch

       // dosyadaki tek ürünü okunur
    article art=new article();
      try{
          lire(fic,art);
      } catch (IOException E){
          erreur("Erreur lors de la lecture de l'enregistrement",2);
      }//try-catch

       // Okunan kaydı görüntülüyoruz
      affiche(art);

       // işlem tamamlandı
      try{
          fic.close();
      } catch (Exception E){
          erreur("Impossible de fermer le fichier data",2);
      }//try-catch
  }// elle sonlandırma

    // okuma yöntemi
    public static void lire(RandomAccessFile fic, article art) throws IOException{
       // kod okuma
        art.code="";
        for(int i=0;i<4;i++) art.code+=(char)fic.readByte();
    // ad
        art.nom="";
        for(int i=0;i<20;i++) art.nom+=(char)fic.readByte();
        art.nom=art.nom.trim();
    // fiyat
        art.prix=fic.readDouble();
    // stoklar
        art.stockActuel=fic.readInt();
        art.stockMinimum=fic.readInt();
    }// yazma sonu

     // ---------------------görüntüle
    public static void affiche(article art){
        System.out.println("code : "+art.code);
        System.out.println("nom : "+art.nom);
        System.out.println("prix : "+art.prix);
        System.out.println("Stock actuel : "+art.stockActuel);
        System.out.println("Stock minimum : "+art.stockMinimum);
    }// görüntüleme sonu

     // ------------------------hata
    public static void erreur(String msg, int exitCode){
                System.err.println(msg);
                System.exit(exitCode);
    }// hata sonu
}// sınıf sonu

Çalıştırma sonuçları şöyledir:

E:\data\serge\JAVA\random>java test2
code : a100
nom : velo
prix : 1000.8
Stock actuel : 100
Stock minimum : 10    

Yazma programı tarafından yazılan kayıt başarıyla geri alınmıştır.

4.10.5. Metin --> ikili dönüştürme

Aşağıdaki program, bir kayıt yazma programının bir uzantısıdır. Şimdi, data.bin adlı bir ikili dosyaya birden fazla kayıt yazıyoruz. Veriler, aşağıdaki data.txt dosyasından alınmaktadır:

E:\data\serge\JAVA\random>more data.txt
a100:velo:1000:100:10
b100:pompe:65:6:2
c100:arc:867:10:5
d100:fleches - lot de 6:450:12:8
e100:jouet:10:2:3
// ithal edilen sınıflar
import java.io.*;
import java.util.*;

public class test3{

// metin dosyası --> ikili dosya

     // makale yapısı
    private static class article{
         // yapı tanımlanıyor
        public String code;
        public String nom;
        public double prix;
        public int stockActuel;
        public int stockMinimum;
  }//ürün sınıfı

    public static void main(String arg[]){

         // makalelerin depolanacağı ikili dosya tanımlanıyor
        RandomAccessFile dataBin=null;
        try{
                dataBin=new RandomAccessFile("data.bin","rw");
        } catch (Exception E){
                erreur("Impossible d'ouvrir le fichier data.bin",1);
        }

         // veriler bir metin dosyasından alınır
    BufferedReader dataTxt=null;
        try{
            dataTxt=new BufferedReader(new FileReader("data.txt"));
        } catch (IOException E){
            erreur("Impossible d'ouvrir le fichier data.txt",2);
        }

       // .txt dosyası --> .bin dosyası
      String ligne=null;
      String[] champs=null;
      int numLigne=0;
      String champ=null;
    article art=new article();    // oluşturulacak ürün
      try{
          while((ligne=dataTxt.readLine())!=null){
          // bir satır +
              numLigne++;
         // alanlara ayrıştırma
        champs=ligne.split(":");
         // 5 alan gereklidir
              if(champs.length!=5)
                  erreur("Ligne "+numLigne+" erronée dans data.txt",3);
         //kod
              art.code=champs[0];
              if(art.code.length()!=4) 
            erreur("Code erroné en ligne "+numLigne+" du fichier data.txt",12);
         // soyadı, adı
              art.nom=champs[1];
         // fiyat
              try{
                  art.prix=Double.parseDouble(champs[2]);
              } catch (Exception E){
                  erreur("Prix erroné en ligne "+numLigne+" du fichier data.txt",4);
              }
        // mevcut stok
              try{
                  art.stockActuel=Integer.parseInt(champs[3]);
              } catch (Exception E){
                  erreur("Stock actuel erroné en ligne "+ numLigne + " du fichier data.txt",5);
              }
        // mevcut stok
              try{
                  art.stockActuel=Integer.parseInt(champs[3]);
              } catch (Exception E){
                  erreur("Stock actuel erroné en ligne "+ numLigne + " du fichier data.txt",5);
              }             
               // kayıt yazılır
              try{
                  ecrire(dataBin,art);
              } catch (IOException E){
                  erreur("Erreur lors de l'écriture de l'enregistrement "+numLigne,7);
              }
               // bir sonraki satıra geçiliyor
          }// while döngüsü sonu
      } catch (IOException E){
          erreur("Erreur lors de la lecture du fichier data.txt après la ligne "+numLigne,8);
      }        
        // işlem tamamlandı
      try{
                  dataBin.close();
      } catch (Exception E){
                  erreur("Impossible de fermer le fichier data.bin",10);
      }
      try{
                  dataTxt.close();
      } catch (Exception E){
                  erreur("Impossible de fermer le fichier data.txt",11);
      }
  }// main sonu

   // yazma yöntemi
  public static void ecrire(RandomAccessFile fic, article art) throws IOException{
        // kod
      fic.writeBytes(art.code);
       // 20 karakterle sınırlı ad
      art.nom=art.nom.trim();
      int l=art.nom.length();
      int nbBlancs=20-l;
      if(nbBlancs>0){
          String blancs="";
          for(int i=0;i<nbBlancs;i++) blancs+=" ";
          art.nom+=blancs;
      } else art.nom=art.nom.substring(0,20);
      fic.writeBytes(art.nom);
       // fiyat
      fic.writeDouble(art.prix);
       // stoklar
      fic.writeInt(art.stockActuel);
      fic.writeInt(art.stockMinimum);
  }// yazma sonu

     // ------------------------hata
    public static void erreur(String msg, int exitCode){
                System.err.println(msg);
                System.exit(exitCode);
    }// hata sonu

}// sınıf sonu

Aşağıdaki program, bu programın doğru çalıştığını doğrulamaya yarar.

4.10.6. İkili --> metin dönüştürme

Aşağıdaki program, daha önce oluşturulan data.bin adlı ikili dosyanın içeriğini okur ve bu içeriği data.text adlı metin dosyasına aktarır. Her şey yolunda giderse, data.text dosyası, orijinal data.txt dosyasıyla aynı olmalıdır.

// ithal edilen sınıflar
import java.io.*;
import java.util.*;

public class test5{

// metin dosyası --> ikili dosya

     // makale yapısı
    private static class article{
         // yapı tanımlanıyor
        public String code;
        public String nom;
        public double prix;
        public int stockActuel;
        public int stockMinimum;
  }//ürün sınıfı

     // ana fonksiyon
    public static void main(String arg[]){

         // makalelerin depolanacağı ikili dosya tanımlanıyor
        RandomAccessFile dataBin=null;
        try{
                dataBin=new RandomAccessFile("data.bin","r");
        } catch (Exception E){
                erreur("Impossible d'ouvrir le fichier data.bin en lecture",1);
        }

         // veriler bir metin dosyasına yazılır
    PrintWriter dataTxt=null;
        try{
            dataTxt=new PrintWriter(new FileWriter("data.text"));
        } catch (IOException E){
            erreur("Impossible d'ouvrir le fichier data.text en écriture",2);
        }

      // .bin dosyası --> .text dosyası
    article art=new article();    // oluşturulacak ürün

       // ikili dosya işlenir
      int numRecord=0;
      long l=0;    // dosya boyutu
      try{
          l=dataBin.length();
      } catch (IOException e){
          erreur("Erreur lors du calcul de la longueur du fichier data.bin",2);
      }
      long pos=0;    // dosyadaki geçerli konum
      try{
          pos=dataBin.getFilePointer();
      } catch (IOException e){
          erreur("Erreur lors de la lecture de la position courante dans data.bin",2);
      }

     // dosyanın sonuna ulaşılana kadar
        while(pos<l){
            // geçerli kaydı oku ve işleme al
            numRecord++;
            try{
                lire(dataBin,art);
            } catch (Exception e){
                erreur("Erreur lors de la lecture de l'enregistrement "+numRecord,2);
            }
            affiche(art);

             // ilgili metin satırını dataTxt dosyasına yazma
         dataTxt.println(art.code.trim()+":"+art.nom.trim()+":"+art.prix+":"+art.stockActuel+":"+art.stockMinimum);

             // devam edelim mi?
            try{
                pos=dataBin.getFilePointer();
            } catch (IOException e){
                erreur("Erreur lors de la lecture de la position courante dans data.bin",2);
            }
        }// while döngüsünün sonu

       // bitti
      try{
                  dataBin.close();
      } catch (Exception E){
                  erreur("Impossible de fermer le fichier data.bin",2);
      }

      try{
          dataTxt.close();
      } catch (Exception E){
                  erreur("Impossible de fermer le fichier data.text",2);
      }

  }// main sonu

     // okuma yöntemi
    public static void lire(RandomAccessFile fic, article art) throws IOException{
      // kod okuma
        art.code="";
        for(int i=0;i<4;i++) art.code+=(char)fic.readByte();
    // ad
        art.nom="";
        for(int i=0;i<20;i++) art.nom+=(char)fic.readByte();
        art.nom=art.nom.trim();
    // fiyat
        art.prix=fic.readDouble();
    // stoklar
        art.stockActuel=fic.readInt();
        art.stockMinimum=fic.readInt();
    }// yazma sonu

     // ---------------------görüntüle
    public static void affiche(article art){
        System.out.println("code : "+art.code);
        System.out.println("nom : "+art.nom);
        System.out.println("prix : "+art.prix);
        System.out.println("Stock actuel : "+art.stockActuel);
        System.out.println("Stock minimum : "+art.stockMinimum);
    }// ilan sonu

     // ------------------------hata
    public static void erreur(String msg, int exitCode){
                System.err.println(msg);
                System.exit(exitCode);
    }// hata sonu
}// sınıf sonu

İşte bir çalışma örneği:

E:\data\serge\JAVA\random>java test5
code : a100
nom : velo
prix : 1000.0
Stock actuel : 100
Stock minimum : 0
code : b100
nom : pompe
prix : 65.0
Stock actuel : 6
Stock minimum : 0
code : c100
nom : arc
prix : 867.0
Stock actuel : 10
Stock minimum : 0
code : d100
nom : fleches - lot de 6
prix : 450.0
Stock actuel : 12
Stock minimum : 0
code : e100
nom : jouet
prix : 10.0
Stock actuel : 2
Stock minimum : 0

E:\data\serge\JAVA\random>more data.text
a100:velo:1000.0:100:0
b100:pompe:65.0:6:0
c100:arc:867.0:10:0
d100:fleches - lot de 6:450.0:12:0
e100:jouet:10.0:2:0

4.10.7. Kayıtlara doğrudan erişim

Bu son program, bir ikili dosyanın kayıtlarına doğrudan erişme olanağını göstermektedir. Programa parametre olarak verilen data.bin dosyasının kaydını görüntüler; 1 numaralı kayıt, 1 numaralıdır.

// ithal edilen sınıflar
import java.io.*;
import java.util.*;

public class test6{

// metin dosyası --> ikili dosya

     // makale yapısı
    private static class article{
         // yapı tanımlanıyor
        public String code;
        public String nom;
        public double prix;
        public int stockActuel;
        public int stockMinimum;
  }//ürün sınıfı

     // ana işlev
    public static void main(String[] args){

       // argümanları kontrol ediyoruz
      int nbArguments=args.length;
      String syntaxe="syntaxe : pg numéro_de_fiche";
      if(nbArguments!=1)
          erreur(syntaxe,20);
     // kayıt numarası kontrolü
      int numRecord=0;
      try{
          numRecord=Integer.parseInt(args[0]);
      } catch(Exception e){
          erreur(syntaxe+"\nNuméro de fiche incorrect",21);
      }

       // ikili dosyayı okuma modunda açılıyor
    RandomAccessFile dataBin=null;
      try{
          dataBin=new RandomAccessFile("data.bin","r");
      } catch (Exception E){
          erreur("Impossible d'ouvrir le fichier data.bin en lecture",1);
      }

       // istenen kayda konumlanılıyor
      try{
          dataBin.seek((numRecord-1)*40);
      } catch (Exception e){
          erreur("La fiche "+numRecord+" n'existe pas",23);
      }

       // dosya okunuyor
    article art=new article();
      try{
          lire(dataBin,art);
      } catch (Exception e){
          erreur("Erreur lors de la lecture de l'enregistrement "+numRecord,2);
      }

       // dosya görüntülenir
      affiche(art);

       // işlem tamamlandı
      try{
          dataBin.close();
      } catch (Exception E){
          erreur("Impossible de fermer le fichier data.bin",2);
      }//try-catch

  }// main sonu

    // okuma yöntemi
    public static void lire(RandomAccessFile fic, article art) throws IOException{
       // kod okuma
        art.code="";
        for(int i=0;i<4;i++) art.code+=(char)fic.readByte();
    // ad
        art.nom="";
        for(int i=0;i<20;i++) art.nom+=(char)fic.readByte();
        art.nom=art.nom.trim();
    // fiyat
        art.prix=fic.readDouble();
    // stoklar
        art.stockActuel=fic.readInt();
        art.stockMinimum=fic.readInt();
    }// yazma sonu

     // ---------------------görüntüle
    public static void affiche(article art){
        System.out.println("code : "+art.code);
        System.out.println("nom : "+art.nom);
        System.out.println("prix : "+art.prix);
        System.out.println("Stock actuel : "+art.stockActuel);
        System.out.println("Stock minimum : "+art.stockMinimum);
    }// ilan sonu

     // ------------------------hata
    public static void erreur(String msg, int exitCode){
                System.err.println(msg);
                System.exit(exitCode);
    }// hata sonu
}// sınıf sonu

İşte bazı çalışma örnekleri:

E:\data\serge\JAVA\random>java test6 2
code : b100
nom : pompe
prix : 65.0
Stock actuel : 6
Stock minimum : 0

E:\data\serge\JAVA\random>java.bat test6 20
Erreur lors de la lecture de l'enregistrement 20

4.11. Düzenli ifadeleri kullanma

4.11.1. java.util.regex paketi

java.util.regex paketi, düzenli ifadelerin kullanımına olanak tanır. Düzenli ifadeler, bir karakter dizisinin biçimini test etmeye yarar. Böylece, bir tarihi temsil eden karakter dizisinin gerçekten gg/aa/yy biçiminde olup olmadığını kontrol edebiliriz. Bunun için bir şablon kullanılır ve karakter dizisi bu şablonla karşılaştırılır. Dolayısıyla bu örnekte, j, m ve a rakamlar olmalıdır. Geçerli bir tarih biçiminin şablonu "\d\d/\d\d/\d\d" şeklindedir; burada \d sembolü bir rakamı ifade eder. Şablonda kullanılabilecek semboller şunlardır (Microsoft belgeleri):

Karakter
Açıklama
\
Aşağıdaki karakteri özel karakter veya sabit karakter olarak işaretler. Örneğin, "n" karakteri "n" karakterine karşılık gelir. "\n" karakteri yeni satır karakterine karşılık gelir. "\\" dizisi "\" karakterine karşılık gelirken, "\(" karakteri "(" karakterine karşılık gelir.
^
Girişin başlangıcına karşılık gelir.
$
Girişin sonuna karşılık gelir.
*
Önceki karakteri sıfır kez veya birden fazla kez ifade eder. Dolayısıyla, "zo*" hem "z" hem de "zoo" anlamına gelir.
+
Önceki karakteri bir veya daha fazla kez eşleştirir. Dolayısıyla, "zo+" "zoo" ile eşleşir, ancak "z" ile eşleşmez.
?
Önceki karakterle sıfır veya bir kez eşleşir. Örneğin, "a?ve?" "lever" kelimesindeki "ve" ile eşleşir.
.
Satır başı karakteri hariç, herhangi bir tek karakterle eşleşir.
(örnek)
modèle'i arar ve eşleşmeyi kaydeder. Eşleşen alt dize, elde edilen Matches koleksiyonundan Item [0]...[n] kullanılarak çıkarılabilir. Parantez ( ) içindeki karakterlerle eşleşmeleri bulmak için "\(" veya "\)" kullanın.
x|y
x veya y ile eşleşir. Örneğin, "z|foot" correspond à "z" ou à "foot". "(z|f)oo" "zoo" veya "foo" ile eşleşir.
{n}
n, negatif olmayan bir tamsayıdır. Tam olarak n çarpı karakter değerine karşılık gelir. Örneğin, "o{2}", "Bob," içindeki "o" harfine değil, "fooooot" içindeki ilk iki "o" harfine karşılık gelir.
{n,}
n, negatif olmayan bir tamsayıdır. Karakterin en az n katına karşılık gelir. Örneğin, "o{2,}" "Bob" kelimesindeki "o" harfine değil, "fooooot" kelimesindeki tüm "o" harflerine karşılık gelir. "o{1,}" "o+" ile eşdeğerdir ve "o{0,}" "o*" ile eşdeğerdir.
{n,m}
m ve n, negatif olmayan tamsayılardır. Karakterin en az n ve en fazla m kez tekrarlandığı durumlara karşılık gelir. Örneğin, "o{1,3}", "foooooot" kelimesindeki ilk üç "o" karakterine karşılık gelir ve "o{0,1}", "o?" ile eşdeğerdir.
[xyz]
Karakter kümesi. Belirtilen karakterlerden birine karşılık gelir. Örneğin, "[abc]", "plat" kelimesindeki "a" harfine karşılık gelir.
[^xyz]
Negatif karakter kümesi. Belirtilmeyen tüm karakterlere karşılık gelir. Örneğin, "[^abc]", "plat" kelimesindeki "p" harfine karşılık gelir.
[a-z]
Karakter aralığı. Belirtilen dizideki tüm karakterlere karşılık gelir. Örneğin, "[a-z]", "a" ile "z" arasındaki tüm küçük harf karakterlerine karşılık gelir.
[^m-z]
Negatif karakter aralığı. Belirtilen dizide bulunmayan tüm karakterlere karşılık gelir. Örneğin, "[^m-z]", "m" ile "z" arasında bulunmayan tüm karakterlere karşılık gelir.
\b
Bir kelimeyi temsil eden sınırla, başka bir deyişle bir kelime ile boşluk arasındaki konuma karşılık gelir. Örneğin, "er\b", "lever" kelimesindeki "er"e karşılık gelir, ancak "verbe" kelimesindeki "er"e karşılık gelmez.
\B
Bir kelimeyi temsil etmeyen bir sınırla eşleşir. "en*t\B", "bien entendu" kelimesindeki "ent" ile eşleşir.
\d
Bir rakamı temsil eden bir karaktere karşılık gelir. [0-9] ile eşdeğerdir.
\D
Rakam olmayan bir karaktere karşılık gelir. [^0-9] ile eşdeğerdir.
\f
Sayfa sonu karakterine karşılık gelir.
\n
Satır sonu karakterine karşılık gelir.
\r
Satır başı karakterine karşılık gelir.
\s
Boşluk, sekme, sayfa sonu vb. dahil olmak üzere tüm boşluk karakterlerine karşılık gelir. "[ \f\n\r\t\v]" ile eşdeğerdir.
\S
Beyaz olmayan tüm boşluk karakterlerine karşılık gelir. "[^ \f\n\r\t\v]" ile eşdeğerdir.
\t
Bir sekme karakterine karşılık gelir.
\v
Dikey sekme karakterine karşılık gelir.
\w
Bir kelimeyi temsil eden ve alt çizgi içeren herhangi bir karaktere karşılık gelir. "[A-Za-z0-9_]" ile eşdeğerdir.
\W
Bir kelimeyi temsil etmeyen herhangi bir karaktere karşılık gelir. "[^A-Za-z0-9_]" ile eşdeğerdir.
\num
num’e karşılık gelir; burada num pozitif bir tamsayıdır. Kaydedilmiş eşleşmelere atıfta bulunur. Örneğin, "(.)\1" iki ardışık aynı karaktere karşılık gelir.
\n
n'e karşılık gelir; burada n sekizlik bir kaçış değeridir. Sekizlik kaçış değerleri 1, 2 veya 3 basamaklı olmalıdır. Örneğin, "\11" ve "\011" her ikisi de bir sekme karakterine karşılık gelir. "\0011", "\001" ve "1"e eşittir. Sekizlik kaçış değerleri 256'yı aşmamalıdır. Aşılması durumunda, ifadede yalnızca ilk iki rakam dikkate alınır. ASCII kodlarının düzenli ifadelerde kullanılmasına olanak tanır.
\xn
n'e karşılık gelir; burada n onaltılık bir kaçış değeridir. Onaltılık kaçış değerleri mutlaka iki basamaklı olmalıdır. Örneğin, "\x41" "A" harfine karşılık gelir. "\x041" ise "\x04" ve "1" değerlerinin birleşimine eşittir. ASCII kodlarının düzenli ifadelerde kullanılmasına izin verir.

Bir şablondaki öğe, 1 veya daha fazla kopya halinde bulunabilir. 1 rakamı temsil eden \d sembolüyle ilgili birkaç örneği ele alalım:

şablon
anlam
\d
bir rakam
\d?
0 veya 1 rakam
\d*
0 veya daha fazla rakam
\d+
1 veya daha fazla rakam
\d{2}
2 rakam
\d{3,}
en az 3 rakam
\d{5,7}
5 ile 7 arasında rakam

Şimdi, bir karakter dizisi için beklenen biçimi tanımlayabilen bir model düşünelim:

aranan dize
model
gg/aa/yy formatında bir tarih
\d{2}/\d{2}/\d{2}
hh:mm:ss biçiminde bir saat
\d{2}:\d{2}:\d{2}
işaretsiz bir tamsayı
\d+
boş olabilir bir boşluk dizisi
\s*
önünde veya arkasında boşluk bulunabilen işaretsiz bir tamsayı
\s*\d+\s*
önünde veya arkasında boşluklar bulunabilen, işaretli veya işaretsiz bir tamsayı
\s*[+|-]?\s*\d+\s*
önünde veya arkasında boşluk bulunabilen işaretsiz bir gerçek sayı
\s*\d+(.\d*)?\s*
işareti olan veya olmayan bir gerçek sayı; başında veya sonunda boşluk olabilir
\s*[+|]?\s*\d+(.\d*)?\s*
"juste" kelimesini içeren bir dize
\bjuste\b
  

Dizgide kalıbın nerede aranacağını belirtebiliriz:

desen
anlam
^örnek
model, dizginin başında yer alır
model$
şablon dizgiyi sonlandırır
^desen$
şablon dizgiyi başlatır ve bitirir
desen
desen, dizgenin başından başlayarak her yerinde aranır.
aranan dize
desen
ünlem işaretiyle biten bir dize
!$
nokta ile biten bir dize
\.$
// dizisiyle başlayan bir dize
^//
yalnızca bir kelimeden oluşan ve isteğe bağlı olarak öncesinde veya sonrasında boşluklar bulunan bir dize
^\s*\w+\s*$
önünde veya arkasında boşluk olabilecek iki kelimeden oluşan bir dize
^\s*\w+\s*\w+\s*$
"secret" kelimesini içeren bir dize
\bsecret\b

Bir şablonun alt kümeleri "çıkarılabilir". Böylece, bir dizgenin belirli bir şablona uyup uymadığını kontrol etmekle kalmaz, aynı zamanda bu dizgede parantezlerle çevrelenmiş şablonun alt kümelerine karşılık gelen öğeleri de çıkarabiliriz. Örneğin, gg/aa/yyyy tarihini içeren bir dizgiyi analiz ediyorsak ve bu tarihin gg, aa, yyyy öğelerini de ayıklamak istiyorsak, (\d\d)/(\d\d)/(\d\d) kalıbını kullanırız.

4.11.2. Bir dizgenin belirli bir şablona uyup uymadığını kontrol etme

Pattern sınıfı, bir dizgenin belirli bir şablona uyup uymadığını kontrol etmemizi sağlar. Bunun için statik yöntem kullanılır

boolean Matches(String modèle, String chaine)

şu şekilde: modèle: doğrulanacak şablon, chaine: şablonla karşılaştırılacak dize. Dize şablona uyuyorsa sonuç true boole değeri olur, aksi takdirde false olur.

İşte bir örnek:

import java.io.*;
import java.util.regex.*;

// düzenli ifadelerin yönetimi
public class regex1 {
  public static void main(String[] args){
    // bir düzenli ifade şablonu
    String modèle1="^\\s*\\d+\\s*$";
    // bir örneği şablonla karşılaştırma
    String exemplaire1="  123  ";
    if (Pattern.matches(modèle1,exemplaire1)){
      affiche("["+exemplaire1 + "] correspond au modèle ["+modèle1+"]");
    }else{
      affiche("["+exemplaire1 + "] ne correspond pas au modèle ["+modèle1+"]");
    }//if
    String exemplaire2="  123a  ";
    if (Pattern.matches(modèle1,exemplaire2)){
      affiche("["+exemplaire2 + "] correspond au modèle ["+modèle1+"]");
    }else{
      affiche("["+exemplaire2 + "] ne correspond pas au modèle ["+modèle1+"]");
    }//if
  }//ana işlev

  public static void affiche(String msg){
    System.out.println(msg);
  }//görüntüle
}//sınıf

ve yürütme sonuçları:

[  123  ] correspond au modèle [^\s*\d+\s*$]
[  123a  ] ne correspond pas au modèle [^\s*\d+\s*$]

"^\s*\d+\s*$" deseninde, Java'nın bu karakteri özel bir şekilde yorumlaması nedeniyle \ karakterinin iki kez yazılması gerektiğine dikkat edilmelidir. Dolayısıyla şöyle yazılır: String desen1="^\\s*\\d+\\s*$";

4.11.3. Bir dizede bir desene uyan tüm öğeleri bulma

"\d+" desenini ve " 123 456 789 " dizesini ele alalım. Desen, dizede üç farklı yerde bulunur. Pattern ve Matcher sınıfları, bir dizede bir desenin farklı örneklerini bulmaya olanak tanır. Pattern sınıfı, düzenli ifadeleri yöneten sınıftır. Birden fazla kez kullanılan bir düzenli ifadenin "derlenmesi" gerekir. Bu, dizgilerde desen aramalarını hızlandırır. Statik compile yöntemi bu işi yapar:

public static Pattern compile(String regex)

Bu yöntem, parametre olarak desen dizesini alır ve bir Pattern nesnesi döndürür. Bir Pattern nesnesinin desenini bir karakter dizesiyle karşılaştırmak için Matcher sınıfı kullanılır. Bu sınıf, bir desenin bir karakter dizesiyle karşılaştırılmasını sağlar. Bir Pattern nesnesinden, matcher yöntemi kullanılarak Matcher türünde bir nesne elde edilebilir:

public Matcher matcher(CharSequence input)

input, şablonla karşılaştırılması gereken karakter dizisidir.

Dolayısıyla, "\d+" şablonunu " 123 456 789 " dizesiyle karşılaştırmak için, aşağıdaki şekilde bir Matcher nesnesi oluşturulabilir:

Pattern regex=Pattern.compile("\\d+");
Matcher résultats=regex.matcher("  123  456  789  ");

Yukarıdaki résultats nesnesinden, dizgedeki kalıbın farklı örneklerini alabiliriz. Bunun için, Matcher sınıfının suivantes yöntemlerini kullanırız:

public boolean find()
public String group()
public int start()
public Matcher reset()

find yöntemi, taranan dizede şablonun ilk örneğini arar. find yöntemine ikinci bir çağrı, bir sonraki örneği arar. Ve bu şekilde devam eder. Yöntem, deseni bulursa true değerini, bulamazsa false değerini döndürür. find tarafından bulunan son örneğe karşılık gelen dize parçası, group yöntemi ile elde edilir; konumu ise start yöntemi ile elde edilir. Dolayısıyla, önceki örneği devam ettirirsek ve " 123 456 789 " dizesindeki "\d+" deseninin tüm örneklerini görüntülemek istersek, şunu yazacağız:

while(résultats.find()){
    System.out.println("séquence " + résultats.group() + " trouvée en position " + résultats.start());
    }//while

reset yöntemi, Matcher nesnesini, desenle karşılaştırılan dizgenin başına sıfırlamaya olanak tanır. Böylece find yöntemi, daha sonra desenin ilk örneğini yeniden bulacaktır.

İşte tam bir örnek:

import java.io.*;
import java.util.regex.*;

// düzenli ifadelerin yönetimi
public class regex2 {
  public static void main(String[] args){
    // örnekteki şablonun birden fazla örneği
    String modèle2="\\d+";
    Pattern regex2=Pattern.compile(modèle2);
    String exemplaire3="  123  456 789";
    // örnekteki şablon örneklerinin aranması
    Matcher matcher2=regex2.matcher(exemplaire3);
    while(matcher2.find()){
      affiche("séquence " + matcher2.group() + " trouvée en position " + matcher2.start());
    }//while
  }//Ana Sayfa

  public static void affiche(String msg){
    System.out.println(msg);
  }//görüntüler
}//sınıf

Çalıştırma sonuçları:

Modèle=[\d+],exemplaire=[  123  456  789 ]
Il y a 3 occurrences du modèle dans l'exemplaire
123 en position 2
456 en position 7
789 en position 12

4.11.4. Bir şablonun parçalarını ayıklama

Bir şablonun alt kümeleri "çıkarılabilir". Böylece, bir dizgenin belirli bir şablona uyup uymadığını kontrol etmekle kalmaz, aynı zamanda bu dizgede parantez içine alınmış şablonun alt kümelerine karşılık gelen öğeleri de çıkarabiliriz. Örneğin, gg/aa/yyyy tarihini içeren bir dizgiyi analiz ediyorsak ve bu tarihin gg, aa, yyyy öğelerini de ayıklamak istiyorsak, (\d\d)/(\d\d)/(\d\d) şablonunu kullanırız.

Şu örneği inceleyelim:

import java.io.*;
import java.util.regex.*;

// düzenli ifadelerin yönetimi
public class regex3 {
  public static void main(String[] args){
    // şablondaki öğeleri yakalama
    String modèle3="(\\d\\d):(\\d\\d):(\\d\\d)";
    Pattern regex3=Pattern.compile(modèle3);
    String exemplaire4="Il est 18:05:49";
    // şablon doğrulama
    Matcher résultat=regex3.matcher(exemplaire4);
    if (résultat.find()){
      // örnek, şablona uyuyor
      affiche("L'exemplaire ["+exemplaire4+"] correspond au modèle ["+modèle3+"]");
      // gruplar görüntülenir
      for (int i=0;i<=résultat.groupCount();i++){
        affiche("groupes["+i+"]=["+résultat.group(i)+"] en position "+résultat.start(i));
      }//for
      }else{
        // örnek, modele uymuyor
        affiche("L'exemplaire["+exemplaire4+" ne correspond pas au modèle ["+modèle3+"]");
      }
    }//Ana Sayfa

    public static void affiche(String msg){
      System.out.println(msg);
    }//görüntüleniyor
}//sınıflandırma

Bu programın çalıştırılması sonucunda aşağıdaki çıktılar elde edilir:

L'exemplaire [Il est 18:05:49] correspond au modèle [(\d\d):(\d\d):(\d\d)]
groupes[0]=[18:05:49] en position 7
groupes[1]=[18] en position 7
groupes[2]=[05] en position 10
groupes[3]=[49] en position 13

Yenilik, aşağıdaki kod bölümünde yer almaktadır:

    // şablon doğrulama
    Matcher résultat=regex3.matcher(exemplaire4);
    if (résultat.find()){
      // örnek, modele uyuyor
      affiche("L'exemplaire ["+exemplaire4+"] correspond au modèle ["+modèle3+"]");
      // gruplar görüntüleniyor
      for (int i=0;i<=résultat.groupCount();i++){
        affiche("groupes["+i+"]=["+résultat.group(i)+"] en position "+résultat.start(i));
      }//for
      }else{
        // örnek, modele uymuyor
        affiche("L'exemplaire["+exemplaire4+" ne correspond pas au modèle ["+modèle3+"]");
      }

exemplaire4 dizesi, find yöntemi aracılığıyla regex3 şablonuyla karşılaştırılır. Böylece, exemplaire4 dizesinde regex3 şablonuna ait bir örnek bulunur. Şablon, parantezlerle çevrili alt kümeler içeriyorsa, bunlar Matcher sınıfının çeşitli yöntemleri aracılığıyla erişilebilir:


public int groupCount()
public String group(int group)
public int start(int group)

groupCount yöntemi, şablonda bulunan alt kümelerin sayısını verir; group(i) ise i numaralı alt kümeyi verir. Bu alt küme, start(i) tarafından belirtilen konumda dizgide bulunur. Örnekte olduğu gibi:

L'exemplaire [Il est 18:05:49] correspond au modèle [(\d\d):(\d\d):(\d\d)]
groupes[0]=[18:05:49] en position 7
groupes[1]=[18] en position 7
groupes[2]=[05] en position 10
groupes[3]=[49] en position 13

find yöntemine yapılan ilk çağrı, 18:05:49 dizesini bulacak ve şablondaki parantezlerle tanımlanan üç alt kümeyi, sırasıyla 18, 05 ve 49 olarak otomatik olarak oluşturacaktır.

4.11.5. Bir alıştırma programı

Bir dizenin belirli bir şablona uyup uymadığını kontrol etmemizi sağlayan düzenli ifadeyi bulmak bazen gerçek bir zorluktur. Aşağıdaki program bu konuda alıştırma yapmanıza olanak tanır. Program, bir şablon ve bir dize ister ve ardından dizenin şablona uyup uymadığını belirtir.

import java.io.*;
import java.util.regex.*;

// düzenli ifadelerin yönetimi
public class regex4 {
  public static void main(String[] args){

    // veriler
    String modèle=null,chaine=null;
    Pattern regex=null;
    BufferedReader IN=null;
    Matcher résultats=null;
    int nbOccurrences=0;

    // hata yönetimi
    try{
      // kullanıcıdan, bu örnekle karşılaştırılacak şablonlar ve örnekler istenir
      while(true){
        // giriş akışı
        IN=new BufferedReader(new InputStreamReader(System.in));
        // şablon istenir
        System.out.print("Tapez le modèle à tester ou fin pour arrêter :");
        modèle=IN.readLine();
        // bitti mi?
        if(modèle.trim().toLowerCase().equals("fin")) break;
        // düzenli ifade oluşturulur
        regex=Pattern.compile(modèle);
        // kullanıcıdan şablonla karşılaştırılacak örnekler isteniyor
        while(true){
          System.out.print("Tapez la chaîne à comparer au modèle ["+modèle+"] ou fin pour arrêter :");
          chaine=IN.readLine();
          // bitti mi?
          if(chaine.trim().toLowerCase().equals("fin")) break;
          // eşleştirici nesnesi oluşturulur
          résultats=regex.matcher(chaine);
          // şablonun örnekleri aranır
          nbOccurrences=0;
          while(résultats.find()){
            // bir eşleşme bulunur
            nbOccurrences++;
            // bu örnek görüntülenir
            System.out.println("J'ai trouvé la correspondance ["+résultats.group()
            +"] en position "+résultats.start());
            // alt öğeler görüntüleniyor
            if(résultats.groupCount()!=1){
              for(int j=1;j<=résultats.groupCount();j++){
                System.out.println("\tsous-élément ["+résultats.group(j)+"] en position "+
                  résultats.start(j));
              }//for j
            }//if
            // sonraki dize
          }//while(résultats.find())
          // en az bir örnek bulundu mu?
          if(nbOccurrences==0){
            System.out.println("Je n'ai pas trouvé de correspondance au modèle ["+modèle+"]");
          }//if
          // sonraki şablon
        }//while(true)
      }//while(true)
    }catch(Exception ex){
      // hata
      System.err.println("Erreur : "+ex.getMessage());
      // hata ile sonlandırma
      System.exit(1);
    }//try-catch
    // son
    System.exit(0);
  }//Main
}//sınıf

İşte bir çalışma örneği:

Tapez le modèle à tester ou fin pour arrêter :\d+
Tapez la chaîne à comparer au modèle [\d+] ou fin pour arrêter :123 456 789
J'ai trouvé la correspondance [123] en position 0
J'ai trouvé la correspondance [456] en position 4
J'ai trouvé la correspondance [789] en position 8
Tapez la chaîne à comparer au modèle [\d+] ou fin pour arrêter :fin

Tapez le modèle à tester ou fin pour arrêter :(\d\d):(\d\d)
Tapez la chaîne à comparer au modèle [(\d\d):(\d\d)] ou fin pour arrêter :14:15
abcd 17:18 xyzt
J'ai trouvé la correspondance [14:15] en position 0
        sous-élément [14] en position 0
        sous-élément [15] en position 3
J'ai trouvé la correspondance [17:18] en position 11
        sous-élément [17] en position 11
        sous-élément [18] en position 14
Tapez la chaîne à comparer au modèle [(\d\d):(\d\d)] ou fin pour arrêter :fin

Tapez le modèle à tester ou fin pour arrêter :^\s*\d+\s*$
Tapez la chaîne à comparer au modèle [^\s*\d+\s*$] ou fin pour arrêter :  1456
J'ai trouvé la correspondance [  1456] en position 0
Tapez la chaîne à comparer au modèle [^\s*\d+\s*$] ou fin pour arrêter :fin

Tapez le modèle à tester ou fin pour arrêter :^\s*(\d+)\s*$
Tapez la chaîne à comparer au modèle [^\s*(\d+)\s*$] ou fin pour arrêter :1456
J'ai trouvé la correspondance [1456] en position 0
        sous-élément [1456] en position 0
Tapez la chaîne à comparer au modèle [^\s*(\d+)\s*$] ou fin pour arrêter :abcd 1
456
Je n'ai pas trouvé de correspondances
Tapez la chaîne à comparer au modèle [^\s*(\d+)\s*$] ou fin pour arrêter :fin

Tapez le modèle à tester ou fin pour arrêter :fin

4.11.6. Pattern sınıfının split yöntemi

Bir düzenli ifade kullanılarak ifade edilen bir ayırıcı dizgiyle ayrılmış alanlardan oluşan bir karakter dizisini ele alalım. Örneğin, alanlar herhangi bir sayıda boşluğun önünde veya arkasında bulunan karakteriyle ayrılıyorsa, alanları ayıran dizgiyi modelleyen düzenli ifade "\s*,\s*" olur. Pattern sınıfının split yöntemi, alanları bir diziye aktarmamızı sağlar:


public String[] split(CharSequence input)

input dizesi, geçerli Pattern nesnesinin şablonuna uygun bir ayırıcıyla ayrılmış alanlara bölünür. Alan ayırıcısı virgül olan ve virgülün önünde veya arkasında herhangi bir sayıda boşluk bulunan bir satırın alanlarını almak için şu komutu yazacağız:

    // bir satır
    String ligne="abc  ,, def  , ghi";
    // bir şablon
    Pattern modèle=Pattern.compile("\\s*,\\s*");
    // satırı alanlara ayırma
    String[] champs=modèle.split(ligne);

Aynı sonuç, String sınıfındaki split yöntemi ile de elde edilebilir:


public String[] split(String regex)

İşte bir test programı:

import java.io.*;
import java.util.regex.*;

// düzenli ifadelerin yönetimi
public class split1 {
  public static void main(String[] args){
    // bir satır
    String ligne="abc  ,, def  , ghi";
    // bir şablon
    Pattern modèle=Pattern.compile("\\s*,\\s*");
    // satırı alanlara ayırma
    String[] champs=modèle.split(ligne);
    // görüntüleme
    for(int i=0;i<champs.length;i++){
      System.out.println("champs["+i+"]=["+champs[i]+"]");
    }//for
    // başka bir yöntem
    champs=ligne.split("\\s*,\\s*");
    // görüntüleme
    for(int i=0;i<champs.length;i++){
      System.out.println("champs["+i+"]=["+champs[i]+"]");
    }//for
  }//Ana Sayfa
}//sınıf

Çalıştırma sonuçları:

champs[0]=[abc]
champs[1]=[]
champs[2]=[def]
champs[3]=[ghi]
champs[0]=[abc]
champs[1]=[]
champs[2]=[def]
champs[3]=[ghi]

4.12. Alıştırmalar

4.12.1. Alıştırma 1

Unix'te programlar genellikle şu şekilde çağrılır:

$ pg -o1 v1 v2 ... -o2 v3 v4 …

burada -oi bir seçeneği, vi ise bu seçeneğe ait bir değeri temsil eder. -o1 v1 v2 ... -o2 v3 v4 … argüman dizesini analiz ederek aşağıdaki öğeleri oluşturabilen bir options sınıfı oluşturmak istiyoruz:

optionsValides
Anahtarları geçerli oi seçenekleri olan bir sözlük (Hashtable). oi anahtarına atanan değer, -oi seçeneğine atanan v1 v2 … değerlerinden oluşan bir vektördür (Vector)
optionsInvalides
Anahtarları geçersiz oi seçenekleri olan bir sözlük (Hashtable). oi anahtarına atanan değer, elemanları -oi seçeneğiyle ilişkili v1, v2 … değerlerinden oluşan bir vektördür (Vector)
optionsSans
bir seçeneğe atanmamış vi değerlerinin listesini veren dize (String)
erreur
argüman satırında hata yoksa 0 değerinde, aksi takdirde başka bir değer:
1: geçersiz çağrı parametreleri var
2: geçersiz seçenekler var
4: seçeneklerle eşleştirilmemiş değerler var
Birden fazla hata türü varsa, bu değerler toplanır.

Bir options nesnesi 4 farklı şekilde oluşturulabilir:

public options (String arguments, String optionsAcceptables)

arguments
analiz edilecek -o1 v1 v2 ... -o2 v3 v4 … argüman satırı
optionsAcceptables
kabul edilebilir oi seçeneklerinin listesi

Çağırma örneği: options opt=new options("-u u1 u2 u3 -g g1 g2 -x","-u -g");

Burada her iki argüman da karakter dizileridir. Bu dizilerin kelimelere bölünerek bir karakter dizisi dizisine yerleştirildiği durumlar da kabul edilir. Bunun için üç ayrı oluşturucu gereklidir:

public options (String[] arguments, String optionsAcceptables)
public options (String arguments, String[] optionsAcceptables)
public options (String[] arguments, String[] optionsAcceptables)

Options sınıfı aşağıdaki arayüze (erişim yöntemleri) sahip olacaktır:

public Hashtable getOptionsValides()

seçenekler nesnesinin oluşturulması sırasında oluşturulan optionsValides tablosunun referansını döndürür

public Hashtable getOptionsInvalides()

seçenekler nesnesinin oluşturulması sırasında oluşturulan optionsInvalides tablosunun referansını döndürür

public String getOptionsSans()

seçenekler nesnesinin oluşturulması sırasında oluşturulan optionsSans dizesinin referansını döndürür

public int getErreur()

seçenek nesnesinin oluşturulması sırasında oluşturulan hata özniteliğinin değerini döndürür

public String toString()

Hata yoksa optionsValides, optionsInvalides, optionsSans özniteliklerinin değerlerini gösterir; aksi takdirde hata numarasını gösterir.

İşte bir örnek program:


import java.io.*;
//içe aktarma seçenekleri;

public class test1{
  
  
  public static void main (String[] arg){
    
    // giriş akışının açılması
    String ligne;
    BufferedReader IN=null;
    try{
      IN=new BufferedReader(new InputStreamReader(System.in));
    } catch (Exception e){
      affiche(e);
      System.exit(1);
    }
    // options(String, string) yapıcı argümanlarının okunması
    String options=null;
    String optionsAcceptables=null;
    while(true){
      System.out.print("Options : ");
      try{
        options=IN.readLine();
      } catch (Exception e){
        affiche(e);
        System.exit(2);
      }
      if(options.length()==0) break;
      System.out.print("Options acceptables: ");
      try{
        optionsAcceptables=IN.readLine();
      } catch (Exception e){
        affiche(e);
        System.exit(2);
      }
      System.out.println(new options(options,optionsAcceptables));
    }// while döngüsünün sonu
  }//main'in sonu


public static void affiche(Exception e){
    System.err.println("Erreur : "+e);
  }

}//sınıf sonu

Bazı sonuçlar:

C:\Serge\java\options>java test1
Options : 1 2 3 -a a1 a2 -b b1 -c c1 c2 c3 -b b2 b3
Options acceptables: -a -b
Erreur 6
Options valides :(-b,b1,b2,b3)  (-a,a1,a2)
Options invalides : (-c,c1,c2,c3)
Sans options : 1 2 3

4.12.2. Alıştırma 2

Bir String nesnesinin içeriğini bir Vector nesnesine aktarmayı sağlayan bir stringtovector sınıfı oluşturmak istiyoruz. Bu sınıf, Vector sınıfından türetilecektir:

class stringtovector extends Vector

ve şu yapıya sahip olurdu:


    private void stringtovector(String S, String separateur, int[] tChampsVoulus,
            boolean strict){
        
        // S dizesinin alanlarını içeren bir vektör oluşturur
        // bu dize, ayırıcı ile ayrılmış alanlardan oluşur
        // ayırıcı=null ise, dize tek bir alan oluşturur
        // yalnızca indeksleri tChampsVoulus 
        // dizisinde yer alanlar istenir. İndeksler 1'den başlar
        // tChampsvoulus=null veya boyutu sıfırsa, tüm alanlar alınır
        // strict=true ise, istenen tüm alanlar mevcut olmalıdır

Sınıfın şu özel özniteliği olacaktır:

        private int erreur;

Bu öznitelik, önceki oluşturucu tarafından aşağıdaki değerlerle ayarlanır:

0: oluşturma işlemi başarıyla tamamlandı

4: strict=true ayarlıyken istenen bazı alanlar eksik

Sınıf ayrıca iki yönteme sahip olacaktır:

    public int getErreur()

bu yöntem, özel özniteliğin değerini döndürür erreur.

    public String identite(){

nesnenin değerini (hata, eleman 1, eleman 2, …) biçiminde görüntüler; burada i elemanları, dizeden oluşturulan vektörün elemanlarıdır.

Bir test programı şu şekilde olabilir:


import java.io.*;
//import stringtovector;

public class essai2{
  public static void main(String arg[]){
    int[] T1={1,3};
    System.out.println(new stringtovector("a : b : c :d:e",":",T1,true).identite());
    int[] T2={1,3,7};
    System.out.println(new stringtovector("a : b : c :d:e",":",T2,true).identite());
    int [] T3={1,4,7};
    System.out.println(new stringtovector("a : b : c :d:e",":",T3,false).identite());
    System.out.println(new stringtovector("a : b : c :d:e","",T1,false).identite());
    System.out.println(new stringtovector("a : b : c :d:e",null,T1,false).identite());
    int[] T4={1};
    System.out.println(new stringtovector("a : b : c :d:e","!",T4,true).identite());
    int[] T5=null;
    System.out.println(new stringtovector("a : b : c :d:e",":",T5,true).identite());
    System.out.println(new stringtovector("a : b : c :d:e",null,T5,true).identite());
    int[] T6=new int[0];
    System.out.println(new stringtovector("a : b : c :d:e","",T6,true).identite());
    int[] T7={1,3,4};
    System.out.println(new stringtovector("a  b  c d e"," ",T6,true).identite());
  }
}

Sonuçlar:

(0,a,c)
(4,a,c)
(0,a,d)
(0,a : b : c :d:e)
(0,a : b : c :d:e)
(0,a : b : c :d:e)
(0,a,b,c,d,e)
(0,a : b : c :d:e)
(0,a : b : c :d:e)
(0,a,b,c,d,e)

Bazı ipuçları:

  1. S dizesini alanlara ayırmak için, String sınıfındaki split yöntemini kullanın.
  2. S'deki alanları, alan numarasına göre indekslenmiş D sözlüğüne yerleştirin
  3. D sözlüğünden, anahtarı (indeksi) tChampsVoulus tablosunda bulunan alanları alın.

4.12.3. Alıştırma 3

stringtovector sınıfına aşağıdaki oluşturucuyu eklemek istiyoruz:


public stringtovector(String S, String separateur, String sChampsVoulus,boolean strict){
        
        // S dizgesindeki alanları içeren bir vektör oluşturur
        // bu dize, ayırıcı ile ayrılmış alanlardan oluşur
        // separator=null ise, dize tek bir alan oluşturur
        // yalnızca indeksleri sChampsVoulus içinde bulunan alanlar istenmektedir
        // indeksler 1'den başlar
        // sChampsvoulus=null veya "" ise, tüm alanlar alınır
        // strict=true ise, istenen tüm alanlar mevcut olmalıdır

Dolayısıyla, istenen alanların listesi bir tamsayı dizisi (int[]) yerine bir dize (String) içinde yer almaktadır. Sınıfın özel özniteliği erreur'e yeni bir değer atanabilir:

2: İstenen alanların dizin dizisi hatalı

İşte bir örnek program:


import java.io.*;
//stringtovector'ı içe aktar;

public class essai1{
  public static void main(String arg[]){
    String champs=null;
    System.out.println(new stringtovector("a: b :c :d:e ",":","1 3",true).identite());
    System.out.println(new stringtovector("a: b :c :d:e ",":","1 3 7",true).identite());
    System.out.println(new stringtovector("a: b :c :d:e ",":","1 4 7",false).identite());
    System.out.println(new stringtovector("a: b :c :d:e ","","1 3",false).identite());
    System.out.println(new stringtovector("a: b :c :d:e ",null,"1 3",false).identite());
    System.out.println(new stringtovector("a: b :c :d:e ","!","1",true).identite());
    System.out.println(new stringtovector("a: b :c :d:e ",":","",true).identite());
    System.out.println(new stringtovector("a: b :c :d:e ",":",champs,true).identite());
    System.out.println(new stringtovector("a: b :c :d:e ",null,champs,true).identite());
    System.out.println(new stringtovector("a: b :c :d:e ","","",true).identite());
    System.out.println(new stringtovector("a: b :c :d:e ",":","1 !",true).identite());
    System.out.println(new stringtovector("a b c d       e "," ","1 3",false).identite());
  }
}

Bazı sonuçlar:

(0,a,c)
(4,a,c)
(0,a,d)
(0,a: b :c :d:e)
(0,a: b :c :d:e)
(0,a: b :c :d:e)
(0,a,b,c,d,e)
(0,a,b,c,d,e)
(0,a: b :c :d:e)
(0,a: b :c :d:e)
(2)
(0,a,c)

Birkaç ipucu:

  1. sChampsVoulus dizisindeki alanları bir tamsayı dizisine aktararak önceki örneğe geri dönmeliyiz. Bunun için, sChampsVoulus dizesini bir StringTokenizer nesnesi kullanarak alanlara ayırın; bu nesnenin countTokens özniteliği, elde edilen alan sayısını verecektir. Ardından, uygun boyutta bir tamsayı dizisi oluşturulabilir ve elde edilen alanlarla doldurulabilir.
  2. Bir alanın tamsayı olup olmadığını öğrenmek için, Integer.parseInt yöntemini kullanarak alanı tamsayıya dönüştürün ve bu dönüştürme işlemi mümkün olmadığında ortaya çıkacak istisnayı işleyin.

4.12.4. Alıştırma 4

Bir metin dosyasının içeriğini bir Vector nesnesine aktarmayı sağlayan filetovector sınıfı oluşturmak istiyoruz. Bu sınıf, Vector sınıfından türetilecektir:

class filetovector extends Vector

ve aşağıdaki oluşturucuya sahip olacaktır:


    // --------------------- oluşturucu 
    public filetovector(String nomFichier, String separateur, int [] tChampsVoulus,boolean strict, String tagCommentaire){
        
        // metin dosyasındaki satırlarla bir vektör oluşturur nomFichier
        // satırlar, ayırıcı ile ayrılmış alanlardan oluşur
        // ayırıcı=null ise, satır tek bir alandan oluşur
        // Yalnızca indeksleri tChampsVoulus içinde bulunan alanlar istenmektedir
        // indeksler 1'den başlar
        // tChampsvoulus=null veya boşsa, tüm alanlar alınır
        // strict=true ise, istenen tüm alanlar mevcut olmalıdır
        // Aksi takdirde, satır kaydedilmez ve indeksi
        // lignesErronees vektörüne yerleştirilir
        // boş satırlar göz ardı edilir
        // ayrıca, tagCommentaire != null ise, tagCommentaire ile başlayan satırlar da göz ardı edilir

Sınıfın aşağıdaki özel özellikleri olacaktır:

        private int erreur=0;
        private Vector lignesErronees=null;

erreur özniteliği, önceki oluşturucu tarafından aşağıdaki değerlerle ayarlanır:

0: oluşturma işlemi başarıyla tamamlandı

1: işlenecek dosya açılamadı

4: strict=true ayarında olmasına rağmen istenen bazı alanlar eksik

8: Dosya işlenirken bir G/Ç hatası meydana geldi

lignesErronees özniteliği, hatalı satırların numaralarını karakter dizesi biçiminde içeren bir vektördür. Bir satır, strict=true ayarlıyken istenen alanları sağlayamıyorsa hatalı sayılır.

Sınıf ayrıca iki yönteme sahip olacaktır:

    public int getErreur()

erreur özel özniteliğinin değerini döndüren.

    public String identite(){

Bu komut, nesnenin değerini (hata, eleman 1, eleman 2 …,(l1,l2,…)) biçiminde görüntüler; burada i elemanları, dosyadan oluşturulan vektörün elemanlarıdır ve li ise hatalı satırların numaralarıdır.

İşte bir test örneği:


import java.io.*;
//import filetovector;

public class test2{
  public static void main(String arg[]){
    int[] T1={1,3};
    System.out.println(new filetovector("data.txt",":",T1,false,"#").identite());
    System.out.println(new filetovector("data.txt",":",T1,true,"#").identite());
    System.out.println(new filetovector("data.txt","",T1,false,"#").identite());
    System.out.println(new filetovector("data.txt",null,T1,false,"#").identite());
    int[] T2=null;
    System.out.println(new filetovector("data.txt",":",T2,false,"#").identite());
    System.out.println(new filetovector("data.txt",":",T2,false,"").identite());
    int[] T3=new int[0];
    System.out.println(new filetovector("data.txt",":",T3,false,null).identite());
  }
}

Çalıştırma sonuçları:

[0,(0,a,c) (0,1,3) (0,azerty,cvf) (0,s)]
[4,(0,a,c) (0,1,3) (0,azerty,cvf),[5]]
[0,(0,a:b:c:d:e) (0,1 :2 : 3:  4: 5) (0,azerty : 1 : cvf : fff: qqqq) (0,s)]
[0,(0,a:b:c:d:e) (0,1 :2 : 3:  4: 5) (0,azerty : 1 : cvf : fff: qqqq) (0,s)]
[0,(0,a,b,c,d,e) (0,1,2,3,4,5) (0,azerty,1,cvf,fff,qqqq) (0,s)]
[0,(0,a,b,c,d,e) (0,1,2,3,4,5) (0,# yorum) (0,azerty,1,cvf,fff,qqqq) (0,s)]
[0,(0,a,b,c,d,e) (0,1,2,3,4,5) (0,# yorum) (0,azerty,1,cvf,fff,qqqq) (0,s)]

Birkaç ipucu

  1. Metin dosyası satır satır işlenir. Satır, daha önce incelenen stringtovector sınıfı kullanılarak alanlara bölünür.

  2. Dolayısıyla, metin dosyasından oluşturulan vektörün elemanları stringtovector türünde nesnelerdir.

  3. filetovector sınıfının identite yöntemi, öğelerini görüntülemek için stringtovector.identite() yöntemini ve olası hatalı satırların numaralarını görüntülemek için Vector.toString() yöntemini kullanabilir.

4.12.5. Alıştırma 5

filetovector sınıfına aşağıdaki oluşturucuyu eklemek istiyoruz:


    public filetovector(String nomFichier, String separateur, String sChampsVoulus,
            boolean strict, String tagCommentaire){
        
        // nomFichier metin dosyasındaki satırları içeren bir vektör oluşturur
        // satırlar, ayırıcı ile ayrılmış alanlardan oluşur
        // ayırıcı=null ise, satır tek bir alandan oluşur
        // Yalnızca indeksleri tChampsVoulus içinde bulunan alanlar istenmektedir
        // indeksler 1'den başlar
        // sChampsvoulus=null veya boşsa, tüm alanlar alınır
        // strict=true ise, istenen tüm alanlar mevcut olmalıdır
        // Aksi takdirde, satır kaydedilmez ve indeksi
        // lignesErronees vektörüne eklenir
        // boş satırlar göz ardı edilir
        // ayrıca, tagCommentaire != null ise, tagCommentaire ile başlayan satırlar da göz ardı edilir

İstenen alanların dizin listesi artık bir tamsayı dizisi yerine bir karakter dizisi (String) içinde yer almaktadır.

Özel öznitelik erreur ek bir değer alabilir:

2: istenen alanların dizin dizesi hatalı

İşte bir test örneği:


import java.io.*;
//import filetovector;

public class test1{
  public static void main(String arg[]){
    System.out.println(new filetovector("data.txt",":","1 3",false,"#").identite());
    System.out.println(new filetovector("data.txt",":","1 3",true,"#").identite());
    System.out.println(new filetovector("data.txt","","1 3",false,"#").identite());
    System.out.println(new filetovector("data.txt",null," 1 3",false,"#").identite());
    String S2=null;
    System.out.println(new filetovector("data.txt",":",S2,false,"#").identite());
    System.out.println(new filetovector("data.txt",":",S2,false,"").identite());
    String S3="";
    System.out.println(new filetovector("data.txt",":",S3,false,null).identite());
  }
}

Sonuçlar:

[0,(0,a,c) (0,1,3) (0,azerty,cvf) (0,s)][4,(0,a,c) (0,1,3) (0,azerty,cvf),[5]]
[0,(0,a:b:c:d:e) (0,1 :2 : 3:  4: 5) (0,azerty : 1 : cvf : fff: qqqq) (0,s)]
[0,(0,a:b:c:d:e) (0,1 :2 : 3:  4: 5) (0,azerty : 1 : cvf : fff: qqqq) (0,s)]
[0,(0,a,b,c,d,e) (0,1,2,3,4,5) (0,azerty,1,cvf,fff,qqqq) (0,s)]
[0,(0,a,b,c,d,e) (0,1,2,3,4,5) (0,# yorum) (0,azerty,1,cvf,fff,qqqq) (0,s)]
[0,(0,a,b,c,d,e) (0,1,2,3,4,5) (0,# yorum) (0,azerty,1,cvf,fff,qqqq) (0,s)]

Birkaç ipucu

  1. sChampsVoulus dizisini, önceki oluşturucudaki duruma dönmek için tChampVoulus tamsayı tablosuna dönüştüreceğiz.