java基础 IO/线程/GUI,装饰模式

发布时间:2014-10-22 13:36:02编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"java基础 IO/线程/GUI,装饰模式",主要涉及到java基础 IO/线程/GUI,装饰模式方面的内容,对于java基础 IO/线程/GUI,装饰模式感兴趣的同学可以参考一下。

File类:操作文件的类。提供一些对文件操作的方法。 – 目录操作的主要方法为: – public boolean mkdir() 根据抽象路径名创建目录。 – public String[] list() 返回抽象路径名表示路径中的文件名和目录名。 当你创建一个File 对象且它是目录时,isDirectory( ) 方法返回ture。这种情况下,可以调用该对象的list( )方法来提取该目录内部其他文件和目录的列表 希望能够限制由list( )方法返回的文件数目,使它仅返回那些与一定的文件名方式或者过滤(filter)相匹配的文件。为达到这样的目的,必须使用list( )的第二种形式 (方法重载) String[ ] list(FilenameFilter FFObj) 写一个File类:删除一个文件夹的列子来加深印象理解。 package com.itheima.study.io; import java.io.File; public class FileTest1 { public static void removeFile(String path) { //根据路径创建File实例 File file = new File(path); //判断该文件如果是个文件,则删除该文件 if (file.isFile()) { file.delete(); } //如果该文件是个文件夹 if (file.isDirectory()) { //得到文件夹下面的所有文件 File[] files = file.listFiles(); //文件数组为空,这表明是个空文件夹 if (files.length == 0) { //直接删除文件 file.delete(); } else { //如果不是空文件夹则遍历所有文件 for (int i = 0; i < files.length; i++) { //递归调用该函数重复判断 removeFile(files[i].getPath()); } //该文件已经为空文件夹所以删除 file.delete(); } } } public static void main(String[] args) { removeFile("N:/day19"); } } Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。输入/输出时,数据在通信通道中流动。所谓“数据流(stream)” 指的是所有数据通信通道之中,数据的起点和终点。信息的通道就是一个数据流。只要是数据从一个地方“流”到另外一个地方,这种数据流动的通道都可以称为数据流。 IO(Input/Output)表示输入/输出,用来处理源和目标之间的数据传输。 从功能上分为两大类:输入流和输出流。 从流结构上可分为字节流(以字节为处理单位或称面向字节)和字符流(以字符为处理单位或称面向字符). InputStream , OutputStream 字节流;  Reader ,Writer字符流 以一个实例来体现(文件集合流的综合题): 将 指定目录下包含子目录的所有.java 文件复制到 新目录目录下, 并将原来文件的扩展名从.java 改为.jad package com.itheima.study.io; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class HomeWorkThree { //src为传入的源文件/目录, desc为接收拷贝文件的目录 public static void copy(String src, String desc) throws IOException { //源文件目录 File file = new File(src); //目标文件目录 File filed = new File(desc); if(!file.exists()) { //如果源文件目录不存在,结束方法 System.out.println("目录/文件不存在"); return; } if(!filed.exists()) { //如果目标目录不存在,创建目标目录 filed.mkdirs(); } //如果源文件中的文件是java文件 if(file.isFile() && file.getName().endsWith(".java")) { //穿件输入流,用于读取文件 FileInputStream fileIn = new FileInputStream(file); //新建文件目录为目标目录下面 File file2 = new File(desc + "\\" + file.getName()); //创建输出流用于读取源目录下的java文件 FileOutputStream fileOut = new FileOutputStream(file2); byte[] by = new byte[1024]; int len = 0; //将java文件写入到目标文件里 while((len = fileIn.read(by)) != -1) { fileOut.write(by, 0, len); } //关闭流 fileOut.close(); fileIn.close(); //将源目录文件重命名为jad文件 file.renameTo(new File(file.getPath().substring(0, file.getPath().length() - 4) + "jad")); } //如果是个目录 if(file.isDirectory()) { //得到目录下所有的文件 File[] list = file.listFiles(); //如果目录中无文件,直接返回方法调用端 if(list.length == 0) { return; } else { //如果目录下存在文件,递归操作 for (File file3 : list) { copy(file3.getPath(), desc); } } } } public static void main(String[] args) throws IOException { copy("D:\\homework", "D:/jre"); } } 再一个综合列子:读取一个文件记录该文件中单词的个数,和单词出现的行数 package com.itheima.study.io; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; public class SearchDemo {     public static void search(String path) throws IOException     {     //获取文件输入流     InputStreamReader inReader = new InputStreamReader(new FileInputStream(path));     char[] ch = new char[1024];     int len = 0;     //strr用于接收文件中的内容     StringBuilder strr = new StringBuilder("");     //读取文件,并且将内容加入到strr中     while((len = inReader.read(ch)) != -1)     {     strr = strr.append(new String(ch, 0, len));     }     //创建符合英文单词的正则表达式     Pattern pattern = Pattern.compile("[a-zA-Z]+");     //获得单词的匹配器     Matcher matcher = pattern.matcher(strr);     //定义map可以用于接收单词,value用于存放单词出现的次数     Map<String,Integer> map = new HashMap<>();     //如果匹配到一个单词     while(matcher.find())     {        //得到当前匹配的单词     String s = matcher.group();     //如果该单词已经存在,则value++     if(map.containsKey(s))     {     map.put(s, map.get(s) + 1);     }     else     {     //如果单词第一次存在则value为1     map.put(s, 1);     }     }     //获得map的Map.Entry的Set集合     Set<Map.Entry<String, Integer>> set = map.entrySet();     //迭代该集合     for (Entry<String, Integer> entry : set) {     //输出单词和单词出现的次数 System.out.println(entry.getKey() + " " + entry.getValue()); }     //关闭流     inReader.close();     //从获取取该文件的输入流     inReader = new InputStreamReader(new FileInputStream(path));     //将该输入流包装到字符输入流中     BufferedReader buffer = new BufferedReader(inReader);     //定义出现的行数     int i = 0;     //接收文件中一行的数据     String st;     while((st = buffer.readLine()) != null)     {     //如果读取了一行则i的值加1     i++;     //获取单词的正则表达式         pattern = Pattern.compile("[a-zA-Z]+");         //获取单词的匹配器              matcher = pattern.matcher(st);              //从新定义map         map = new HashMap<>();         //发现单词         while(matcher.find())         {            //获取当前单词         String s = matcher.group();         //如果单词已经出现者value++         if(map.containsKey(s))         {         map.put(s, map.get(s) + 1);         }         else         {         //如果单词第一次出现者value值为1         map.put(s, 1);         }         }                 //获取Map.Entry的集合         set = map.entrySet();         //迭代该集合         for (Entry<String, Integer> entry : set)     {         //打印单词出现的行数和次数     System.out.println("第" + i + "行  " + entry.getKey() + " " + entry.getValue());     }         }     //关闭流     inReader.close();     }          public static void main(String[] args) throws IOException { search("D:/新建文本文档.txt"); } } I/O这里用到了一种设计模式叫做装饰模式: -抽象构件角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象。 – 具体构件角色(Concrete Component):定义一个将要接收附加责任的类。 – 装饰角色(Decorator):持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口 – 具体装饰角色(Concrete Decorator):负责给构件对象“贴上”附加的责任。 装饰模式的特点: – 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。 – 装饰对象包含一个真实对象的引用(reference) – 装饰对象接收所有来自客户端的请求。它把这些请求转发给真实的对象。 – 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展 实现装饰模式: ① package com.itheima.study.decorator; //抽象构建角色 public interface Component { //执行的方法 public void print(); } ②. package com.itheima.study.decorator; //抽象构建角色 public interface Component { //执行的方法 public void print(); } ③. package com.itheima.study.decorator; //具体构建角色 public class ConcreteComponent implements Component { //实现执行的方法 @Override public void print() { System.out.println("功能A"); } } ④. package com.itheima.study.decorator; //具体装饰角色1 public class ConcreteDecorator1 extends Decorator { public ConcreteDecorator1(Component component) { super(component); } //执行父类的方法,并且执行附加方法 @Override public void print() { super.print(); pp(); } //添加的功能 public void pp() { System.out.println("功能B"); } } ⑤. package com.itheima.study.decorator; //具体装饰角色2 public class ConcreteDecorator2 extends Decorator { public ConcreteDecorator2(Component component) { super(component); } //执行附加方法,和父类的方法 @Override public void print() { super.print(); cc(); } //定义附加方法 public void cc() { System.out.println("功能C"); } } ⑤. package com.itheima.study.decorator; //测试类 public class Cilent { public static void main(String[] args) { //执行语句,类似于BufferedReader可以包装多层 new ConcreteDecorator2(new ConcreteDecorator1(new ConcreteComponent())).print(); } } 输出结果为: 功能A 功能B 功能C 如此装饰模式就是可以在不需要子类的情况下扩展特定对象的功能更多的灵活性 对于一个给定的对象,同时可能有不同的装饰对象,客户端可以通过它的需要选择合适的装饰对象发送消息。


上一篇:hdu 4638 树状数组
下一篇:LA 4670 dominating patterns AC自动机

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款