IO

    IO以为计算机的输入和输出。直观来说,键盘就是一个输入设备显示屏就是输出设备。针对程序中的输入输出java提供了IO的API。

由于虚拟机下面操作系统的差异性,IO底层的操作肯定不是java代码写的。但是虚拟机屏蔽了底层的差异性对外提供了统一的API。

    IO中最要的一点就是对象的序列化。由于对象存在类存中不可能永久保存,所以提供了序列化功能.将对象从内存中读出来然后保存

到硬盘上面。出于某些原因序列化这个功能没有放在Object'对象中,而是提供了一个标记接口Serializable.这个接口没有任何方法。只做标记

作用。凡是实现了该接口的对象就能实现对象的序列化功能。在IO中提供了ObjectInputStram/ObjectInputStream用来序列化对象和反序列化

对象.

    File是对系统的文件/文件夹操作。该对象提供大量对文件操作的方法。

    然后就是IO中的IO流操作。在IO中使用了装饰模式。最低层的接口是InputStream/OutputStream,这两个接口是针对字节流操作的。

Reader/Writer两个类是正对字符流操作的。字节流转换成字符流采用了InputStreamReader/OutputStreamReader两个类进行转换。提供了字

符流或者字节流的缓存类。由于类里面自带列缓存,所以使用上面更加方便。输入和输出流之间操作一般的都是使用byte数组循环读取操作。

由于API的分装。所以Socket的操作大量使用了IO来通行,虽然网络链路上面的是0和1,但是服务器和客服端都是可以转换成字符串了。所

以很多网络协议在就是按照一定的约定发送字符串,接受方接受和解析字符串然后接受请求开始通信。

    IO流的操作基本上都是要异常处理的,由于底层不是java实现。不能用虚拟机管理对象。所以IO操作中必须手动关闭IO流,释放资源。

    在Web中上传文件是一定有的,将每天的文件放在一个文件夹里面管理也是一种和常用的技巧。最近写代码开始合理设计对象。尽量保证

自己的代码这里写了,其他位置还能使用。相对以前的代码。慢慢学习设计方法和类了,经过的一段时间的学习。慢慢的也能掌握面向对象思想了吧。

  1 package com.io;
  2 
  3  
  4 
  5 import java.io.BufferedInputStream;
  6 
  7 import java.io.BufferedOutputStream;
  8 
  9 import java.io.File;
 10 
 11 import java.io.FileInputStream;
 12 
 13 import java.io.FileOutputStream;
 14 
 15 import java.io.IOException;
 16 
 17 import java.io.InputStream;
 18 
 19 import java.io.OutputStream;
 20 
 21 import java.io.Serializable;
 22 
 23 import java.text.DateFormat;
 24 
 25 import java.text.SimpleDateFormat;
 26 
 27 import java.util.Date;
 28 
 29 import java.util.Random;
 30 
 31 //按照时间来创建文件夹然后保存文件
 32 
 33 public class IoDemo implements Serializable
 34 
 35 {
 36 
 37     private static final long serialVersionUID = 1L;
 38 
 39     private String fileRoot;
 40 
 41     private File file;
 42 
 43     public IoDemo(String fileRoot,File file)
 44 
 45     {
 46 
 47         this.fileRoot=fileRoot;
 48 
 49         this.file=file;
 50 
 51     }
 52 
 53     
 54 
 55     
 56 
 57     public void savaFile() throws IOException
 58 
 59     {
 60 
 61         //得到今天保存文件的文件夹
 62 
 63         String fileUrl=fileRoot+"\\"+getDate();
 64 
 65         //如果文件夹不存在就创建以今天时间为名的文件夹
 66 
 67         isDirectory(fileUrl);
 68 
 69         //创建保存的文件对象
 70 
 71         String fileName=getRandomByEight()+file.getName();
 72 
 73         File savaFile=new File(fileUrl,fileName);
 74 
 75         savaFile.createNewFile();
 76 
 77         savaFile(file,savaFile);
 78 
 79     }
 80 
 81     
 82 
 83     //得到当前日期
 84 
 85     private String getDate() {
 86 
 87         Date date = new Date();
 88 
 89         DateFormat df = new SimpleDateFormat("yyyyMMdd");
 90 
 91         return df.format(date);
 92 
 93         
 94 
 95     }
 96 
 97     //产生随机数
 98 
 99     private int getRandomByEight()
100 
101     {
102 
103         Random random=new Random();
104 
105         int i=0;
106 
107         for(int j=0;j<8;j++)
108 
109             i=i*10+random.nextInt(8)+1;
110 
111         return i;
112 
113     }
114 
115     //判断当前路劲是否有文件夹
116 
117     private void isDirectory(String url)
118 
119     {
120 
121         File file=new File(url);
122 
123         if(!file.isDirectory())
124 
125             file.mkdir();
126 
127     }
128 
129     //根据两个文件对象保存文件
130 
131     private void savaFile(File file,File savaFile) throws IOException
132 
133     {
134 
135         //文件的读取流
136 
137         InputStream is=new FileInputStream(file);
138 
139         BufferedInputStream bis=new BufferedInputStream(is);
140 
141         //保存文件的流
142 
143         OutputStream os=new FileOutputStream(savaFile);
144 
145         BufferedOutputStream bos=new BufferedOutputStream(os);
146 
147         //创建byte数组操作
148 
149         byte[] b=new byte[1024*1024];
150 
151         int k=-1;
152 
153         while((k=bis.read(b))>0)
154 
155         {
156 
157             bos.write(b, 0, k);
158 
159         }
160 
161         //关闭IO
162 
163         bos.close();
164 
165         bis.close();
166 
167     }
168 
169 }

 

posted on 2014-09-02 19:58  wkdlose  阅读(485)  评论(0)    收藏  举报

导航