PDA

View Full Version : درخواست توضیح کد در استفاده از BufferedInputStream



Sina.iRoid
شنبه 10 آبان 1393, 09:58 صبح
سلام.
من کد زیر و اصلا متوجه نمیشم.
در مورد متد مارک اینطور خوندم که برای علامت گذاری موقعیت فعلی Stream به کار میره. اما در کد زیر متوجه true و false کردن و گذاشتن مقادیری مثه 32 نمیشم. ممنون میشم اگر یه توضیح کوچیکی در این مورد بدین.


import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;


public class BufferedInputStreamDemo {

String str = "This is a © copyright symbol "
+ "but this is &copy not.\n";

byte[] buf = str.getBytes();

ByteArrayInputStream in = new ByteArrayInputStream(buf);

BufferedInputStream bufIn = new BufferedInputStream(in);

int c;
boolean marked = false;

//Constructor
public BufferedInputStreamDemo() throws IOException {

while ((c = bufIn.read()) != -1) {
switch (c) {
case '&':
if (!marked) {
bufIn.mark(32);
marked = true;
} else {
marked = false;
}
break;
case ';':
if (marked) {
marked = false;
System.out.print("(c)");
} else {
System.out.print((char) c);
}
break;
case ' ':
if (marked) {
marked = false;
bufIn.reset();
System.out.print("&");
} else {
System.out.print((char) c);
}
break;
default:
if (!marked) {
System.out.print((char) c);
}
break;
}
}
}
}



import java.io.IOException;




public class DriverClass {

public static void main(String[] args) throws IOException {

new BufferedInputStreamDemo();
}
}


ممنون.

محمد فدوی
شنبه 10 آبان 1393, 22:24 عصر
سلام.
اول ببینیم هدف از برنامه چیه! ما یه رشته داریم و میخوایم اگه توش عبارت ";copy&" وجود داشت به جاش عبارت "(c)" رو قرار بدیم و چاپ کنیم و الزاما از BufferedInputStream برای تشخیص این قالب استفاده کنیم.
خب دونه دونه کاراکترها رو میخونیم تا برسیم به کاراکتر '&'. تو این نقطه با متد mark محل فعلیمون رو یه جا یادداشت میکنیم که یادمون نره و میزان کاراکترهای قابل خوندن رو هم تا قبل از اینکه محل فعلی از دسترس خارج بشه ۳۲ قرار میدیم. حالا باز پیش میریم و چیزایی که از اینجا به بعد میبینیم رو چاپ نمیکنیم. اگه اول به کاراکتر ';' رسیدیم خب به جای کل این بخش "(c)" رو چاپ میکنیم و اگه اول به فضای خالی (Space) رسیدیم میفهمیم این چیزی که ما فکر میکردیم ";copy&" بوده، نبوده! پس با متد reset به جای قبلیمون (همون جایی که با mark مشخصش کردیم) برمیگردیم و این دفعه چیزایی که این وسط وجود داره رو چاپ میکنیم!
البته این برنامه یکم ناقصه برای این هدف ولی تمرین خوبیه. اگه طرز کار mark رو متوجه نشدی تو اینترنت مثال زیاد هست. اینو (http://www.tutorialspoint.com/java/io/bufferedinputstream_mark.htm) ببین.