Yazilar:

 Sponsor Reklam 


09.02.2009 (07:43)

 isInfinite() ve isNaN() Metotları 
Float veya Double sınıfları kayan noktalı (floating points) - ondalıklı sayılarda tanımlama ve işlem yapabilmemizi sağlar.

Bu sınıflarda yer alan bazı sabit değişkenler şunlardır:

TYPE: Sınıf tipi, double veya float.
MAX_VALUE: Maksimum pozitif değer.
MIN_VALUE: Mininmum pozitif değer.
SIZE: 32 ya da 64 bits boyut bilgisi.
POSITIVE_INFINITY: Artı sonsuz.
NEGATIVE_INFINITY: Eksi sonsuz.
NaN: Bir sayı değil. (Not a Number).

Artı sonsuz, eksi sonsuz ve NaN sabit değerleri bölme işlemlerinde karşılaşabileceğimiz sonuçlardır. Örnek olarak normalde "5/0" işlemi;
istisnasını verecektir. Ancak "5/0.0" işlemi bu istisnayı vermeyecektir.

Şu örneğe ve sonucuna bakalım:
package kodcu.net;

public class Main {

  public static void main(String[] args) {

    Double value1 = new Double(5 / 0.0);
    Double value2 = new Double(-5 / 0.); // or (-5 / 0.0)
    Double value3 = new Double(0/0.); // or (0 / 0.0)
    System.out.println(value1 + "\n" + value2 + "\n" + value3);
   
  }
}

Ekran çıktısı şu şekildedir:
Infinity
-Infinity
NaN

Görüldüğü gibi ilk işlemin sonucu artı sonsuz, ikinci işlemin sonucu eksi sonsuz ve son işlemin sonucu da belirsiz anlamında bir sayı değil (NaN) olarak dönmüştür. İşte bu değerlerin kontrolü isInfinite() ve isNaN() metotları ile sağlanmakta. İlk iki değer için isInfinite() true, son değer için false; ilk iki değer için isNaN() false ve üçüncü değer için true değerini verecektir.

if (value1.isInfinite()) {
  // this is true, because value1 is positive infinite
}
if (value2.isNaN()) {
  // this is false, because value2 is negative infinite
}
if (value3.isNaN()) {
  // this is true, because value3 is Not a Number
}

Imza: admin

05.02.2009 (07:09)

 Dizileri Kopyalamak, arraycopy() Metodu 
Değişkenlerin özelliklerinden birisi değerlerinin (value) olmasıdır. Bir diğer özelliği ise referans adreslerinin (reference - pointer) olmalarıdır. Dizileri ifade eden değişkenlerde veya sınıf örneklerinde (instance) yapılan atamalarda iki değişkende aynı yeri işaret ediyor olacaktır. Bunun anlamı, bir değişkenin içeriğinde yapılan değişiklik diğerini etkileyecektir.

int[] array1 = {0, 1, 2, 3};
int[] array2 = array1;
array1[0] = 7;
System.out.println(array2[0]);

Bu örnekte göreceğimiz üzere array2'nin sıfırıncı indisinde bir değişiklik yapılmasa da array1'in sıfırıncı gözüne 7 yazılması, array1[0]'ında 7 olmasına neden olacaktır. Bu bazen istemediğimiz durum olabilir. İlk dizinin bir kopyasını oluşturmak ve birinci diziyi etkilemeden ikinci dizi üzerinde çalışmak isteyebiliriz. Bunu yapmak için birinci dizinin sahip olduğu tüm elemanları ikinci dizinin gözlerine kopyalayabiliriz.

int[] source = {4, 22, 3, 41};
int[] destination = new int[source.length];
for (int i = 0; i < source.length; i++) {
  destination[i] = source[i];
}

Bu kopyalama ile artık hedef dizimizde yapılan değişiklikler kaynak dizimizdeki değerleri değiştirmeyecektir. Çünkü source ve destination farklı yerleri işaret eden referanslardır.

Bir diğer yöntem de System sınıfının arraycopy() metodudur. Bu metodun kullanımını da şu örnekte görebiliriz:

package kodcu.net;

public class Main {

  public static void main(String[] args) {
   
    int[] source = {1, 2, 6, 3};
    int[] destination = new int[source.length];
    int sourcePosition = 0;
    int destinationPosition = 0;
   
    System.arraycopy(source, sourcePosition, destination, destinationPosition, source.length);
   
    // Let's write numbers of destination array
    for (int i = 0; i < destination.length; i++) {
      System.out.println(destination[i]);
    }
    int[] arr = source;
    // reassigning zero index of the source array
    source[0] = 7;

    // this assignment does not affect zero index of the destination array
    System.out.println("\n" + destination[0]);
   
  }
}

Ekran çıktımız şu şekilde olacaktır:
1
2
6
3

1

Yani, kopyalama işleminden sonra hedef dizimizde yer alan elemanları görüyoruz ve kaynak dizimizin sıfırıncı gözüne yapılan 7 değeri ataması, hedef dizimizi etkilemiyor. Bu tarz kopyalama için veya belirli indisler arasını kopyalamak için arraycopy() metodunu kullanmamız kolaylık sağlayacaktır.
Imza: admin

04.02.2009 (05:05)

 String'lerde Karşılaştırma İşlemleri 
Sayısal değerlere göre string'lerde karşılaştırmada bazı farklılıklar yer almaktadır.

// integer karşılaştırma
int a = 5;
int b = 6;
if (a == b) {
  // işlemler
}

// String karşılaştırma
String str1 = "merhaba";
String str2 = "merhaba";
String str3 = new String(str1);
if (str1 == str2) {
  // 1. if ifadesi
}
if (str1 == str3) {
  // 2. if ifadesi
}

Burada da görüleceği üzere tamsayılar arası doğrudan karşılaştırma yapabiliyoruz. Fakat str1 ve str2 arası karşılaştırma True sonucunu verirken ikinci if karşılaştırması için False sonucunu verecektir. Bunun nedeni ise yapılan karşılaştırmaların stringlerin tuttuğu değerler arasında değil de bu değişkenlerin referans adreslerinin karşılaştırılmasındandır. Ne de olsa Java'da string'ler String sınıfının nesneleridir ve referansları yer almaktadır.

Şöyle de düşünebiliriz. "merhaba" değeri bir string olup kendi başına bir referansı da mevcuttur. str1 ve str2 değişkenlerine yapılan atamalarda, atama öncesi str1 ve str2'nin referans adresleri farklı iken atama sonrası aynı referansa sahip olmuşlardır. Yani değişiklik bu stringlerin referans adreslerinde olmuştur. Oysa, str3'ün oluşturulmasında str1 kullanılarak yeni bir referans adresi oluşmuştur. Yani str3, str1 ile aynı yeri işaret eden değişkenler değil, birbirlerinin kopyaları olan farklı yerleri işaret eden değişkenlerdır.

Peki stringlerin karşılaştırılmasında gerek duyduğumuz içeriğin karşılaştırılmasını nasıl yapacağız? Bunun için javada equals() metodu tanımlanmış. Eğer iki stringin içeriği birbirine eşit ise sonucu true, değilse false olarak veren bu metot stringlerin büyük-küçük harfine karşı da duyarlı. Eğer büyük-küçük harflere karşı duyarlı olmadan karşılaştırma yapacaksak equalsIgnoreCase() metodunu kullanabiliriz.

Şimdi == yerine equals() metodunu kullanalım:

if (str1.equals(str2)) {
  // 3. if ifadesi
}

Bu ifade true değer alacaktır.

String karşılaştırması için kullanabileceğimiz bir başka yöntem de compareTo() metodudur. Yine benzer olarak büyük-küçük harf duyarlılığı istemiyorsak compareToIgnoreCase() metodunu kullanabiliriz. Bu metot, stringler arası yapılan karşılaştırma sonucunda eşitlik varsa "0" değerini döndürecektir. Karakterlerin ASCII değerleri düşünülerek yapılan karşılaştırmada ilk gelen, küçük string, sonra gelen büyük string olarak düşünülmektedir. Yani sözlüksel olarak düşünürsek daha önce yer alan sözcük diğerine göre küçüktür diyebiliriz. Yapılan karşılaştırmada ilk sözcük küçükse sonuç "negatif", büyükse "pozitif" olarak döndürülecektir.

"kodcu", "net", "java", "javA", "Yazı", "1234" stringlerini küçükten büyüğe sıralarsak şöyle bir sıralama oluşacaktır:

1234
Yazı
javA
java
kodcu
net

İlk karakterden itibaren karakterlerin ascii değerleri karşılaştırılırsa ve değerler küçükten büyüğe sıralanırsa böyle bir sıralamaya ulaşılacaktır.
Imza: admin

31.01.2009 (06:04)

 StringTokenizer Kullanımı 
Metin (text) üzerine çeşitli işlemlerde yazıyı belirli ayraçlara göre ayırmak (parsing) isteyebiliriz. Bu amaca yönelik StringTokenizer sınıfı kullanım bulmuştur.

Bu sınıf ile metni belirli bir ayraça göre ayrıştırabiliriz. Ayırma işlemi sonrası her bir ayrılmış parçayı kolay bir şekilde elde edebiliriz. Genelde boşluk karakterine göre bölme (splitting) ve benzeri işlemlerde kullanılmaktadır. Kolayca ayrılabilir hale getirilen bilgileri de tekrar elde etmek amacıyla saklamak için araya ayıraç koyup text olarak yazabiliriz. Bu ayraca göre okuma işlemi bu sınıf ile kolay bir şekilde yapılabilecektir.

Şimdi bu sınıfın kullanımına bir örnekte bakalım. Önce boşluğa göre ayırma işlemi yapalım. Sonraki yazı için de eşittir ve noktalı virgül karakterlerine göre ayırma işlemi yapalım ve sonuçları görelim:

Main.java:
package kodcu.net;

import java.util.StringTokenizer;

public class Main {

  public static void main(String[] args) {
    String text = "This is an example for StringTokenizer.";

    // This example will parse the text considering blank characters.
    StringTokenizer st = new StringTokenizer(text);
    // Let's write all tokens.
    while (st.hasMoreTokens()) {
      System.out.println(st.nextToken());
    }

    text = "(3 + 4) / 7 = 1;";
    text += "2 * 9 = 18;";
    // Parsing the text accordingly equality and semicolon character
    st = new StringTokenizer(text, "=;");
    // counts of tokens
    System.out.println("Count: " + st.countTokens());
    while (st.hasMoreTokens()) {
      System.out.println(st.nextToken());
    }
  }
}

Ekran çıktısı:
This
is
an
example
for
StringTokenizer.
Count: 4
(3 + 4) / 7
1
2 * 9
18

countTokens() metodu ayraca göre elde edilen token'lerin sayısını vermektedir. StringTokenizer sınıfı Enumeration sınıfını uygular (implements). Bu, elde edilen elemanlar arasında ilerlememizi sağlar. hasMoreTokens() metodu da sırada token olup olmadığını true/false olarak veren boolean dönüş tipli bir metottur. nextToken() metodu ise sırada yer alan token'i elde etmeyi sağlar.

StringTokenizer'ı en iyi anlayabileceğimiz kullanım yerlerinden birisi bazı resim formatlarında resmin boyut bilgilerini tutan header kısmında bu bilgilerin okunmasıdır. Bunu daha önce bahsettiğimiz PGM formatında resim okuma ve yazma yazımızda görebilirsiniz. Resme ait genişlik (width), yükseklik (height) ve derinlik (depth) bilgileri bu sınıfın nesnesi kullanılarak elde edilmiştir.
Imza: admin

19.01.2009 (02:36)

 Java'da JPG ve PNG Formatında Resim Okuma ve Yazma 
Daha önce PGM (Portable Gray Map File) formatında gri seviyeli olan resimleri okuma ve yazmadan şu yazıda bahsetmiştik.

Şimdi de JPG (Joint Photographic Experts Group) veya PNG (Portable Network Graphics) formatlarında resim okumaya ve yazmaya bakalım.

Örnek olarak, JPG veya PNG formatında bir resmin negatifini alalım. Bu amaçla dizini verilen bir resmi hem okuyacağız, hem üzerinde işlem yapacağız hem de kopyasının son halini dizine yazdıracağız.

Main.java:
package kodcu.net;

import java.awt.Color;

public class Main {

  public static final String READ_PATH = "C://kodcu.net.oku.jpg";
  public static final String WRITE_PATH = "C://kodcu.net.yaz.jpg";

  /**
  * main metodu
  * @param args String[]
  */

  public static void main(String[] args) {
    // Resmi okuyalim
    Picture picture = new Picture(READ_PATH);
    // Resmin negatifini alalim
    picture = getNegative(picture);
    // Resmi yazalim
    picture.save(WRITE_PATH);
  }
 
  /**
  * This method finds the negative of the image
  * @param picture Picture
  * @return Picture
  */

  public static Picture getNegative(Picture picture) {   
    // Resmin boyutlarini bulalim
    int width = picture.width();
    int height = picture.height();
    Color color;
    int red; // kirmizi renk
    int green; // yesil renk
    int blue; // mavi renk
    // Tum piksellerin negatifi alinir
    for (int i = 0; i < width; i++) {
      for (int j = 0; j < height; j++) {
        color = picture.get(i, j);
        // RGB values
        red = color.getRed();
        green = color.getGreen();
        blue = color.getBlue();
        // Negative values
        red = 255 - red;
        green = 255 - green;
        blue = 255 - blue;
        color = new Color(red, green, blue);
        picture.set(i, j, color);
      }
    }
    return picture;
  }

}

Picture.java:
package kodcu.net;

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.awt.Color;
import java.io.File;
import java.io.IOException;
import java.net.URL;

public final class Picture {
    private BufferedImage image;    // for bitmap
    private String filename;        // name of file

    public Picture(int w, int h) {
        image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        // set to TYPE_INT_ARGB to support transparency
        filename = w + "-by-" + h;
    }

  /**
    * Create a picture by reading in a .png, .gif, or .jpg from
    * the given filename or URL name.
    */

    public Picture(String filename) {
        this.filename = filename;
        try {
            // try to read from file in working directory
            File file = new File(filename);
            if (file.isFile()) {
                image = ImageIO.read(file);
            }

            // now try to read from file in same directory as this .class file
            else {
                URL url = getClass().getResource(filename);
                if (url == null) { url = new URL(filename); }
                image = ImageIO.read(url);
            }
        }
        catch (IOException e) {
            // e.printStackTrace();
            throw new RuntimeException("Could not open file: " + filename);
        }

        // check that image was read in
        if (image == null) {
            throw new RuntimeException("Invalid image file: " + filename);
        }
    }

  /**
    * Create a picture by reading in a .png, .gif, or .jpg from a File.
    */

    public Picture(File file) {
        try { image = ImageIO.read(file); }
        catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("Could not open file: " + file);
        }
        if (image == null) {
            throw new RuntimeException("Invalid image file: " + file);
        }
    }

  /**
    * Return the height of the picture (in pixels).
    */

    public int height() {
        return image.getHeight(null);
    }

  /**
    * Return the width of the picture (in pixels).
    */

    public int width() {
        return image.getWidth(null);
    }

  /**
    * Return the Color of pixel (i, j).
    */

    public Color get(int i, int j) {
        return new Color(image.getRGB(i, j));
    }

  /**
    * Set the Color of pixel (i, j) to c.
    */

    public void set(int i, int j, Color c) {
        if (c == null) { throw new RuntimeException("can't set Color to null"); }
        image.setRGB(i, j, c.getRGB());
    }

  /**
    * Save the picture to a file in a standard image format.
    * The filetype must be .png or .jpg.
    */

    public void save(String name) {
        save(new File(name));
    }

  /**
    * Save the picture to a file in a standard image format.
    */

    public void save(File file) {
        this.filename = file.getName();
        String suffix = filename.substring(filename.lastIndexOf('.') + 1);
        suffix = suffix.toLowerCase();
        if (suffix.equals("jpg") || suffix.equals("png") || suffix.equals("gif")) {
            try { ImageIO.write(image, suffix, file); }
            catch (IOException e) { e.printStackTrace(); }
        }
        else {
            System.out.println("Error: filename must end in .jpg or .png");
        }
    }

}

Imza: admin

09.01.2009 (02:03)

 Java'da PGM Formatında Resim Okuma ve Yazma 
PGM (Portable Gray Map File) dosya formatı, gri seviyeli resimler için kullanılan bir formattır. Resimden okuma ve resme okuma işlemleri kolay bir şekilde yapılmaktadır. Dosya header ve data olmak üzere iki kısımdan oluşur. header içerisinde resmin formatı, resme ait yükseklik, genişlik ve derinlik bilgileri bulunur. Bundan sonraki kısım ise her piksellerin gri seviyesindeki renk değerleridir. byte halinde tutulabilen bu veriler derinliğe göre sayılardır. 255 derinlikli veya seviyeli resimde bu değerler 255'ten büyük olamaz.

255 gri seviyeli PGM resimlerde 0 rengi siyahı, 255 rengi ise beyazı temsil etmektedir ve toplam 256 renk bulunmaktadır. 0-255 arası değerler gri renkleri temsil etmektedir.

Java ile PGM formatında resmi okumak için resmin içindeki bilgilerin byte byte okunması ve değerlendirilmesi gerekmektedir.

header verisi okunduktan sonra header'ın atlanması için okuma işleminde kullanılan DataInputStream'ın skipBytes(int) veya kalıtım yoluyla devraldığı skip(long) metodundan faydalanılabilir.

StringTokenizer sınıfının nesnesi üretilerek header içinde satırlardaki boyut bilgileri integer (tam sayı) olarak parse edilebilir.

data kısmı ise header kısmı atlandıktan sonra piksellerin değerleri readUnsignedByte() metodu ile okunabilir.

PGM formatındaki resmin okunması ve yazılması ile ilgili bir kopyalama örneği yapalım.

Okunacak dosya: C://kodcu.net.oku.pgm (read)
Yazılacak dosya: C://kodcu.net.yaz.pgm (write)

Main.java
package kodcu.net;

public class Main {

  public static void main(String[] args) {

    Image image = new Image();
    // PGM resmi okunur
    image.readPGM("C://kodcu.net.oku.pgm");
    // PGM resmi yazilir
    image.writePGM("C://kodcu.net.yaz.pgm"); 

  }

}

Image.java
package kodcu.net;

import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.DataOutputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;

public class Image {
  private int[][] pixels;
  private int depth;
  private int width;
  private int height;
  private int maximum;
  private int minimum;

  // Constructor
  public Image() {
    pixels = new int[1500][1500];
    depth = width = height = 0;
  }

  // Constructor
  public Image(int inDepth, int inWidth, int inHeight) {
    pixels = new int[inWidth][inHeight];
    width = inWidth;
    height = inHeight;
    depth = inDepth;
  }

  // Constructor
  public Image(Image img) {
    this.width = img.width;
    this.height = img.height;
    this.depth = img.depth;
    this.maximum = img.maximum;
    this.minimum = img.minimum;
    this.pixels = new int[width][height];
    for (int i = 0; i < this.width; i++)
      for (int j = 0; j < this.height; j++)
        this.pixels[i][j] = img.pixels[i][j];
  }

  /**
  * PGM resmini okumayi saglar
  * @param fileName String
  */

  public void readPGM(String fileName) {
    String line;
    StringTokenizer st;

    try {
      BufferedReader in =
          new BufferedReader(new InputStreamReader(
          new BufferedInputStream(
          new FileInputStream(fileName))));

      DataInputStream in2 =
          new DataInputStream(
          new BufferedInputStream(
          new FileInputStream(fileName)));

      // PGM resim header oku

      // yorumlari atla
      line = in.readLine();
      in2.skip( (line + "\n").getBytes().length);

      // PGM resim formati kontrolu
      if (line.equals("P5")) {
        // yorumlari atla
        do {
          line = in.readLine();
          in2.skip( (line + "\n").getBytes().length);
        }
        while (line.charAt(0) == '#');

        // bu satir boyut bilgisini icerir
        st = new StringTokenizer(line);
        width = Integer.parseInt(st.nextToken());
        height = Integer.parseInt(st.nextToken());

        // diger satir resmin derinligini verir
        line = in.readLine();
        in2.skip( (line + "\n").getBytes().length);
        st = new StringTokenizer(line);
        depth = Integer.parseInt(st.nextToken());

        // okunacak dosya icin piksels dizisi implemente edilir
        pixels = new int[width][height];

        // pikseller simdi okunur
        for (int y = 0; y < height; y++) {
          for (int x = 0; x < width; x++) {
            pixels[x][y] = in2.readUnsignedByte();

          }
        }
        in.close();
        in2.close();

      }
      else {
        System.out.println("Hata: resim PGM degil");
      }
    }
    catch (ArrayIndexOutOfBoundsException e) {
      System.out.println("Hata: resim cok buyuk");
    }
    catch (IOException e) {
      System.out.println("Hata: IO istisnasi");
    }
  }

  /**
  * PGM resmi olusturur
  * @param fileName String
  */

  public void writePGM(String fileName) {
    try {
      DataOutputStream out =
          new DataOutputStream(
          new BufferedOutputStream(
          new FileOutputStream(fileName)));

      out.writeBytes("P5\n");
      out.writeBytes("#PGM Resim Dosyasi | Kodcu.net\n");
      out.writeBytes(width + " " + height + "\n" + depth + "\n");

      for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
          out.writeByte( (byte) pixels[x][y]);

        }
      }
      out.close();
    }
    catch (IOException e) {
      System.out.println("Hata: yazma islemi yapilamadi");
    }
  }

}

Imza: admin

04.01.2009 (22:01)

 String'ler ve StringBuffer Kullanımı 
Karakterler dizileri yerine String dediğimiz karakter katarlarını da kullanabiliriz.

Bildiğimiz üzere stringler üzerine işlemlerde stringin boyutu (length()), bir indisindeki karakteri (charAt(int)), string birleştirmeleri (concat(String)), karşılaştırma işlemleri (compareTo(String)), alt stringin elde edilmesi (substring(int, int)) ve daha pek çok işlem yapılabilmektedir.

Stringler bazı kısıtlardan dolayı değiştirilemeyen karakter katarlarıdır. Doğrudan bir karakterin silinmesi (delete) veya araya bir karakterin eklenmesi (insert) benzeri işlemler söz konusu değildir. Dolaylı yollarla bu işlemler yapılabilir fakat karakterlere referans veren stringimiz artık hafızada (memory) başka bir yerde yeni elde edilen karakter katarlarına referans verecektir.

// String'lerde bir indisteki karakterin silinmesi
String s = "abcdef";
s = s.substring(0, 2) + s.substring(3);

Bu kod ile ikinci indiste yer alan karakter 'c' silinmektedir. Aslında s karakter katarının alt karakterleri elde edilmekte, bunlar birleştirilmekte ve sonucun bulunduğu adrese s değişkeni referans vermektedir.

Eğer s'nin son halini ekrana yazdırırsak şu sonucu görürüz:
abdef

String'ler üzerine yapamadığımız işlemler için ve hafızadaki yerindeki kapasite değişiklikleri problemlerini azaltmak amacıyla StringBuffer sınıfı kullanılmaktadır.

Bu sınıfı kullanarak yine String'in boyutunu bulduğumuz gibi (length()) bu sefer kapasitesini de görebiliriz (capacity()).

Boyut ve kapasite ile ilgili şu örneğe bakalım:

package kodcu.net;

public class Main {
  public static void main(String[] args) {
    String str = "12345678";
    StringBuffer sb = new StringBuffer(str);
    // sb.ensureCapacity(100);
    int kapasite = sb.capacity();
    int boyut = sb.length();
    System.out.println("Kapasite: " + kapasite);
    System.out.println("Boyut" + boyut);
  }
}

Ekran çıktımız şu şekilde olacaktır:
Kapasite: 24
Boyut: 8

Görüldüğü gibi boyut beklediğimiz boyut çıkarken kapasite ise daha büyük çıkmıştır. StringBuffer sınıfı, yapılacak her değişikte kapasiteyi değiştirmemek için ilk seferde 16 ek karakterlik yer açmaktadır. Kapasite değişimi maliyetli bir işlemdir.

Artık insert(), delete(), deleteCharAt(int), append() gibi işlemleri yapabiliriz. Ayrıca kapasite ayırma işlemini elle (manual) de ensureCapacity(int) metodu ile yapabiliriz.

Yukarıda yer alan örnekte yorum olarak kapatılmış satırda (comment line) ensureCapacity(100) çağrısı yer almaktadır. Eğer bu satırı aktif edersek ekran çıktımız şu şekilde olur:
Kapasite: 100
Boyut: 8

Imza: admin

02.01.2009 (06:30)

 Locale Sınıfı ve Lokal Ayarları 
Java çeşitli coğrafya ve dilleri ayırarak uluslararası ortamlarda çalışabilen programlar yazmayı sağlamıştır. Bölgesel bilgiler taşıyon ve onu değiştirebilen, yöneten bu sınıf Locale sınıfıdır.

Sabit Locale tipli değişkenler şunlardır:

CANADA
CANADA_FRENCH
CHINA
CHINESE
ENGLISH
FRANCE
FRENCH
GERMAN
GERMANY
ITALIAN
ITALY
JAPAN
JAPANESE
KOREA
KOREAN
PRC
ROOT
SIMPLIFIED_CHINESE
TAIWAN
TRADITIONAL_CHINESE
UK
US

Bu sabit değerli Locale nesnelerinde o yer veya dille ilgili bilgiler tutulmaktadır.

Locale sınıfının getDefault() metodu ile şu anki lokal bilgileri alınırken, getCountry() metodu ile bulunan ülke bilgileri alınmaktadır. Şu örneğe bakabiliriz:

package kodcu.net;

import java.util.Locale;

public class Main {
  public static void main (String[] args) {
    // ön tanımlı lokal değerimizi okuyalım
    Locale lokal = Locale.getDefault();
    // lokalin ülke bilgisini yazdıralım
    System.out.println(lokal.getCountry());
  }
}

Ekran çıktısı,
TR
olacaktır.

setDefault() metodu ile bölgesel ayarlar değiştirilebilir. Şimdiki örnekte de,
Dil: tr
Ülke: TR
olan değerler,
Dil: en
Ülke: EN
olarak değiştirilmektedir:

package kodcu.net;

import java.util.Locale;

public class Main {
  public static void main (String[] args) {
    // yeni lokal nesnemiz
    Locale newLocale = new Locale("en", "EN");
    // yeni lokal nesnemizi varsayılan yapalım
    Locale.setDefault(newLocale);
    Locale lokal = Locale.getDefault();
    // ülkeyi yazdıralım
    System.out.println(lokal.getCountry());
  }
}

Imza: admin

30.12.2008 (08:06)

 Java'da Obfuscation Nedir? Nasıl Yapılır? 
Java'da yazdığımız kaynak kodlar (source codes) derlendikten sonra class tipinde dosyalar üretilir. Eğer derlenmiş kodumuza obfuscation (karıştırma) işlemi yapmazsak, üretilen class dosyaları üzerinden tekrar kaynak dosyalarına dönüş yapılabilir. Bu da genelde istenmeyen durumdur. Çünkü yazılan kod elde edilmektedir.

Obfuscation işleminde sınıflar ve birçok kısım yeni isim alır ve onlara olan referanslar da değiştirilir. Örnek olarak, Math.java kodundan elde edilecek class Math.class değil de A.class olacaktır.

Obfuscation kodu karıştırmakla beraber sıkıştırma işlemi de yapmış olur. Ortalama olarak %40 oranında kazanç sağlar. Bu kazanç en çok cep telefonu uygulamları olan MIDlet programlarda faydalı olacaktır. Çünkü cep telefonunun hafıza kapasitesi, programları çalıştırmak için bir hayli küçüktür.

Obfuscation işlemi için paralı veya ücretsiz çeşitli programlar bulunmaktadır. İşte bazı obfuscator programları:

Ücretsiz:
* proguard
* yGuard
* JavaGuard

Ücretli:
* retrologic
* allatori
* pcsentinelsoftware

IDE'lerden ücretsiz olan NetBeans'te de obfuscation işlemi yapılabilmektedir.

NetBeans'te izlenmesi gereken adımlar şunlardır:

1. Projenizi tamamlayınız.
2. Projeyi Build ediniz (F11).
3. Proje isminize sağ tıklayın ve özellikleri (Properties) seçin.
4. Kategoriden (Category) Build içinde Obfuscating'i seçin.
5. Obfuscation Level'i OFF'tan HIGH'a getirin.
6. OK butonuna basın.
7. Projeyi tekrar Build ediniz.

Böylece maksimum derecede karıştırma ve sıkıştırma işlemi yapılacaktır.

Artık byte kodumuz (byte code) da karıştırma işleminden sonra elde edilmiş olacak.

Ürettiğiniz uygulamanın büyüklüğünü görmek ve karşılaştırmak isterseniz şu yolu takip ediniz:

Files > Projeniz > dist > Projeniz.jar > Properties
Burada "File Size:" kısmında dosya büyüklüğünü görebilirsiniz.
Imza: admin

26.12.2008 (07:40)

 While ve Do Kullanımı 
for döngüsünden ve continue, break kullanımlarından daha önce şu yazıda bahsetmiştik. for'dan başka bir döngü-iterasyon ifadesi de while'dır.

Bir eşitlik veya eşitsizlik olduğu sürece tarzı ifadelerde while, bir eşitlik veya eşitsizlik olana kadar ifadeleri için de do-while yapısı kullanılmaktadır.

while örneği şu şekildedir:

int x = 100;
while (x > 95) {
  System.out.println(x);
  x--;
}

x'in 95'ten büyük olduğu her adım için ekrana x değeri yazdırılmakta ve değeri 1 azaltılmaktadır. Ekran çıktısı şu şekilde olacaktır:

100
99
98
97
96

x'in aldığı son değer ise 95 olacak ve döngüye giremeyecektir.

do-while örneği ise şu şekildedir:

int x = 100;
do {
  System.out.println(x);
  x--;
} while (x > 95);

Burada da aynı ekran çıktısını elde edeceğiz. Buradaki tek fark ilk işlemin muhakkak yapılıyor olmasıdır. Yani her iki ifade de x > 100 şartı olsaydı birinci durumda ekrana hiçbir şey yazılmazken ikincide 100 yazılacaktı.

do-while'ın kullanım yeri genelde kullanıcıdan belirli seçeneklerin seçilmesi istendiğindedir. Örnek olarak
Hangi işlemi yapmak istiyorsunuz?
1: işlem 1
2: işlem 2
3: işlem 3
4: işlem 4
5: programdan çıkış
diğer: tekrar sor
gibi bir menü seçme veya çıkma programında 1 tuşu ile birinci işlem yapılırken 5 tuşu ile programdan çıkış yapılmaktadır. Yer almayan her tuş için de tekrar soru sorulmaktadır.

Burada eğer while kullanırsak kullanıcı daha bir tuşa basmadığı için karşılaştıracak bir değerimiz yoktur. Bu nedenle
package kodcu.net;

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

  public static void main(String[] args) throws IOException {

    // System.in araciligi ile konsoldan girilenleri alalim
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    while (br.read()!='5') {
      System.out.println("Hangi işlemi yapmak istiyorsunuz?");
      // diğer yazılar
      // ve işlemler
    }


  }

}
gibi bir karşılaştırma yapamayız.

Oysa kullanıcı mutlaka bir değer girmek zorunda olduğu için do-while ile karakter okuması yapılıp 5'e eşit olup olmadığı karşılaştırılabilir. Değilse do-while biter ve programdan çıkılır.
package kodcu.net;

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

  public static void main(String[] args) throws IOException {

    // System.in araciligi ile konsoldan girilenleri alalim
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    do {
      System.out.println("Hangi işlemi yapmak istiyorsunuz?");
      // diğer yazılar
      // ve işlemler
    } while (br.read() != '5');

  }

}
Bu kullanım böyle ilk sefer mutlaka yapılması gereken işlemler için daha uygundur.

Kodlarda yer alan konsoldan karakter okuma ile ilgili bilgi için şu yazıya göz atabilirsiniz.
Imza: admin

 1  ··  3   4   5  ··  10 








Yazilar kaynak gosterilmeden kopyalanamaz © www.kodcu.net // Twitter