22 Haziran 2017 Perşembe

JAX-RS @Produces Anotasyonu

Giriş
Bu anotasyon rest çağrısının ne tipten cevap vereceğini belirtir. Bu anotasyonu kullanırken Java'da tanımlı olan sabitler kullanılabilir veya metin olarak ta kullanılabilir. Metin olarak kullanım pek akıllıca değil çünkü yazım hatası olabiliyor.

Şu kod yanlış
@Produces("appplication/json")
Şöyle yaparız.
@Produces("application/json")

21 Haziran 2017 Çarşamba

IdentityHashMap Sınıfı

Giriş
Map arayüzünü gerçekleştirir. Açıklaması şöyle
This class implements the Map interface with a hash table, using reference-equality in place of object-equality when comparing keys (and values).
Key nesneleri bulmak için "identity" kullanılır. k1.equals (k2) yerine reference equality yani k1 == k2 yöntemini kullanır

Aslında bu sınıf nadir kullanılır ve Map arayüzünü bazı yerlerde bozar. Açıklaması şöyle
This class is not a general-purpose Map implementation! While this class implements the Map interface, it intentionally violates Map's general contract, which mandates the use of the equals method when comparing objects. This class is designed for use only in the rare cases wherein reference-equality semantics are required.
constructor
Şöyle yaparız.
IdentityHashMap map = new IdentityHashMap();
put metoud
Şöyle yaparız.
map.put("A", new String("B"));
remove metodu
Key ve Value nesneleri belirtilen değerler ile aynı ise siler. Şöyle yaparız.
map.remove("A", new String("B")

20 Haziran 2017 Salı

Matcher Sınıfı

find metodu
Eşleşmeleri teker teker bulur.

Örnek
Şöyle yaparız.
String line = "XYZ Q|1|^123456<CR>";
Pattern queryRegex=Pattern.compile("Q\\|\\d\\|(.+?)<CR>");

Matcher queryMatcher=queryRegex.matcher(line);
if (queryMatcher.find()) {
    System.out.println("Group 0: " + queryMatcher.group(0));
    System.out.println("Group 1: " + queryMatcher.group(1));
}
İlk çıktı her zaman tüm eşleşmedir. İkinci sonuç ise ilk gruptur.
Group 0: Q|1|^123456<CR>
Group 1: ^123456
Bazen find metodunu döngü içinde kullanmak gerekir.
String s = "...";
Matcher m = Pattern.compile("[^,()]+|\\([^)]*\\)").matcher(s);
while (m.find())
  System.out.println(m.group());
group metodu
group (0) değerini yani tüm eşleşmeyi verir.

Örnek
$...$ arasındaki kelimeleri bulmak için şöyle yaparız.
String x = "Hey my name is $name$; I have $years$ years old," + 
           "and I love play $sport$ and I live in $country$ !";
Pattern p = Pattern.compile("\\$\\w+\\$");
Matcher m = p.matcher(x);
Map<String, Integer> map = new LinkedHashMap<>();

while(m.find()) {
  String in = m.group().substring(1,m.group().length()-1);
  map.put(in, in.length());
}
Örnek
Şöyle yaparız.
Pattern p = Pattern.compile("(?<!\\d)\\d{2}:\\d{2}(?!\\d)");
Matcher m = pattern.matcher(inputString);

if (m.find()) {
    System.err.println("Time: " + m.group());
}
group metodu - int
Belirtilen yakalama grubunu döndürür.
Örnek
Elimizde şöyle bir string olsun.
String timeStr = "10:15:34";
Şöyle yaparız.
Pattern p = Pattern.compile("(\\d+):(\\d+):(\\d+)");
Matcher m = p.matcher(timeStr);
if (m.matches()) {
  int hours = Integer.parseInt(m.group(1));
  int minutes = Integer.parseInt(m.group(2));
  int seconds = Integer.parseInt(m.group(3));
  ...
}
groupCount metodu
Tüm eşleşen grupları verir. Şöyle yaparız.
String str="asd14sd67fgh007";
Pattern pattern = Pattern.compile("\\w+([0-9]+)\\w+([0-9]+)");
Matcher matcher = pattern.matcher(str);
for(int i = 0 ; i < matcher.groupCount(); i++) {
  matcher.find();
  System.out.println(matcher.group());
}
matches metodu
Verilen string ile düzenli ifadenin tam olarak eşleşip eşleşmediğini döner. C#'taki RegEx.IsMatch metodu ile aynıdır.
String s = "...";
Pattern pattern = Pattern.compile("...");

Matcher matcher = pattern.matcher(s);
// Check if pattern matches 
if (matcher.matches()) {
  ...
}  
reset metodu
Ne işe yarar bilmiyorum. Şöyle yaparız.
Matcher matcher = ...;
matcher.reset();

Month Sınıfı

Giriş
Bu sınıf saat dilimi bilmez. Bu sınıf ile YearMonth Sınıfı benzeşiyorlar.

getDisplayName metodu
Şöyle yaparız.
String monthName = yearMonth.getMonth().
  getDisplayName(TextStyle.SHORT, Locale.ENGLISH);
Yılla beraber yazdırınca çıktı olarak şunu alırız.
Nov(2015)
Dec(2015)
Jan(2016)
Feb(2016)
Mar(2016)
Apr(2016)

FileChannel Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.nio.channels.FileChannel;
Dosyanın işletim sistemi tarafından kilitlenemsini sağlar.

seek() ve position() çağrıları ile belirtilen konuma gitmek mümkün. Kullanması daha kolay olan olan RandomAccessFile Sınıfı da benzer şekilde seek() ve position() çağrıları sunuyor.

constructor
FileInputStream sınıfı tarafından yaratılabilir. Şöyle yaparız.
FileChannel fc = new FileInputStream(...).getChannel();
FileOutputStream sınıfı tarafından yaratılabilir. Şöyle yaparız.
FileChannel fc = new FileOutputStream(...).getChannel();
RandAccessFile tarafından yaratılabilir. Şöyle yaparız.
// Get a file channel for the file
File file = new File("filename");
FileChannel fc = new RandomAccessFile(file, "rw").getChannel();
close metodu
Şöyle yaparız.
fc.close();
lock metodu
FileLock nesnesi oluşturur. Şöyle yaparız.
FileChannel fc = ...;

// Use the file channel to create a lock on the file.
// This method blocks until it can retrieve the lock.
FileLock lock = fc.lock();
map metodu
MappedByteBuffer nesnesi döner. Okumak için şöyle yaparız. İkinci parametre offset, üçüncü parametre length içindir.
MappedByteBuffer mbb = fc.map(MapMode.READ_ONLY, 0, 4l);
Yazmak için şöyle yaparız.
MappedByteBuffer mbb = fc.map(
  FileChannel.MapMode.READ_WRITE,
  0,                            // offset
  array.length * Integer.BYTES  // length
);
open metodu - Path
Okumak için şöyle yaparız.
String fname = ...;
try (FileChannel fc = FileChannel.open(Paths.get(fname))) {
  ...
} catch (IOException ex) {
  ...
}
Yazmak için şöyle yaparız.
FileChannel fc = FileChannel.open(Paths.get("a.txt"),StandardOpenOption.WRITE);
Mevcut dosyayı sıfırlama ve okuma ve yazma için şöyle yaparız.
File file = ...;
try (FileChannel fc = FileChannel.open(
  file.toPath(),
  StandardOpenOption.READ,
  StandardOpenOption.WRITE,
  StandardOpenOption.CREATE,
  StandardOpenOption.TRUNCATE_EXISTING
)) {
  ...
}
position metodu
Şöyle yaparız.
fc.position(14);
transferFrom metodu
Destination Channel nesnesine, Source Channel nesnesinden kopyalama yapar. Şöyle yaparız.
FileChannel source = ...;
FileChannel destination = ...;
destination.transferFrom(source, 0, source.size());
transferTo metodu
Source Channel nesnesinden, Destination Channel nesnesine kopyalama yapar. Şöyle yaparız.
void fileCopyUsingNIOChannelClass() throws IOException 
{
  File fileToCopy = new File("c:/temp/testoriginal.txt");
  FileInputStream inputStream = new FileInputStream(fileToCopy);
  FileChannel inChannel = inputStream.getChannel();

  File newFile = new File("c:/temp/testcopied.txt");
  FileOutputStream outputStream = new FileOutputStream(newFile);
  FileChannel outChannel = outputStream.getChannel();

  inChannel.transferTo(0, fileToCopy.length(), outChannel);

  inputStream.close();
  outputStream.close();
}
tryLock metodu
FileLock nesnesi oluşturur. Şöyle yaparız.
FileChannel fc = ...
FileLock lock = fc.tryLock();
if(lock != null){
  ...
}
write metodu
Şöyle yaparız.
ByteBuffer buf = ...;
fc.write (buf);
Kilidi otomatik olarak alıp bırakmak için şöyle yaparız.
try(final FileOutputStream fos = new FileOutputStream(".queue", true);
    final FileChannel chan = fos.getChannel()){
    chan.lock();
    chan.write(ByteBuffer.wrap(message.getBytes()));
}