------- android培训、java培训、iOS培训、.Net培训期待与您交流! ----------
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有对象的功能,并提供加强功能,那么自定义的该类称为装饰类
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能
例如:
class Person
{
public void chifan()
{
System.out.println("吃饭");
}
}
class SuperPerson
{
private Person p;
SuperPerson(Person p)
{
this.p=p;
}
public void superChifan()
{
System.out.println("开胃酒");
p.chifan();
System.out.println("甜点");
System.out.println("来一根");
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p=new Person();
//p.chifan();
SuperPerson sp=new SuperPerson(p);
sp.superChifan();
}
}
装饰与继承的区别:
装饰模式比继承要灵活,避免了继承体系臃肿,而且降低了类与类之间的关系
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能,所以装饰类和被装饰类通常都属于一个体系中的
读取键盘录入:
System.out:对应的是标准输出设备,控制台
System.in:对应的是标准输入设备,键盘
如:通过键盘录入数据,当录入一行数据后,就将该行数据进行打印,如果录入的数据是over,那么停止录入
import java.io.*;
class ReadIn1
{
public static void main(String[] args) throws IOException
{
InputStream in=System.in;
StringBuilder sb=new StringBuilder();
while(true)
{
int ch=in.read();
if(ch=='\r')
continue;
if(ch=='\n')
{
String s=sb.toString();
if("over".equals(s))
break;
System.out.println(s.toUpperCase());//大写
sb.delete(0,sb.length());//清空缓冲区
}
else
sb.append((char)ch);
}
}
}
流操作的基本规律:
通过三个明确来完成。
1:明确源和目的。
源:输入流。InputStream Reader
目的:输出流。OutputStream Writer。
2:操作的数据是否是纯文本。
是:字符流。
不是:字节流。
3:当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘。键盘
目的设备:内存,硬盘,控制台。
File类
用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作
File对象可以作为参数传递给流的构造函数
File类常见方法:
1创建:
boolean createNewFile()
在指定位置创建文件,如果该文件已经存在,则不创建,返回false,和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
boolean mkdir():创建文件夹。
boolean mkdirs():创建多级文件夹。
2删除
boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
void deleteOnExit();在程序退出时删除指定文件。
3判断
boolean exists() :文件是否存在.
isFile()、isDirectory()、isHidden()、isAbsolute()
4获取信息
getName()、getPath()、getParent()、getAbsolutePath() 、long lastModified() 、long length()
Properties:hashtable的子类。是集合中和IO技术相结合的集合容器。
也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。
该对象的特点:可以用于键值对形式的配置文件。那么在加载数据时,需要数据有固定格式:键=值。
IO包中的其它类
打印流:PrintWriter和PrintStream,可以直接操作输入流和文件
该流提供了打印方法,可以将各种数据类型的数据都原样打印
字符打印流:PrintWriter
构造函数可以接收的参数类型:
1、file对象。File
2、字符串路径。String
3、字节输出流。OutputStream
4、字符输出流,Writer。
字节打印流:PrintStream
构造函数可以接收的参数类型:
1、file对象。File
2、字符串路径。String
3、字节输出流。OutputStream
import java.io.*;
class PrintStreamDemo
{
public static void main(String[] args) throws IOException
{
BufferedReader bufr=
new BufferedReader(new InputStreamReader(System.in));
//PrintWriter out=new PrintWriter(System.out,true);//System.out为字节输出流,打印在控制台上
//true代表自动刷新(有换行标记),没有标记的方法不能刷
//把数据存到文件里
PrintWriter out=new PrintWriter(new FileWriter("a.txt"),true);//刷新只对流而言
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
//out.write(line.toUpperCase());//写在缓冲区里了,没有刷新
//out.flush();//没有换行
//打印流直接有打印方法println,带换行
out.println(line.toUpperCase());
//out.flush();
}
out.close();//最后一次(关闭时)刷新一次
bufr.close();
}
}
序列流:SequenceInputStream,对多个流进行合并
管道流:PipedInputStream和PipedOutputStream,输入输出可以直接进行连接,通过结合线程使用
RandomAccessFile:随机访问文件,自身具备读写的方法
该类不算是IO体系中子类,而是直接继承自Object。但是它是IO包中成员,因为它具备读和写功能。
内部封装了一个数组,而且通过指针对数组的元素进行操作。
可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。
其实完成读写的原理就是内部封装了字节输入流和输出流。
通过构造函数可以看出,该类只能操作文件。而且操作文件还有模式:只读r,,读写rw等。
如果模式为只读 r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。如果模式rw。操作的文件不存在,会自动创建。如果存则不会覆盖。
操作基本数据类型的:DataInputStream与DataOutputStream
操作字节数组的:
ByteArrayInputStream :在构造的时候,需要接收数据源,而且数据源是一个字节数组。
ByteArrayOutputStream: 在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组,这就是数据目的地。
因为这两个流对象都操作的数组,并没有使用系统资源,所以,不用进行close关闭。
字符编码:
常见的编码表:ASCII、GBK、Unicode、UTF-8
字符流的出现是为了方便操作字符,更重要的是加入了编码转换
通过子类转换流来完成:InputStreamReader、OutputStreamWriter
通常涉及到字符编码转换时,需要用到转换流
转换流的编码应用:
可以将字符以指定编码格式存储、可以对文本数据指定编码格式来解读、指定编码表的动作由构造函数完成
在两个对象进行构造的时候可以加入字符集
编码:字符串变成字节数组 String-->byte[] : str.getBytes(charsetName);
解码:字节数组变成字符串 byte[]-->String : new String(byte[],charsetName);
import java.util.*;
class EncodeDemo
{
public static void main(String[] args) throws Exception
{
String s="你好";
//byte[] b1=s.getBytes();//字符串变成字节数组,编码
byte[] b1=s.getBytes("GBK");//GBK默认编码
System.out.println(Arrays.toString(b1));//把数组b1变成字符串打印
//String s1=new String(b1,"ISO8859-1");
String s1=new String(b1,"UTF-8");
System.out.println(s1);
//对s1进行iso8859-1编码
//byte[] b2=s1.getBytes("iso8859-1");//不识别中文
byte[] b2=s1.getBytes("UTF-8"); //都识别中文造成的
System.out.println(Arrays.toString(b2));
String s2=new String(b2,"GBK");
System.out.println(s2);
}
}