谈谈java的I/O流【阿敏分享】

来源:互联网 发布:软件开发人月成本 编辑:程序博客网 时间:2024/06/05 14:52

今天阿敏分享信息,聊到了java的IO流,下面就以此地来复习回顾一下IO流吧!

 

IO流的分类:
1、根据处理的数据类型不同:字节流和字符流。
2、根据流向不同:输入流和输出流。
3、根据流的功能不同:节点流和处理流。

IO流的四大抽象类:
字符流:Reader、Writer
字节流:InputStream、OutputSteam

字节流和字符流的区别:
1、字节流是每次读一个字节就返回一个字节,而字符流
可以读多个字节再返回。
2、字节流可以处理所有类型的数据,字符流只能处理字符数据。

总结:只是处理纯文本数据,就优先考虑使用字符流。
 
下面是阿敏从网上找到的图,挺全:
 
以下是他贴的代码:读文本文件
 
  1. FileReader fr=null
  2.         try { 
  3.             fr = new FileReader("D:\\test.sql"); 
  4.             int ch = 0
  5.             while(( ch = fr.read()) != -1){ 
  6.                 System.out.println((char)ch); 
  7.             } 
  8.         } catch (IOException e) { 
  9.             e.printStackTrace(); 
  10.         }finally{ 
  11.             if(fr!=null){ 
  12.                 try { 
  13.                     fr.close(); 
  14.                 } catch (IOException e1) { 
  15.                     e1.printStackTrace(); 
  16.                 } 
  17.  
  18.             } 
  19.         } 
以下例子是简单的对一个文本文件读取,复制到另一个文本文件,为了提高效率可以考虑用包装流。其中还可以指定字符集。
 
  1. BufferedReader bufr = null
  2.         BufferedWriter bufw = null
  3.         try { 
  4.  
  5.             bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\test.sql"), "GBK")); 
  6.             bufw = new BufferedWriter(new FileWriter("D:\\test1.sql")); 
  7.             String line = null
  8.             while(( line = bufr.readLine()) != null){ 
  9.                 bufw.write(line); 
  10.                 bufw.flush(); 
  11.             } 
  12.         } catch (IOException e) { 
  13.             e.printStackTrace(); 
  14.         }finally{ 
  15.             try { 
  16.                 if(bufw!=null){ 
  17.                     bufw.close(); 
  18.                 } 
  19.                 if(bufr!=null){ 
  20.                     bufr.close(); 
  21.                 } 
  22.             } catch (IOException e1) { 
  23.                 e1.printStackTrace(); 
  24.             } 
  25.         } 
在日常应用读取文本文件最好就是
new BufferedReader(new InputStreamReader(new FileInputStream(filename), "GBK"))
这样指定一个字符集 乱码 没问题。
 
 10**敏  10:58:33
对象流。。好少用,webservice中的VO传输就用到这个了
10**敏  11:00:55
ObjectInputStream
       Object readObject();
ObjectOutputStream
       void writeObject(Object):
主用就是用到以上两个方法
注意:写入对象必须实现Serializable 接口 。
 
 10**敏  11:03:32
用于给类指定一个UID,而UID是通知类中的可序列化成员的数字签名运算出来的一个long型的值。。所有在weblogic或者Socket中传输。要是报了一个错什么序列版本不一致,你就知道就是这个UID,即两边的jar包不一样导致
所以有些人开发网络传输时,会指定一个UID值,而不是自动生成

上边的例子中
  bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\test.sql"), "GBK"));
其中InputStreamReader 是一个转换流,
特点:
1、是字节流和字符流之间的桥梁。
2、该流对象中可以对读取到的字节数据进行指定编码表的编码转换。

这里字节流就不细说了,代码实现跟字符流大同小异。
哦,还有一个比较少用的LineNumberReader
 
 
 
以上IO流的例子中,存在代码
try{
}catch(){
}finally{
};
这个是java控制异常的处理流程。当然finally不一定要。
finally的作用就是,每次运行代码,最终都会执行finally的代码块,例如用于,流的关闭。
 
总结:日常应用用得最多的就是文本流,其中也有可能文本+图片的,这时可以用字节流,而一般为了提高效率,都会使用包装流对X流进行包装,最后,当成功打开流时,用完后不要忘记关闭哦。
 
 
======================================================================================================
以上就是阿敏同学分享的东西,下面我也来分享下我自己遇到的一个java的IO问题:
也就是读取jar包中的密钥文件,大体的情况是这样的,在我参与的某个项目当中,用户为了提高系统的安全性需要用到非对称的加密,而我所采用的非对称加密算法是RSA加密,页面上的用户登录密码采用RSA的公钥(javascript文件)进行加密,而后台采用java类写的解密方法解密,解密的过程需要读取密钥文件,所以就涉及到I/O方面的开销。
刚开始我只能读jar包外面的密钥文件,但是jar包内的密钥文件,我老是读取不到,后才找到方法。
 
  1. private static String RSAKeyStore = "c:/conf/RSAKey.txt";
  2. public static KeyPair getKeyPair() throws Exception { 
  3.         FileInputStream fis = new FileInputStream(RSAKeyStore); 
  4.         ObjectInputStream oos = new ObjectInputStream(fis); 
  5.         KeyPair kp = (KeyPair) oos.readObject(); 
  6.         oos.close(); 
  7.         fis.close(); 
  8.         return kp; 
  9.     } 
上面的方法就是第一次写的,写的方法就加载非jar包内的文件,这样的方式去读jar包内的文件是不可行的,如果想能读jar内的文件可以用下面的方法:
 
  1. .... 
  2. private static String RSAKeyStore = "/net/thinkeye/util/RSAKey.txt"
  3. public static KeyPair getKeyPair() throws Exception { 
  4.         System.out.println("[开始]============[加载密钥]============[开始]"); 
  5.         InputStream fis = RSAUtil.class.getResourceAsStream(RSAKeyStore); 
  6.         ObjectInputStream oos = new ObjectInputStream(fis); 
  7.         KeyPair kp = (KeyPair) oos.readObject(); 
  8.         oos.close(); 
  9.         fis.close(); 
  10.         System.out.println("[结束]============[加载密钥]============[结束]"); 
  11.         return kp; 
  12.     } 
 
也就是读jar包内的文件,把FileInputStream 的文件直接改为InputStream ,直接使用类的getResourceAsStream方法去读jar包内文件,然后再转成对象流就ok了。
 
不信你试试。呵呵!至于更多的方法使用大家可以上网去找下,我也不多讲了。
 

 

 

本文出自 “新博客-http://cfei.net” 博客,请务必保留此出处http://johnny84.blog.51cto.com/2855387/957754

原创粉丝点击