25 Eylül 2019 Çarşamba

System Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.lang.System;
System sınıfı bence tam bir keşmekeş. İçinde ilgili ilgisiz her şey var.

arraycopy metodu
İmzası şöyle
public static native void arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);
Her JVM mümkün olan en hızlı şekilde çalışmak için native olarak kodluyor. İki array'i kopyalamak için kullanılır. Şöyle yaparız.
byte[] buffer = new byte[4096];
int noOfBytes = 10;
byte[] data = new byte[noOfBytes];
System.arraycopy(buffer, 0, data, 0, noOfBytes);
clearProperty metodu
Şöyle yaparız.
System.clearProperty("mapred");
currentTimeMillis metodu
Açıklaması şöyle.
System.currentTimeMillis() is implemented using the GetSystemTimeAsFileTime method, which essentially just reads the low resolution time-of-day value that Windows maintains. Reading this global variable is naturally very quick - around 6 cycles according to reported information.
Süre ölçmek için kullanılabilir.
long startTime = System.currentTimeMillis();
...
if (System.currentTimeMillis() - timer > 1000) {...}
err metodu
Örnek
error akımına yazmak için şöyle yaparız.
System.err (variable)
Örnek
err akımını kapatır herşeyi out akımına yazmak için şöyle yaparız.
public static void disableWarning() {
  System.err.close();
  System.setErr(System.out);
}
exit metodu
İmzası şöyle
System.exit(int);
Şöyle yaparız.
System.exit(0);
gc metodu
İmzası şöyle
System.gc();
getenv metodu
getenv() vs getProperty() yazısına taşıdım.

getProperty metodu
getenv() vs getProperty() yazısına taşıdım.

getSecurityManager metodu
Örnek ver

identityHashCode metodu
Nesnenin hashCode() metodu override edilse bile JVM tarafından verilen hashCode değerine erişebilmemizi sağlar.

in metodu
Örnek ver
System.in (variable)
lineSeparator metodu
Şöyle yaparız.
String text=System.lineSeparator();
System.out.println(text);
loadLibrary metodu
Bir DLL'i yüklemek için kullanılır. Runtime sınıfı da DLL yükleyebilir.
Örnek
Bu çağrı yerine
System.loadLibrary("advapi32");
Şöyle yaparız
Runtime.getRuntime().loadLibrary("C:/Windows/System32/crypt32.dll");
Örnek
OpenCV'yi yüklemek için şöyle yaparız.
System.loadLibrary (Core.NATIVE_LIBRARY_NAME);
Örnek
Bu çağrı bazen static constructor olarak kullanılır. Şöyle yaparız.
public class Foo {
  ...
  static {
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
  }
  ...
}
nanoTime metodu
İmzası şöyle.
public static long nanoTime()
Açıklaması şöyle.
This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time.
Geçen süreyi ölçerken bu çağrının süresi de düşünülebilir. Açıklaması şöyle.
If you are interested in measuring/calculating elapsed time, then always use System.nanoTime(). On most systems it will give a resolution on the order of microseconds. Be aware though, this call can also take microseconds to execute on some platforms.
Süre ölçmek için kullanılır.
long startTime = System.nanoTime ();
...
long endTime = System.nanoTime ()- startTime;
Bu metod Windows'ta yavaş çalışabilir. Açıklaması şöyle.
System.nanoTime() is implemented using the QueryPerformanceCounter/ QueryPerformanceFrequency API (if available, else it returns currentTimeMillis*10^6).QueryPerformanceCounter(QPC) is implemented in different ways depending on the hardware it's running on. Typically it will use either the programmable-interval-timer (PIT), or the ACPI power management timer (PMT), or the CPU-level timestamp-counter (TSC). Accessing the PIT/PMT requires execution of slow I/O port instructions and as a result the execution time for QPC is in the order of microseconds. In contrast reading the TSC is on the order of 100 clock cycles (to read the TSC from the chip and convert it to a time value based on the operating frequency).
Oracle belgesinde şöyle ilginç bir açıklama var.
To compare two nanoTime values

long t0 = System.nanoTime();
...
long t1 = System.nanoTime();

one should use t1 - t0 < 0, not t1 < t0, because of the possibility of numerical overflow.
Normalde t1'in taşma yapıp negatif bir sayı olması için 250 sene kadar zaman geçmesi gerekir. Ancak belki sistemde bir hata olur diye tedbirli olmakta fayda var. Oracle'ın tavsiye ettiği yöntemin çalışmasının sebebi ise çok büyük bir eksi sayı ile çok büyük bir artı sayınının çıkartmasının artı bir sayı olabilmesi :)
out metodu
Örnek ver
System.out (variable)
setErr metodu
Error stream'i yeni nesne ile değiştirir. Şöyle yaparız.
ByteArrayOutputStream errContent = new ByteArrayOutputStream();
System.setErr (new PrintStream(errContent));
setIn metodu
Input stream'i yeni nesne ile değiştirir. Şöyle yaparız.
System.setIn(new ByteArrayInputStream("yes".getBytes()));
System.out.println(System.in.read());// outputs 121
setSecurityManager metodu
Kendi SecurityManager sıfımızı kullanmak için şöyle yaparız.
public static class NoThreadsSecurityManager extends SecurityManager {
  ...
}

public static void main(String[] args) {
  System.setSecurityManager(new NoThreadsSecurityManager());
  ...
}
setOut metodu
Şöyle yaparız.
ByteArrayOutputStream outContent = new ByteArrayOutputStream();
System.setOut (new PrintStream(outContent));
setProperty metodu
Şöyle yaparız.
System.setProperty("mapred", "mapred.input");
Örnek
Şöyle yaparız.
System.setProperty("java.net.useSystemProxies", "true");
Örnek
Şöyle yaparız.
System.setProperty("http.proxyUser", usr);
System.setProperty("http.proxyPassword", pwd);