PushbackInputStream

advertisement
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;
*/
Download