前几天应聘的公司发来了这道题。。。
需求说明:纯编码的方式实现音频、文本文件、视频等各种文件的上传。要求程序的扩展性高,耦合性低。
何为工厂模式:首先抛开工厂模式的概念,大家想想生活当中工厂的作用(为我们生产新的商品),而在编程中工厂就是给我们创建(new)新的对象。如果你用过spring,对工厂的理解可能会更深,因为其的设计中用到了工厂模式,和代理模式。闲言少叙,上代码。
接口:
1 package com.cn.DAO; 2 3 import java.io.File; 4 5 public interface IFold { 6 public boolean reader(File url); 7 }
实现类1:处理媒体类文件
1 package com.cn.Imp; 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 9 import com.cn.DAO.IFold; 11 public class UpMadie implements IFold { 12 @Override 13 public boolean reader(File url) { 14 15 FileInputStream in = null; 16 FileOutputStream out = null; 17 String outUrl = "src/getAllFiles/" + url.getName().toString(); 18 File upFiles = new File("src/getAllFiles"); 19 // 判断要上传的目录下是否存在同名文件,如果存在,先删除,再上传 20 for (File file : upFiles.listFiles()) { 21 if (file.getName().equals(url.getName())) { 22 file.delete(); 23 System.out.println("重复文件已近删除,开始上传【媒体文件】"); 24 break; 25 } 26 } 28 try { 29 in = new FileInputStream(url); 30 out = new FileOutputStream(new File(outUrl)); 31 byte[] b = new byte[1024]; 32 33 int lengs; 34 while ((lengs = in.read(b)) != -1) { 35 out.write(b, 0, lengs); 36 } 38 return true; 39 } catch (FileNotFoundException e) { 40 // TODO Auto-generated catch block 41 e.printStackTrace(); 42 } catch (IOException e) { 43 // TODO Auto-generated catch block 44 e.printStackTrace(); 45 }finally{ 46 47 try { 48 in.close(); 49 out.close(); 50 } catch (IOException e) { 51 // TODO Auto-generated catch block 52 e.printStackTrace(); 53 } 57 } 58 return false; 59 } 60 61 }
实现类2:处理文本文件,引入了缓存
1 package com.cn.Imp; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileNotFoundException; 8 import java.io.FileOutputStream; 9 import java.io.IOException; 10 import java.io.InputStream; 11 import java.io.InputStreamReader; 12 import java.io.OutputStream; 13 import java.io.OutputStreamWriter; 14 15 import com.cn.DAO.IFold; 16 17 /** 18 * 字符流 读取文本:txt,doc,pdf 19 */ 20 public class UpWords implements IFold { 21 22 @Override 23 public boolean reader(File url) { 24 InputStream in = null; 25 InputStreamReader ireader = null; 26 BufferedReader breader = null; 27 OutputStream out = null; 28 OutputStreamWriter owriter = null; 29 BufferedWriter bWriter = null; 30 String outUrl = "src/getAllFiles/" + url.getName().toString(); 31 File upFiles = new File("src/getAllFiles"); 32 // 判断要上传的目录下是否存在同名文件,如果存在,先删除,再上传 33 for (File file : upFiles.listFiles()) { 34 if (file.getName().equals(url.getName())) { 35 file.delete(); 36 System.out.println("重复文件已近删除,开始上传【文本文件】"); 37 break; 38 } 39 } 40 41 try { 42 in = new FileInputStream(url); 43 ireader = new InputStreamReader(in); 44 breader = new BufferedReader(ireader); 45 out = new FileOutputStream(new File("src/getAllFiles/" 46 + url.getName())); 47 owriter = new OutputStreamWriter(out); 48 bWriter = new BufferedWriter(owriter); 49 50 String line; 51 while ((line = breader.readLine()) != null) { 52 bWriter.write(line); 53 } 54 return true; 55 } catch (FileNotFoundException e) { 56 // TODO Auto-generated catch block 57 e.printStackTrace(); 58 } catch (IOException e) { 59 // TODO Auto-generated catch block 60 e.printStackTrace(); 61 } finally { 62 try { 63 bWriter.flush(); 64 in.close(); 65 ireader.close(); 66 breader.close(); 67 out.close(); 68 owriter.close(); 69 bWriter.close(); 70 71 } catch (IOException e) { 72 // TODO Auto-generated catch block 73 e.printStackTrace(); 74 } 75 } 76 return false; 77 } 78 79 }
工具类1:读属性文件
1 package com.cn.util; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.Enumeration; 6 import java.util.HashMap; 7 import java.util.Map; 8 import java.util.Properties; 9 10 public class PropertiesReader { 11 12 public Map<String, String> getProperties(){ 13 Properties prop = new Properties(); 14 Map<String, String> map = new HashMap<String, String>(); 15 try { 16 InputStream in = getClass().getResourceAsStream("file.properties"); 17 prop.load(in); 18 Enumeration en = prop.propertyNames(); 19 while (en.hasMoreElements()) { 20 String key = (String)en.nextElement(); 21 String property = prop.getProperty(key); 22 map.put(key, property); 23 } 24 } catch (IOException e) { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } 28 return map; 29 } 30 }
工具类2:弹框选择上传的文件
package com.cn.util; import java.io.File; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.filechooser.FileSystemView; public class GetFile { public File backFile() { JFileChooser jfc = new JFileChooser(); // 设置当前路径为桌面路径,否则将我的文档作为默认路径 FileSystemView fsv = FileSystemView.getFileSystemView(); jfc.setCurrentDirectory(fsv.getHomeDirectory()); // JFileChooser.FILES_AND_DIRECTORIES 选择路径和文件 jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); // 弹出的提示框的标题 jfc.showDialog(new JLabel(), "确定"); // 用户选择的路径或文件 File file = jfc.getSelectedFile(); return file; } }
属性文件:file.properties
1 jpg=com.cn.Imp.UpMadie 2 png=com.cn.Imp.UpMadie 3 mp4=com.cn.Imp.UpMadie 4 mp3=com.cn.Imp.UpMadie 5 wma=com.cn.Imp.UpMadie 6 pdf=com.cn.Imp.UpWords 7 doc=com.cn.Imp.UpWords 8 txt=com.cn.Imp.UpWords 9 docx=com.cn.Imp.UpWords
测试类:Text
1 package com.cn.test; 2 3 import java.io.File; 4 5 import com.cn.DAO.IFold; 6 import com.cn.factory.FoldFactory; 7 import com.cn.util.GetFile; 8 9 public class Test { 10 11 public static void main(String[] args) { 12 //获取本地文件路径的类 13 GetFile getback = new GetFile(); 14 File file= getback.backFile(); 15 String fileName = file.getName(); 16 String[] keys = fileName.split("\."); 17 String key = keys[keys.length-1]; 18 //读写文件的工厂 19 FoldFactory factory = new FoldFactory(); 20 //接口 21 IFold iFold = factory.getReaderFold(fileName); 22 //具体实现方法 23 boolean b = iFold.reader(file); 24 if(b==true){ 25 System.out.println(key+"文件上传成功"); 26 }else{ 27 System.out.println(key+"文件上传失败"); 28 } 29 30 } 31 32 }