第十七天总结:
装饰设计模式:
为了增强对象的功能而出现了。
import java.io.*;
class fuxi
{
public static void main(String[] args)throws IOException
{
/*
MyBufferedReadero mr=new MyBufferedReadero(new FileReader("F:/java32/0412/xxx.txt"));
String s=null;
while ((s=mr.myReadLine())!=null)
{
System.out.println(s);
}
mr.myClose();
*/
/*
MyLineNumberReadero mn=new MyLineNumberReadero(
new FileReader("F:/java32/0412/xxx.txt"));
String s=null;
mn.mySetNumber(1000);
while ((s=mn.myReadLine())!=null)
{
System.out.println(mn.myGetNumber()+":"+s);
}
mn.myClose();
*/
/*
演示字节流copy的程序
*/
/*
FileInputStream fi=new FileInputStream("F:/java32/0412/001.mp3");
FileOutputStream fo=new FileOutputStream("F:/java32/0411/009.mp3");
byte[] by=new byte[1024*4];
int num=0;
while ((num=fi.read(by))!=-1)
{
fo.write(by,0,num);
}
fi.close();
fo.close();
*/
SystemIN sn=new SystemIN();
//sn.byArray();
sn.byBuffer();
}
}
class MyBufferedReadero
{
private Reader r;
MyBufferedReadero(Reader r)//构造函数给对象初始化,缓冲区必须要有流存在才有意义
{
this.r=r;
}
public String myReadLine()throws IOException
{
StringBuilder sb=new StringBuilder();
int ch=0;
while ((ch=r.read())!=-1)//逐个字符的读
{
if(ch=='/r')//读到/r表示要换行了,结束本次循环,继续下次循环
continue;
else if(ch=='/n')//读到/n则表示这一行结束了,则把本行用字符串形式输出
return sb.toString();
else
sb.append((char)ch);
//正常读取数据的时候,是逐个读的,每读到一个就用字符的形式存入容器
}
//下面是用来判断尾行没有回车的时候的
if(sb.length()!=0)//尽管没有回车符,但是该容器中照样是有字符的
return sb.toString();//所以仍然能转化成字符串
return null;//当读到结尾了没有下一行了,则返回空
}
public void myClose()throws IOException
{
r.close();
}
}
/*
模拟一个lineNumberReader对象,该对象是继承的缓冲区的
*/
class MyLineNumberReadero extends MyBufferedReadero
{
private Reader r;
private int number;//因为此类有一个取行方法,所以我们可以定义一个行数
MyLineNumberReadero(Reader r)
{
super(r);
}
public void mySetNumber(int number)
{
this.number=number;
}
public int myGetNumber()
{
return number;
}
//在被外界调用的时候,myReadLine每被循环一次,则number则会加一次,输出该次行数
public String myReadLine()throws IOException
{
number++;
return super.myReadLine();
}
public void myClose()throws IOException
{
super.myClose();
}
}
/*
定义一个类模拟机BuffererInputStream类
1;缓冲区是用来临时存取数据的,我们可以用指定长度的数组来模拟
2;缓冲区要存在,必须要有流,没有流,缓冲区是没有任何存在的意义的
3;read方法之所以返回的是int型的,是因为字节是1个八位的,如果在
文件中取到了八个1则表示了-1,read就不会再继续读下去,而这却并不是
我们需要的结果,所以在底层read方法把所读到的字节提升到了int型,是通过
把该字节与上255得到的。
*/
class MyBufferedInputStreamo
{
private InputStream in;
private byte[] by=new byte[1024*4];
private int pos=0,count=0;
MyBufferedInputStreamo(InputStream in)
{
this.in=in;
}
public int myRead()throws IOException
{
if (count==0)//当数组中没有值的时候,即要抓数据的时候
{
count=in.read(by);//流一次存到缓冲区的字节个数
if (count<0)//这里只的是数组都被取过了,count被减没了
return -1;
pos=0;//这个数组值读完了,则指针就该归零了,在从0取
byte b=by[pos];//取数据
pos++;
count--;
return b&255;
}
else if (count>0)//当数组中有数据的时候,外部可以直接取,不用重新填写数组
{
byte b=by[pos];
pos++;
count--;
return b&255;
}
return -1;
}
public void myClose()throws IOException
{
in.close();
}
}
/**
通过键盘录入数据,将录入的数据打印在控制台,当录入的是over的时候,录入结束
1.获取键盘录入;System.in.
2.当录入回车时,将录入的数据打印,回车在win地下室/r/n两个字符
需要定义一个容器,将录入的数据内容进行临时存储
3.判断录入的数据是否是over
下面分别是以数组作为容易和以StringBuilder作为容易的两种写法
*/
class SystemIN
{
public void byArray()throws IOException
{
byte[] by=new byte[1024*4];
int pos=0;//为了操作数组而存在的
while (true)//需要重复录入
{
int ch=System.in.read();
//拆分为InputStream in=System.in;int ch=in.read();
if (ch=='/r')//因为是判断值,最好用switch
continue;//结束本次循环,继续下次循环
else if (ch=='/n')
{
String s=new String(by,0,pos);
if ("over".equals(s))
return;
System.out.println("print:"+s);
pos=0;//打印完一次要归零,好让下次能继续从0角标开始
}
else
by[pos++]=(byte)ch;
}
}
/*
用Buffer作为容器时候的程序
*/
public void byBuffer()throws IOException
{
StringBuilder sb=new StringBuilder();
while (true)
{
int ch=System.in.read();
if(ch=='/r')
continue;
else if(ch=='/n')
{
String s=sb.toString();
if ("over".equals(s))
return;
System.out.println("print:"+s);
sb.delete(0,sb.length());//打印完需要清空sb,才能让下一次录入从头开始存
}
else
sb.append((char)ch);//这里是转换成字符,所以中文因为编码的原因不能被打印
}
}
}
第十七天总结0412
最新推荐文章于 2024-04-28 15:02:01 发布