String içerisindeki noktalama işaretlerinden kurtulmak

Bazen String ifadeler içerisindeki noktalama işaretlerinden kurtulmak isteyebilirsiniz.

İhtiyaç durumunda hayatınızı kurtaracak o kısa kod aşağıdaki gibidir.

[codesyntax lang=”java” lines=”no”]

replaceAll("\p{P}", "")

[/codesyntax]

Kendi yazdığımız cümle için kullanalım.

[codesyntax lang=”java” lines=”no”]

public static void main(String[] args) {
	String cumle = "-Hangi takımı tutuyorsun? "
			+ "-Beşiktaş(!) "
			+ "-Bir gün herkes Beşiktaşlı olmasın; "
			+ "-Bırakın o ayrıcalık bizde kalsın... ";
	String[] kelimeler = cumle.replaceAll("\p{P}", "").split("\s");
	for (String kelime : kelimeler) {
		System.out.println(kelime);
	}
}

[/codesyntax]

Kodumuzu çalıştırdığımız zaman ?,!,;.,(,) gibi özel karakterleri cümlemizden çıkartmış oluyoruz.

Kelimeleri tek tek ekrana yazdırdığımızda çıktı da aşağıdaki gibi oluyor.

cikti

Eclipse Kepler’de Ctrl+Space çalışmama sorunu

Eclipse’in son sürümü Kepler geçtiğimiz günlerde release oldu.

Bugünkü dersimde denemek amaçlı kurulumu yaparak derse devam etmek istedim ancak Ctrl+Space content assist çalışmıyordu.

Sonra bu sorunun kısayol tuşlarının değiştirildiğinden dolayı kaynaklandığını düşündüm.

Ancak standart ayarlardan bazılarının kapalı gelmesi dolayısıyla kaynaklanıyormuş.

Aynı sıkıntıya düşerseniz çözüm yolu ;

Window -> Preferences -> Java -> Editor -> Content Assist -> Advanced

1

 

 

2

 

Metot Ezme (Method Overriding)

Metot aşırı yükleme ve metot ezme sürekli kullanılan ve sıkça karıştırılan kavramlardır. Metot ezme bir sınıftaki metoda, başka bir sınıfta yeni fonksiyonalite eklemeye denir.

Bir metodun ezilebilmesi için ;

  • Metotların birbirinden türeyen sınıflarda bulunması gerekir. (is-a ilişkisi olmalıdır)
  • Metot imzalarının aynı olması gerekir. (bkz. NOT)
  • Metotların dönüş tiplerinin ya aynı ya da ezilen metodun dönüş tipinden türeyen bir tip olması gerekir.
  • Ezilen metodun erişim denetleyicisi ne ise ezen metodun erişim denetleyici de ya aynı ya da daha kapsamlı olmalıdır.
  • Metot bir Exception fırlatıyorsa ezen metot da ya aynı tipte ya da o Exception’dan türeyen başka bir tipte hata fırlatmalıdır.

[box type=”warning”] NOT : Bir metodun ismine, parametre sayısı ve tipinemetot imzası” denir.[/box]

[codesyntax lang=”java” lines=”no”]

package com.javauzmani.overriding;

public class Office {

	protected void kaydet() throws RuntimeException {
		// metot işlemleri
	}
}

[/codesyntax]

 

[codesyntax lang=”java” lines=”no”]

package com.javauzmani.overriding;

public class Word extends Office {

	protected void kaydet() throws RuntimeException {
		// metot işlemleri
	}

/*	protected void kaydet() throws ArrayIndexOutOfBoundsException {
		// metot işlemleri
	}

	public void kaydet() throws RuntimeException {
		// metot işlemleri
	}

*/

}

[/codesyntax]

Office sınıfından türeyen Word sınıfında kaydet metodunu yukarıdaki  gibi birden fazla şekilde ezebiliriz.

Metot Aşırı Yükleme (Method Overloading)

Aynı sınıfta aynı isimde metot tanımlamaya metot aşırı yükleme (overloading) denir. Metot aşırı yüklemenin kuralları vardır.

  • Metotların dönüş tipleri aynı olmalıdır.
  • Metotların isimleri aynı olmalıdır.
  • Metotların aldıkları parametre sayıları eşit ise bu parametrelerden en az birinin tipi farklı olmalıdır. Parametre sayıları farklı olabilir.
  • Metotların aynı sınıfta olması gerekir.

[codesyntax lang=”java” lines=”no”]

package com.javauzmani.overloading;

import java.io.File;

public class DvdOynatici {

	void oynat(File dosya){
		// dosya oynat
	}

	void oynat(String dosyaIsmi){
		// dosya oynat
	}

	void oynat(File dosya, int sure){
		// dosya oynat
	}
}

[/codesyntax]

[box type=”info”] Bir sınıfta birden fazla yapılandırıcı (constructor) varsa buna da “constructor overloading” denir.[/box]

[box] Aynı kurallar varargs metotlar için de geçerlidir.[/box]

JAXB Veri Tipleri

 

XML Schema Type Java Data Type
xsd:string java.lang.String
xsd:integer java.math.BigInteger
xsd:int int
xsd.long long
xsd:short short
xsd:decimal java.math.BigDecimal
xsd:float float
xsd:double double
xsd:boolean boolean
xsd:byte byte
xsd:QName javax.xml.namespace.QName
xsd:dateTime javax.xml.datatype.XMLGregorianCalendar
xsd:base64Binary byte[]
xsd:hexBinary byte[]
xsd:unsignedInt long
xsd:unsignedShort int
xsd:unsignedByte short
xsd:time javax.xml.datatype.XMLGregorianCalendar
xsd:date javax.xml.datatype.XMLGregorianCalendar
xsd:g javax.xml.datatype.XMLGregorianCalendar
xsd:anySimpleType java.lang.Object
xsd:anySimpleType java.lang.String
xsd:duration javax.xml.datatype.Duration
xsd:NOTATION javax.xml.namespace.QName

 

Kaynak : Oracle Docs

Eclipse’e Swing eklentisi kurma ve örnek Swing uygulaması

JFC yani Java Foundation Classes, Java uygulamalarına görsellik katabilmemizi sağlayan grafiksel kullanıcı arayüzleri (Graphical User Interfaces – GUIs) ve zengin grafik fonksiyonaliteler sağlayan özellikler bütünüdür. JFC dendiğinde birden fazla özellikten bahsedebiliriz.

Örneğin ;

  • Swing GUI Bileşenleri : Sayfalarımızda kullandığımız tablolardan düğmelere ya da giriş kutucuklarından menülere kadar tüm bileşenlerdir.
  • Look And Feel Desteği : Java’da yazmış olduğunuz herhangi bir masaüstü uygulamasının görünümünü isterseniz Java isterseniz Windows ya da herhangi başka bir görünüme kavuşturabilirsiniz. Örnek koda Swing’te Pencere Görünümü adlı  makalemden ulaşabilirsiniz.
  • Accessibility API : Bu API ile kullanıcıdan bilgi almak için ekran okuyucuları gibi yardımcı teknolojiler kullanılır.
  • Java 2D API : Yazılımcıların uygulamalarında 2D metinleri, resimleri, grafikleri kullanabilmelerini sağlar.
  • i18n (Internationalization) : Yazılan uygulamaların başka dillere destek vermesi sağlanır.

Yukarıda bahsettiğimiz tüm bu özellikler JFC olarak anılır.

Şimdi Swing kullanarak ilk uygulamamızı geliştirelim. Swing ile kod geliştirmek için en ideal IDE NetBeans olsa da ben Eclipse kullanacağım.

[box type=”info”] NetBeans’te Swing için ekstra plugin indirilmesine gerek yoktur.[/box]

Eclipse’te Swing uygulamaları geliştirmek için tasarlanmış birden fazla plugin var. Ben Google’ın Window Builder eklentisini kullanacağım.

Bu eklentiyi Eclipse’inize eklemek için önce Help menüsünden Install New Software… menüsünü seçiyoruz.

Daha sonra sağ üst kısımdaki Add butonuna tıklayarak Location kısmına http://dl.google.com/eclipse/inst/d2wbpro/latest/3.7 adresini giriyoruz. Bir isim vererek eklentiyi kuruyoruz.

Eklenti kurulduktan sonra IDE’nizi yeniden başlatmalısınız. Zaten Eclipse bunu indirme işlemini bitirdikten sonra size söylüyor.

Yeni bir uygulama yaratıyorum.

Daha sonra src dizininde yeni bir sınıf yaratıyorum. Fakat yaratacağım sınıf JFrame sınıfından türeyecek ve görsel olarak sayfa tasarlayabileceğim. Bunun için New menüsünden yeni bir JFrame yaratıyorum.

Paketin ismine com.javauzmani.view sınıfın ismine ise Merhaba diyorum. Daha sonra da Design kısmına geçiyorum.

Bu aşamadan sonra önce Layout Manager seçiyorum.

[box type=”info”] Layout Manager’larla ilgili yazımı inceleyebilirsiniz.[/box]

Daha sonra da pencereme bir tane düğme yerleştiriyorum.

Butonun üzerine çift tıklayarak ya da sağ klik Add Event Handler ->action -> actionPerformed seçeneklerini takip ederek butona tıklandığında yapılacak iş için yazacağım kod kısmına geçiyorum.

Butona tıkladığımda bir bilgilendirme mesajı verdiren kodu aşağıdaki şekilde yazıyorum.

[codesyntax lang=”java” lines=”no”]

package com.javauzmani.view;

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class Merhaba extends JFrame {

	private static final long serialVersionUID = -4962656916544575558L;
	private JPanel contentPane;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Merhaba frame = new Merhaba();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public Merhaba() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		GridBagLayout gbl_contentPane = new GridBagLayout();
		gbl_contentPane.columnWidths = new int[] { 0, 0, 0 };
		gbl_contentPane.rowHeights = new int[] { 0, 0, 0 };
		gbl_contentPane.columnWeights = new double[] { 0.0, 0.0,
				Double.MIN_VALUE };
		gbl_contentPane.rowWeights = new double[] { 0.0, 0.0, Double.MIN_VALUE };
		contentPane.setLayout(gbl_contentPane);

		JButton btnMerhabaDnya = new JButton("Merhaba Du00FCnya");
		btnMerhabaDnya.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				butonaTiklandi();
			}
		});
		GridBagConstraints gbc_btnMerhabaDnya = new GridBagConstraints();
		gbc_btnMerhabaDnya.gridx = 1;
		gbc_btnMerhabaDnya.gridy = 1;
		contentPane.add(btnMerhabaDnya, gbc_btnMerhabaDnya);
	}

	private void butonaTiklandi() {
		JOptionPane.showMessageDialog(this, "Merhaba Dünya", "BİLGİ",
				JOptionPane.INFORMATION_MESSAGE);
	}
}

[/codesyntax]

Uygulamayı çalıştırıp butona tıkladığımda görüntü aşağıdaki gibi oluyor.

Belirli bir zamanda Java kodu çalıştırmak

EJB kullanırken sunucuda çalışan bir kodun belirli aralıklarla, belirli zamanlarda çalışması için Timer Servisleri kullanılır.

Timer Servisleri  ilk olarak EJB 2.1 spesifikasyonu ile beraber eklenmiştir.

EJB Container tarafından desteklenen bean’lerin, belli zaman aralıklarında ya da belli bir saatte çalışmasını sağlayan yapılardır.

Peki EJB dışında belirli zamanlarda çalışmasını istediğimiz bir Java uygulamamız varsa bunu nasıl yapacağız?

İşte bu tarz bir ihtiyaç halinde TimerTask isimli soyut sınıf yardımımıza koşuyor.

Kullanımı ise oldukça basit. Örneğin her saat başı veri tabanından Personel bilgilerini güncelleyen bir uygulama düşünün.

[codesyntax lang=”java” lines=”no”]

import java.util.TimerTask;

// TimerTask sınıfından türeyen sınıf

public class ZamanlanmisGorev extends TimerTask {

        // yapilacak is

        public void run() {
               // veri tabanindan personel bilgileri çekerek ekranda
               // gösteriyoruz
        }
}

[/codesyntax]

İlk olarak java.util paketindeki TimerTask sınıfından türeyen bir sınıf tanımlıyoruz. TimerTask soyut bir sınıtfır. Bu sınıf içerisindeki run() metodunda belirli aralıklarla yapılacak işleri yapıyoruz.

İkinci olarak ise yeni bir Timer nesnesi yaratarak overload edilmiş schedule() metodunu çağırıyoruz. Hepsi bu kadar.

[codesyntax lang=”java” lines=”no”]

import java.util.Timer;

//ZamanlanmisGorev sinifini kullanan sinif
public class AnaSinif {
        public static void main(String args[]) throws InterruptedException {

               Timer time = new Timer(); // Timer nesnesi yarat
               ZamanlanmisGorev zg = new ZamanlanmisGorev(); // sinifimizi yarat
               time.schedule(zg, 0, 3600000); // saat basi calistir
        }
}

[/codesyntax]

Timer sınıfında 4 tane schedule() metodu vardır. Bunlar işimize yarayan bir tanesini seçerek kullanabiliriz.

schedule(TimerTask task, Date time) : Belirli bir tarihte kodu çalıştırır.

schedule(TimerTask task, Date firstTime, long period)  : Belirli bir tarihte başlayan kodu belirlenmiş süreler geçtikten sonra tekrar çalıştırır.

schedule(TimerTask task, long delay)  : Kodu belirli aralıklarla çalıştırır.

schedule(TimerTask task, long delay, long period)  : Belirli bir zaman sonra başlayacak kodu yine belirli bir süre sonra tekrar çalıştırır. Ben örnek kodda bu metodu kullandım.

[box type=”info”] Yazmış olduğumuz kod hiçbir zaman sonlanmayacaktır. Her saat başı yeniden çalışacaktır.[/box]

ThreadLocal Sınıfı

Thread Local konusu ilginç, ilginç olduğu kadar da kullanışlı bir yapıdır. Birçok Java programcısının adını bile duymadığı bu güzel yapıyı basitçe anlatmaya çalışacağım.

Thread Local, veri saklamak için kullandığımız geçerlilik bölgelerine benzer bir yapı olarak düşünülebilir. Web uygulamalarında scope kavramı adındaki makalemde bu konuya değinmiştim.

Aynı request scope, session scope gibi herhangi bir nesneyi, bir thread içerisine set etmemizi sağlar. Thread Local içerisine set edilen nesnelere, aynı thread’e erişilen her yerden ulaşılabilir. Bunun yanında her bir thread’in kendi özel Thread Local değişkeni vardır. Bir thread başka bir thread’in Thread Local değişkenlerine erişemez.

Normalde kod yazarken yarattığımız nesneler birden fazla thread tarafından erişilerek paylaşılabilir. Bunu istemiyorsak ve her bir thread’in kendi yerel değişkenlerini kullanmak istiyorsak ThreadLocal kullanılabilir.

Başka bir deyişle thread-safe olmayan bir nesnemiz varsa ve synchronization işlemlerinden kaçınmak istiyorsak nesnelerimizi thread’e özel tanımlarız.

Pek çok frameworkte ThreadLocal kullanımıyla karşılaşırız. Örneğin varolan bir transaction ThreadLocal’de saklandığında, bu transaction’ı her bir metoda parametre göndermeye gerek kalmaz. Bu sayede rahatça istendiği zaman istendiği yerden erişilebilir.

Örneğin bir projede veri tabanına bağlanmak için kullandığımız Connection, PreparedStatement ve ResultSet arabirimlerini ThreadLocal değişkeni olarak yaratmak mantıklı olabilir.

[codesyntax lang=”java” lines=”no”]

private static ThreadLocal<Connection> connection = new ThreadLocal<Connection>();

private static ThreadLocal<List<PreparedStatement>> stmtList = new ThreadLocal<List<PreparedStatement>>();

private static ThreadLocal<List<ResultSet>> rsList = new ThreadLocal<List<ResultSet>>();

[/codesyntax]

Bağlantıları yöneten sınıfta Connection, PreparedStatement listesi ve ResultSet listesi saklayan ThreadLocal değişkenler tanımladığımızı düşünelim. Bağlantıyı connection pool’dan alırken ThreadLocal tanımlanan bu değişken değerleri set’lenerek daha sonra get metodu ile değerleri okunabilir.

Bu sayede katmanlar arasındaki ilişki bağımsız olarak kalmış olur ve nesneler parametre olarak gönderilmeden ilgili sınıflardan çağrılarak kullanılabilir.

ThreadLocal sınıfı Java 2’den beri var olan bir sınıftır. İçerisinde get, set, initialValue ve remove metotları bulunur.

get() : ThreadLocal değişkeninin değerini döndürür.

set(T value) : ThreadLocal değişkeninin değerini günceller.

initialValue() : ThreadLocal değişkeninin ilk değerini döndürür.

remove() : ThreadLocal değişkeninin değerini siler. (Java 5 ile eklendi)

Bu 4 metodun yanında bir de parametre almayan default constructor’ı bulunan ThreadLocal sınıfını daha da detaylı olarak incelemek için lütfen tıklayın.

Veri Saklama Alanları

Uygulama geliştirirken verilerimizi bir şekilde saklamamız gerekir. Saklama süremize ve verilerimizin boyutuna göre hafızanın bazı bölümlerini ya da sabit diski kullanırız.

1-      Yığın : (Stack) RAM (Random Access Memory) yani hafıza içerisinde bir bölgedir. Yığında  nesnelerin referansları tutulur. Java derleyicisi programı oluşturmadan önce yığın üzerinde oluşturulacak olan verilerin boyutlarını ve ömürlerini bilmek zorundadır. Yığın, dinamik değişkenleri saklamanın yanında, metotların geri dönüş adresini saklamak, yerel değişkenleri depolamak ve metotlara parametre göndermek için de kullanılır.
Yığın bellek alanı, program çalışmaya başladığı anda belirlenir ve daha sonra bu alanın boyutu değiştirilemez. Bu alan, işletim sistemi tarafından genellikle kısıtlı şekilde belirlenir. Bu sebeple yığın üzerindeki işlemlerde hafıza birimi taşması sorunu yaşanabilir (stack overflow).

2-      Yığma bellek : (Heap) Yığma bellek alanı daha geniş alanlı ve kalıcı bir alandır. Genellikle ne kadar yer kaplayacağı belli olmayan nesnelerin geçici olarak saklanması için kullanılır. Programcı new saklı kelimesiyle oluşturduğu tüm nesneleri bu alanda saklar. Yığma bellek alanının okunması veya yazması yığın alanı kadar hızlı değildir.

3-      Statik Alan : Bu alan da bellek üzerinde bulunur. Statik alanda yer alan veriler, programın çalışması süresince burada saklanırlar. Nesne hafızaya yüklendiği anda statik tanımlanan değişken ve metotlar yaratılırlar.

4-      Programın kod alanı : Verileri hafızada sakladığımız alanlardan bahsettik. Ancak bu verileri işlemciye gönderebilmek için makine kodunun göndereceği komutların da bir yerlerde saklanması gerekir. İşte Code Segment denilen kod alanında da işlemciye gönderilecek komutlar saklanır.

5-      Sabit disk : Bazı durumlarda uygulamaların içerisinde oluşturduğumuz nesnelerin, uygulama sonlandıktan sonra bile varlıklarını sürdürmelerini isteriz. Bu gibi durumlarda sabik disk dediğimiz fiziksel alanlarda veriler depolanır.

Çöp Toplayıcısı (Garbage Collector)

Eskiden hafıza yönetimi tamamen programcının elindeydi. Hafızadan yer ayırma işlemleri, belleğin kullanıldıktan sonra serbest bırakılması gibi işlerin yapılması gerekiyordu. Nesneye yönelik programlama dilleriyle beraber çöp toplama mekanizmaları geliştirildi. Bu sayede referanslarını kaybeden, kullanılmayan tüm nesnelerin hafızadan silinmesi Garbage Collector denilen yapı sayesinde ele alınıyor. Yazılımcı sadece kodunu yazıyor ve silinmesi gereken nesnelerle ilgilenmiyor. Java’nın her versiyonu ile beraber GC mekanizmasının algoritması da geliştiriliyor. Nesnelerin hafızadan ne zaman silineceğini programcı bilmiyor.

gc() metodu :

Çöp toplama mekanizmasını tetiklemek mümkündür. System sınıfındaki gc() metodu çağrıldığında çöp toplayıcısına “hadi bakalım çalış” demiş oluruz. Ancak bizim bunu dememiz çalışacağı anlamına gelmez. Hafıza aşırı yüklendiğinde ya da belli süre sonunda değil, tamamen kendi algoritmasına göre çalışır.

finalize() metodu :

Temizlik işlemleri başladığında çöp toplayıcısı, silinecek nesne içerisinde finalize() adında özel bir metot arar. Nesne hafızadan silinmeden hemen önce bu metot çalıştırılır. Dolayısıyla kullandığımız nesne hafızadan silinmeden hemen önce yapılmasını istediğimiz işler varsa, bu metodu tanımlayarak içerisinde yapmalıyız. Metodun tanımı aşağıdaki gibidir.

[codesyntax lang=”java” lines=”no”]

@Override
protected void finalize() throws Throwable {
	// yapılacak işler
	super.finalize();
}

[/codesyntax]

finalize() metodu bir defa, nesne hafızadan silinirken çalıştırılır.

Logging API

Projelerde loglama hem son kullanıcılar hem de sistem yöneticileri için uygulamanın devamlılığı açısından çok önemlidir. Java’da karşılaşılan güvenlik hataları, konfigürasyon hataları, performans sıkıntıları veya uygulamadaki bug’lar için Logging API kullanılır.

java.util.logging paketinde tanımlanmıştır.

Logging API, bilgileri metin veya XML formatında log kayıtlarını hafızaya, output streamlere, konsola ya da dosyaya yazabilir.

Logging API’yi kullanabilmek için sırasıyla şunlar yapılır :

  1. Logger objesi yaratılır.
  2. Logger objesi konfigure edilir.
  3. Logger objesine mesajlar gönderilir.

Logger objesini yaratmak için java.util.Logger sınıfındaki static getLogger() metodu kullanılır.

Logger logger = Logger.getLogger(“paket.Sinif”);

NOT : Genellikle biricikliği sağlamak için parametre olarak paket ve sınıf ismi verilir. (Tüm sınıf ismi)

Logger objesini konfigure etmek için logger objesine handler tanımlanır. Log seviyesi belirlenir. İsteğe bağlı olarak da filtre tanımlanır.

Logging API’si şu handlerları destekler :

  • StreamHandler (default) : Formatlanmış kayıtları OutputStream objesine yazar.
  • ConsoleHandler : System.err objesine yazar.
  • FileHandler : Bir veya daha fazla dosyaya loglama yapar.
  • SocketHandler : Uzak TCP portlarına loglama yapar.
  • MemoryHandler : Hafızaya logları bufferlar.

Logger’a bir handler eklemek için addHandler() metodu kullanılır. Örnek :

logger.addHandler(new FileHandler(“iko.log”));

Log Seviyeleri:

–          ALL : Tüm mesajlar loglanır.

–          CONFIG : Static konfigurasyon mesajları için kullanılır.

–          FINEST :  Çok fazla detaylı mesajlama için kullanılır.

–          FINER : Daha az ama detaylı mesajlama için kullanılır.

–          FINE : İyi bir mesajlama seviyesidir.

–          INFO : Bilgi mesajlarını loglamak için kullanılır.

–          WARNING : Potansiyel bir problemin ikazlarını loglamak için kullanılır.

–          SEVERE : Çok önemli hataların loglarını yapabilmek için kullanılır.

–          OFF : Loglamayı kapatmak için kullanılır.

Level sınıfından başka sınıflar türeterek kendi seviyemizi yaratabiliriz. Ayrıca setLevel() metodu ile kullanılacak minimum kademeyi seçebiliriz.

Örnek : logger.setLevel(Level.INFO);

Yine aynı şekilde handler objesine de hangi seviyede loglama yapılacağı bilgisini söyleyebiliriz.

Örnek : handler.setLevel(Level.WARNING);

Loglama konfigurasyonu, log için kullanılan ve startup anında okunan konfügurasyon dosyası ile ayarlanabilir. Bu dosya java.util.Properties formatındadır.

 

[codesyntax lang=”java” lines=”no”]

package com.javauzmani.logging;

import java.util.logging.ConsoleHandler;

import java.util.logging.Level;

import java.util.logging.Logger;

/**

 *

 * @author Erkin Pehlivan

 */

public class BasitLoglamaOrnegi {

    public static void main(String[] args) {

        // Logger nesnesi yaratalim

        Logger logger = Logger.getLogger("com.javauzmani.BasitLoglamaOrnegi");

        // konfigure edelim

        logger.addHandler(new ConsoleHandler());

        logger.setLevel(Level.FINE);

        // Farkli seviyelerde log mesajlari

        // loglama icin 7 tane farkli seviye var

        logger.severe("Level:Severe ");

        logger.warning("Level:Warning");

        logger.log(Level.WARNING, "Uyarı mesajı için farklı bir loglama örneği");

        logger.info("Level:info");

        logger.config("Level:configmessage");

        logger.fine("Level:fine");

        logger.log(Level.FINE, "FINE seviyesinde bir loglama örneği");

        logger.finer("Level:finer");

        logger.finest("Level:finest");

    }

}

[/codesyntax]