第十七天总结0412

第十七天总结:
装饰设计模式:
为了增强对象的功能而出现了。
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);//这里是转换成字符,所以中文因为编码的原因不能被打印
  }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值