InputStream OutputStream
1、只支持字节层次上的读写,仅仅读取和写入单个的字节和字节数组。
public abstract int read() throws IOException;
//读取一个字节,并将其向上提升为int类型然后返回,如果读到数据源的末尾,则返回-1
public abstract void write(int b) throws IOException
//向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略
public int available() throws IOException //检查目前可以读取的字节数
//下面这段代码不会永远被阻塞:
int bytesAvailable = in.available()
if(bytesAvailable>0)
{
byte[] data = new byte[bytesAvailable];
in.read(data);
}
/*读取键盘录入:
System.out :对应的的是标准输出设备:控制台
System.in :对应标准输入设备:键盘
*/
InputStreamReader :字节流通向字符流的桥梁。
OuputStreamWriter:字符流通向字节流的桥梁;
键盘录入最常见写法:读取
BufferedReader bufr = new BufferedReader(newInputStreamReader(System.in));
控制台: 写入
BufferedWriter bufw = new
BufferedWriter(new OutputStreamWriter(System.out));
流操作的基本规律:通过三个明确来完成使用那些流。
1、 明确源和目的;
源:读取流,输入流:InputStream ,Reader
目的:写入流,输出流,OuputStream ,Writer
2、 明确要操作的数据是否纯文本
是纯文本:字符流。
不是纯文本:字节流。
3、 体系明确后,再明确要使用的具体对象。通过设备进行区分;
源:键盘System.in 硬盘:FileStream 内存:ArrayStream
目的:控制台 System.out 硬盘: FileStream 内存:ArrayStream
/*实例:将一个图片文件复制到另一个文件中。*/
1、源:读取流,InputStream Reader
是否纯文本:否.使用字节读取流InputStream
设备:硬盘上的文件,InputStream体系中用来操作文件的对象FileInputStream
是否需要提供效率:是。加入InputStream体系中的缓冲区。
BufferedInputStream bufis = new BufferedInputStream(new FileInputStream(“1.jpg”));
2、源:写入流,OuputStream,Writer
是否纯文本:否,使用字符流OutputStream.
设备:硬盘上的文件,OutputStream体系中用来操作文件的对象是FileOutputStream
是否需要提高效率:是,加入OutputStream体系中的缓冲区。
BufferedOutputStreambufos = new BufferedOutputStream(new FileOutputStream(“2.jpg”));
/*实例:将一个键盘录入的数据保存到一个文件中。*/
1、 源:读取流,InputStream,Reader
是否纯文本:是,用Reader.
设备:键盘,使用System.in,用于System.in对应的是字节流,为了操作键盘的文本数据方便,因此需要使用转换流InpuStreamReader.
是否高效?是。加入Reader体系中的缓冲区BufferedReader
BufferedReaderbufr = new BufferedReader(newInputStreamReader(System.in));
2、 目的:写入流,OutputStream,Writer;
是否纯文本:是。用Writer
设备:硬盘上的文件,Writer体系中用来操作文件的对象是FileWriter
是否高效?是。加入Writer体系中的缓冲区BufferedWriter
BufferedWriterbufw = new BufferedWriter(new FileWriter(“1.txt”));
扩展知识:将录入的数据按指定的编码表存放到文件中。
目的:写入流,OuputStream,Writer
是否纯文本:是,用Writer.
设备:硬盘上的文件。Writer体系中用来操作文件的对象是FileWriter(默认的码表为GBK),但是由于存储时需要加入指定的编码表UTF-8,而编码表只有转换流可以指定,因此使用OuputStreamWriter,该转换流需要接收一个字节输出流OutputStream对象作为参数,可以操作文件的字节输出流对象是FileOutputStream.
是否高效?是。加入Writer体系中的缓冲区BufferedWriter
BufferedWriterbufw = new BufferedWriter (newOutputStreamWriter(new FileOutputStream(“2.txt”)),”UTF-8”);
注:通常涉及到字符编码转换时需要用到转换流:
InputStreamReader ,OutputStreamWriter;
改变标准输入输出设备:static void setIn(InputStream in) static void setOut(PrintStream out);
异常日志信息的建立。
Date d = new Date(); SimpleDateFomat sdf = new SimpleDateFormat(“yyyy—MM-dd,HH:mm:ss”) String str = sdf.format(d); PrintStrean ps = new PrintStrean(“exception.txt”); ps.println(str); System.setOut(ps);
装饰设计模式:
当想要对已有的对象进行功能呢增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,则自定义的类成为装饰类。
装饰类通常会通过构造方法接受被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
其与继承的区别:
装饰模式比继承要灵活,避免了集成体系的臃肿,同时降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了增强功能。因此装饰类和被装饰类通常是都属于一个体系的