30 Kasım 2016 Çarşamba

JavaCompiler Sınıfı

getStandardFileManager metodu
Şöyle yaparız.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = 
  new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(
            diagnostics, null, null);
getTask metodu
Şöyle yaparız.
StandardJavaFileManager fileManager = compiler.getStandardFileManager(
            diagnostics, null, null);
Iterable<? extends JavaFileObject> compilationUnits = fileManager
            .getJavaFileObjectsFromStrings(Arrays.asList("foo.java"));
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
            diagnostics, null, null, compilationUnits);
boolean success = task.call();


ToolProvider Sınıfı

getSystemJavaCompiler metodu
Şöyle yaparız.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();


29 Kasım 2016 Salı

java.sql.Date Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.sql.Date;
Bu sınıf sadece tarih bilgisini saklar. Saat bilgisini saklamaz.

constructor - default
Şöyle yaparız. Saat, dakika, saniye bilgisini kaybederiz.
java.util.Date sqlDate = new java.util.Date ();
constructor - long
Şöyle yaparız.
java.util.Date now = new java.util.Date ();
java.sql.Date sqlDate = new java.sql.Date (now.getTime());
Şöyle yaparız.
java.sql.Date sqlDate = new Date (0);
getTime metodu
Şöyle yaparız.
java.sql.Date sqlDate = new java.util.Date (sqlDate.getTime())
toInstant metodu
Bu metod exception atar.
This method always throws an UnsupportedOperationException and should not be used because SQL Date values do not have a time component.
toLocalDate metodu
Şöyle yaparız.
LocalDate date = sqlDate.toLocalDate();

ObjectInputStream Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.io.ObjectInputStream;
Header
ObjectInputStream verinin başına 4 byte yazar. İlk iki byte magic number, diğer iki byte ise stream version değeridir.

Veri Formatı
ObjectInputStream kendi içinde 1024 byte uzunluğunda bir bellek alanı bulundurur. Bu bellek Data + Block Data Marker alanına kadar okumak için yeterlidir.

Aşağıdaki kodda 4000 byte uzunluğunda bir dizi dosyaya yazılıyor. Daha sonra biner byte olarak okunuyor.
FileOutputStream output = new FileOutputStream("test.txt");
ObjectOutputStream stream = new ObjectOutputStream(output);

byte[] bytes = new byte[4000];

stream.write(bytes);
stream.close();

FileInputStream input = new FileInputStream("test.txt");
ObjectInputStream s = new ObjectInputStream(input);


byte[] buffer = new byte[1000];
int read = s.read(buffer);

while (read > 0) {
    System.out.println("Read " + read);
    read = s.read(buffer);
}

s.close();
Çıktı olarak şunu alırız. Sebebi ise Block Data Marker'a kadar okunacak şekilde ayarlanması.
Read 1000
Read 24
Read 1000
Read 24
Read 1000
Read 24
Read 928
constructor
Bir InputStream alır. Şöyle yaparız.
File file = new File("out.dat");
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
readObject metodu
Okuma örneği. Exception'ları dikkate almadım
MyObject o = (MyObject) in.readObject();

28 Kasım 2016 Pazartesi

SearchResult Sınıfı

Giriş
Şu satırı dahil ederiz.
import javax.naming.directory.SearchResult;
getNameInNamespace metodu
Şöyle yaparız.
NamingEnumeration retEnum = ...;

SearchResult sr = (SearchResult) retEnum.next();
System.out.println (">>" + sr.getNameInNamespace());

NamingEnumeration Sınıfı

Giriş
Şu satırı dahil ederiz.
import javax.naming.NamingEnumeration;
Kullanım
Şöyle yaparız.
DirContext ctx = new InitialDirContext (...);
NamingEnumeration results = ctx.search (...,...,...);
hasMore metodu
Şöyle yaparız.
NamingEnumeration results = ...;
while (results.hasMore()) {
  ...  
}
next metodu
Şöyle yaparız.
SearchResult sr = (SearchResult) results.next();

ConcurrentModificationException Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.util.ConcurrentModificationException;
ConcurrentModificationException Nedir?
İsmi sanki iki farklı thread aynı veri yapısını değiştirince fırlatılıyormuş gibi görünse de, tek thread kullanırken de fırlatılabilir. Açıklaması şöyle
Note that this exception does not always indicate that an object has been concurrently modified by a different thread. If a single thread issues a sequence of method invocations that violates the contract of an object, the object may throw this exception. For example, if a thread modifies a collection directly while it is iterating over the collection with a fail-fast iterator, the iterator will throw this exception.
ConcurrentModificationException kodun doğru çalıştığı konusunda garanti vermez çünkü Iterator'ün fail fast özelliği garanti değildir.

ConcurrentModificationException Ne Zaman Atılır?
Java'da iterator ile bir listeyi dolaşırken, liste değişirse bu exception atılır. Yapılan en klasik hata diziden eleman silmek için iterator.remove() kullanmak yerine collection.remove() metodunun kullanılması. iterator.remove() metodunun açıklaması şöyle.
The behavior of an iterator is unspecified if the underlying collection is modified while the iteration is in progress in any way other than by calling this method.
Sebebi ise iterator'ün next() metodu listenin eleman sayısını kontrol etmesi.

1.
Yanlış kullanım şekli şöyle
for (Iterator<String> i = c.iterator(); i.hasNext();) {  
  String s = i.next();
  if(s.equals("lalala")) {
    c.remove(s);
  }
}
Doğru kullanım şekli şöyle
for (Iterator<String> i = c.iterator(); i.hasNext();) {  
  String s = i.next();
  if(s.equals("lalala")) {
    i.remove();
  }
}
while döngüsü ile şöyle yaparız.
Iterator<Job> iter = goodJobs.iterator();
while (iter.hasNext()) {
  Job j = iter.next();
  if (j.getArrivalTime() > time) {
    iter.remove();
  }
}
2. Yanlış kullanım şekli şöyle
ArrayList<Integer> answers = new ArrayList<Integer>();
...
for(Integer value : answers){
  answers.add(1+value);
  answers.add(1*value);
}
Doğru kullanım şekli şöyle
ArrayList<Integer> toAdd=new ArrayList<Integer>();
for(Integer value : answers){
  toAdd.add(1+value);
  toAdd.add(1*value);
}
answers.addAll (toAdd);
Yanılsamalar
hasNext metodu bu exception'ı atmaz. hasNext() metodu şöyledir. Sondan bir önceki elemanı silersek size 1 küçülür ve hasNext false döner.
public boolean hasNext() {
    return cursor != size;
}
Dolayısıyla aşağıdaki kod aslında hatalı olduğu halde düzgün çalışıyormuş gibi görünür. Sebebi ise B silindikten sonra, iterator 1. halen 1. indekstedir. Yani C elemanı B'nin yerine kaymıştır. Bir sonra hasNext() false döner ve döngüden çıkar. Dolayısıyla next() hiçbir zaman çağrılmadığı için exception atılmaz.
List<String> strings = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (String string : strings)
    if ("B".equals(string))
        strings.remove("B");
System.out.println(strings);