PushbackInputStream PushbackInputStream java.lang.Object java.io.InputStream java.io.FilterInputStream java.io.PushbackInputStream Kılgıladığı Arayüzler: Closeable, AutoCloseable Bildirimi: public class PushbackInputStream extends FilterInputStream Aşağıdaki program, giriş akımının ilk harfine tekrar dönüşü sağlıyor. import java.io.*; public class Demo { public static void main(String[] args) throws IOException { byte[] byteArray = new byte[]{'A', 'N', 'K', 'A', 'R', 'A'}; File file = new File("Ankara.txt"); // FileOutputStream akımı yarat. FileOutputStream fOutStream = new FileOutputStream(file); fOutStream.write(byteArray); // PushbackInputStream nesnesi yarat. InputStream inStream = new FileInputStream(file); PushbackInputStream pInStream = new PushbackInputStream(inStream); // dosyayı oku int charValue = pInStream.read(); System.out.println("Akımın ilk harfini oku : " + (char) charValue); // unread() metodunu çağır pInStream.unread(charValue); System.out.println("ilk karektere dön ve oku " + "char."); System.out.print("Akımın sonraki karekteri : "+(char) pInStream.read()); } } /** Akımın ilk harfini oku : A ilk karektere dön ve oku char. Akımın sonraki karekteri : A */ Bir giriş akımını bir byte geriye iter. Bazı giriş akımlarında ++, == gibi simgeler var olabilir. Bunların byte byte okunması işlevleriyle uyuşmayabilir. Bu tip verilerin önceden bulunarak, gerçek işlevlerini belirten stringlere dönüştürülmesi istenebilir. Bunu yapmak için PushbackInputStream sınıfının unread() metotlarından birisi kullanılır. Aşağıdaki örnek, ‘==’ ile ‘=’ simgelerinden hangisinin geleceğni belirliyor. bais akımında okunan == yerine .eq. stringini, ‘=’ yerine ise ‘<-’ simgesini koyuyor. // unread() metodu import java.io.*; class Demo { public static void main(String args[]) throws IOException { String s = "if (x == 4) x = 0;\\n"; byte buf[] = s.getBytes(); ByteArrayInputStream bais = new ByteArrayInputStream(buf); PushbackInputStream pis = new PushbackInputStream(bais); int c; while ((c = pis.read()) != -1) { switch (c) { case '=': if ((c = pis.read()) == '=') System.out.print(".eq."); else { System.out.print("<-"); pis.unread(c); } break; default: System.out.print((char) c); break; } } } } /** if (x .eq. 4) x <- 0;\n */ Aşağıdaki program, giriş akımından gelen ++ operatörü yerine Artı Artı yazıyor. /* * */ Java PushbackInputStream Example import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.PushbackInputStream; public class JavaPushbackInputStreamExamples { public static void main(String[] args) { //example expression you want to evaluate in your program String strExpression = "a = a++ + b;"; /* * Bu ifade hesaplanırken, operatörün ++ mı * yoksa yalnızca + mı olduğunu bilmek * gerekir. Ya okumaya devam edilir ya da + dan * hemen sonra başka bir + gelip gelmediği denetlenmelidir. */ // ifadeden bir byte oku byte bytes[] = strExpression.getBytes(); ByteArrayInputStream bis = new ByteArrayInputStream(bytes); /* * PushbackInputStream provides below given two constructors. * * 1) PushbackInputStream(InputStream is) * creates PushbackInputStream from provided InputStream object * * 2)PushbackInputStream(InputStream is, int size) * Creates PushbackInputStream from specified InputStream object * with pushback buffer of specified size. */ //create PushbackInputStream from ByteArrayInputStream PushbackInputStream pis = new PushbackInputStream(bis); int ch; try { while( (ch = pis.read())!= -1) { // ilk + simgesi geldi if(ch == '+') { // sonraki karekteri oku; + mı, değil mi? if( (ch = pis.read()) == '+') { System.out.print("Artı Artı"); } else { //başka + olmadığı için bir harf geri git pis.unread(ch); System.out.print("+"); } } else { //karekteri yaz System.out.print((char)ch); } } } catch(IOException ioe) { System.out.println("Okuma hatası :" + ioe); } } } /* Output of this program would be, a = aPlus Plus + b; */