-----------
android培训、
java培训、java学习型技术博客、期待与您交流! ------------
【装饰设计模式】
【字节流File读写操作】
字节流:
class ExceptionInfo
{
【系统信息】
【对象的序列化】
【装饰设计模式】
装饰设计模式:
当想要对已有的对象进行功能增强时,
可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
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();//这个功能有问题的时候,还可以回去用你的功能
}
}【装饰和继承的区别】
以前是通过继承将每一个子类都具备缓冲功能。
那么继承体系会复杂,并不利于扩展。
将需要被缓冲的对象。传递进来。也就是,谁需要被缓冲,谁就作为参数传递给缓冲区。
这样继承体系就变得很简单。优化了体系结构。
装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。
【字节流File读写操作】
字节流:
import java.io.*;
class FileStream
{
public static void main(String[] args) throws IOException{readFile_3();}public static void writeFile()throws IOException{FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("abcde".getBytes());//不用写flush,因为是字节,不需要进行转换fos.close();
}
}【读取转换流】
InputStreamReader用于将字节流转成字符流,用法与流类同【流操作规律】
System.in; 数据源【异常的日志信息】
System.out; 控制台
1,
源:键盘录入。
目的:控制台。
2,需求:想把键盘录入的数据存储到一个文件中。
源:键盘。
目的:文件。
3,需求:想要将一个文件的数据打印在控制台上。
源:文件。
目的:控制台。
流操作的基本规律:
最痛苦的就是流对象有很多,不知道该用哪一个。
通过三个明确来完成。
1,明确源和目的。
源:输入流。InputStream Reader 读取数据
目的:输出流。OutputStream Writer。 写数据
2,操作的数据是否是纯文本。
是:字符流。
不是:字节流。
3,当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘。键盘
目的设备:内存,硬盘,控制台。
1,将一个文本文件中数据存储到另一个文件中。复制文件。
源:因为是源,所以使用读取流。InputStream Reader
是不是操作文本文件。是!这时就可以选择Reader,这样体系就明确了。
接下来明确要使用该体系中的哪个对象。
明确设备:硬盘上一个文件。
Reader体系中可以操作文件的对象是 FileReader
是否需要提高效率:是!加入Reader体系中缓冲区 BufferedReader.
FileReader fr = new FileReader("a.txt");
BufferedReader bufr = new BufferedReader(fr);
目的:OutputStream Writer
是否是纯文本。 是!Writer。
设备:硬盘上一个文件。
Writer体系中可以操作文件的对象FileWriter。
是否需要提高效率:是!。加入Writer体系中缓冲区 BufferedWriter
FileWriter fw = new FileWriter("b.txt");
BufferedWriter bufw = new BufferedWriter(fw);
2,需求:将键盘录入的数据保存到一个文件中。
这个需求中有源和目的都存在。
那么分别分析
源:InputStream Reader 是不是纯文本?是!Reader
设备:键盘。对应的对象是System.in.
不是选择Reader吗?System.in对应的不是字节流吗?
为了操作键盘的文本数据方便。转成字符流按照字符串操作是最方便的。
所以既然明确了Reader,那么就将System.in转换成Reader。
用了Reader体系中转换流,InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
需要提高效率吗?需要!BufferedReader
BufferedReader bufr = new BufferedReader(isr);
目的:OutputStream Writer
是否是纯文本?是!Writer。
设备:硬盘。一个文件。使用 FileWriter。
FileWriter fw = new FileWriter("c.txt");
需要提高效率吗?需要。
BufferedWriter bufw = new BufferedWriter(fw);
**************转换流里面可以用来指定编码表
扩展一下,想要把录入的数据按照指定的编码表(utf-8),将数据存到文件中。
目的:OutputStream Writer
是否是存文本?是!Writer。
设备:硬盘。一个文件。使用 FileWriter。
但是FileWriter是使用的默认编码表。GBK(平台默认的码表)
但是存储时,需要加入指定编码表utf-8。而指定的编码表只有转换流可以指定。
所以要使用的对象是OutputStreamWriter。
而该转换流对象要接收一个字节输出流。而且还可以操作的文件的字节输出流。FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要高效吗?需要。
BufferedWriter bufw = new BufferedWriter(osw);
所以,记住。转换流什么时候使用。字符和字节之间的桥梁,通常,涉及到字符编码转换时,
需要用到转换流。
class ExceptionInfo
{
public static void main(String[] args)throws IOException
{
try{
int[] arr = new int[2];System.out.println(arr[3]);
}catch (Exception e){
//e.printStackTrace(new PrintStream("a.txt"));
try{
Date d = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String s = sdf.format(d);PrintStream ps = new PrintStream("exeception.log");ps.println(s);System.setOut(ps);
}catch (IOException ex){
throw new RuntimeException("日志文件创建失败");
}e.printStackTrace(System.out);
}
}}
【系统信息】
import java.util.*;
import java.io.*;
class SystemInfo
{
public static void main(String[] args) throws IOException{
Properties prop = System.getProperties();//System.out.println(prop);//System.out.println(System.out);prop.list(new PrintStream("sysinfo.txt"));//没有关流
}
}【File类】
流只能操作数据,而操作封装数据的文件或着文件夹的信息必须用File【Properties】
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的子类。【PrintWriter】
也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。
是集合中和IO技术相结合的集合容器。
该对象的特点:可以用于键值对形式的配置文件。
那么在加载数据时,需要数据有固定格式:键=值。
数据格式简单 关系不能太复杂,太复杂它描述不了,不利于区分
打印流:
该流提供了打印方法,可以将各种数据类型的数据都原样打印。
字节打印流:
PrintStream
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
字符打印流:
PrintWriter
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
4,字符输出流,Writer。
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);//PrintWriter out = new PrintWriter("a.txt");//刷新是流的操作PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);//PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("a.txt")),true);//为了提高效率String line = null;while((line=bufr.readLine())!=null){
if("over".equals(line))break;out.println(line.toUpperCase());//out.flush();
}out.close();bufr.close();
}
}【合并流】
多个源对应一个目的,SequenceInputStream 可以理解为把多个文件依次读入,写到一个文件中,
接收Enumeration类型的参数
就是把要操作的文件,用流的方式指定大小分开存储成多个文件,
【对象的序列化】
ObjectInputStream可以直接操作对象的流
将堆内存的对象存到硬盘上,把对象存放在硬盘上这叫做持久化存储
找一个介质能长期保存数据,这叫作对象的持久化、或着叫对象的序列化或叫对象的可串行性
Serializable 没有方法的接口通常称为标记接口,对象持久化要实现它