IO扩展
Properties
简单的配置文件==Properties=Map+IO 复杂的用XML ==》工具dom4j
1 package io; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.util.Properties; 8 9 /** 10 * 11 * 1.做一个配置文件1.Properties,time表示次数,>=3时,提示软件试用次数用尽 12 * 13 */ 14 public class PropertiesDemo { 15 16 public static void main(String[] args)throws IOException { 17 Properties pro=new Properties(); 18 // 源 19 File f=new File("E:\\1.Properties"); 20 if(!f.exists()) 21 f.createNewFile(); 22 FileInputStream fis=new FileInputStream(f); 23 24 // 加载源 25 pro.load(fis); 26 27 // 操作配置属性 28 String value=pro.getProperty("time"); 29 int count=0; 30 if(value!=null){ 31 if((count=Integer.parseInt(value))>=3){ 32 System.out.println("软件试用次数用尽"); 33 return; 34 } 35 } 36 count++; 37 pro.setProperty("time", count+""); 38 39 // 目的 40 FileOutputStream fos=new FileOutputStream(f); 41 // 存储配置属性到目的 42 pro.store(fos, "what's this"); 43 // 关闭流 44 fos.close(); 45 fis.close(); 46 47 } 48 49 }
SequenceInputStream
序列流---可将多个输入流合并成一个流来处理
应用---文件的切割与合并
1 package io; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.SequenceInputStream; 8 import java.util.ArrayList; 9 import java.util.Enumeration; 10 import java.util.Iterator; 11 12 /** 13 * 14 * 将一张图片划分为若干碎片,存放至E:\\Split文件夹中 15 * 将碎片合并成一张图片,存放至E:\\Split文件夹中 16 */ 17 public class SplitMergeDemo { 18 19 public static void main(String[] args)throws IOException { 20 // 源:E:\\1.png 21 FileInputStream fis=new FileInputStream("E:\\1.png"); 22 File f=new File("E:\\Split\\"); 23 if(!f.exists()) 24 f.mkdir();//如果文件夹不存在,则创建之 25 split(fis);//切割 26 merge(f);//合并 27 28 } 29 public static void split(FileInputStream fis)throws IOException{ 30 // 目的: 31 FileOutputStream fos=null; 32 int len=0; 33 byte[] buf=new byte[1024*25]; 34 int count=0; 35 while((len=fis.read(buf))!=-1){ 36 fos=new FileOutputStream("E:\\Split\\"+(++count)+".part"); 37 fos.write(buf, 0, len); 38 fos.close(); 39 } 40 fis.close(); 41 } 42 public static void merge(File f)throws IOException{ 43 // 获取流 44 File[] files=f.listFiles(); 45 // 合流为一,可以用Vector,但是慢,用ArrayList 46 ArrayList<FileInputStream> al=new ArrayList<FileInputStream>(); 47 for(int x=0;x<files.length;x++) 48 al.add(new FileInputStream(files[x])); 49 //匿名内部内访问成员要使用final修饰,用迭代器 50 final Iterator<FileInputStream> it=al.iterator(); 51 52 Enumeration<FileInputStream> e=new Enumeration<FileInputStream>() { 53 54 @Override 55 public FileInputStream nextElement() { 56 return it.next(); 57 } 58 59 @Override 60 public boolean hasMoreElements() { 61 // TODO Auto-generated method stub 62 return it.hasNext(); 63 } 64 }; 65 SequenceInputStream sis=new SequenceInputStream(e); 66 // 确定目的 67 FileOutputStream fos=new FileOutputStream(new File(f,"0.png")); 68 // 写入 69 int len=0; 70 byte[] buf=new byte[1024*8]; 71 while((len=sis.read(buf))!=-1){ 72 fos.write(buf,0,len); 73 fos.flush(); 74 } 75 // 关流 76 sis.close(); 77 fos.close(); 78 } 79 80 81 }
值得注意的是
1.SequenceInputStream构造函数传入的是Enumeration枚举
2.合入多个流,应该用ArrayList,比Vector效率高
3.实现Enumeration需要复写nextElement()方法和hasMoreElemerts()方法
4.复写上述方法,应该用ArrayList的迭代器Iterator的hasNext()和next()方法
PrinterWriter
1 public static void main(String[] args)throws IOException { 2 // 源:键盘控制台输入,System.in =InputStreamReader 3 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in)); 4 // 目的:E:\\1.txt,PrinterWriter,自动刷新 5 PrintWriter pw=new PrintWriter(new FileWriter("E:\\1.txt"),true); 6 // 写入操作 7 String line=null; 8 while((line=bufr.readLine())!=null){ 9 if("over".equals(line)) 10 break; 11 pw.println(line); 12 } 13 // 关闭源 14 pw.close(); 15 bufr.close(); 16 }
ObjectInputStream与ObjectOutputStream对象流
1.对象存放在堆内存中,当程序结束,会释放对内存,而某些对象可能会用的到,于是乎想把需要的对象持久化存起来,需要时又读取
2.
对象流、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码后续处理