Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7534
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-26 17:51
文章分类
文章存档

2015年(1)

2014年(6)

我的朋友
最近访客

分类: Java

2014-12-25 15:47:23

       平时开发的时候在使用io流有时候不是很多,即使是有人用过,可能对于其具体分类和继承体系可能知道的并不多,也很少有人去看相关的API文档(项目时间紧,天天加班,没办法),找出其中的关系和各自的应用情形。笔者最近看了一些java视频,所以打算简单对常用的IO流进行分类整理,并简单举例说明其应用。希望本文能够对你有所帮助。

(1)java中的IO流大致分为两种:
        (1)字节流:对应抽象类为InputStream(输入流)和 OutputStream(输出流)。 
        (2)字符流:对应抽象类为Reader(输入流)和Writer(输出流)。 


(2)其具体实现如下: 
        (1)字节流:(常用的)FileInputStream实现了InputStream。
                               (常用的)OutputStream实现了FileOutputStream。 
        (2)字符流:(常用的)BufferedReader、InputStreamReader、 StringReader实现了Reader,FileReader继承了InputStreamReader。
                               (常用的)BufferedWriter、OutputStreamWriter、StringWriter实现了Writer,FileWriter继承了OutputStreamWriter。


(3)实现类详情及使用情况如下:
        输出流:
        (1)OutputStreamWriter是字符流通向字节流的桥梁:使用指定的 charset 将要向其写入的字符编码为字节。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。 每次调用 write() 方法都会针对给定的字符(或字符集)调用编码转换器。在写入基础输出流之前,得到的这些字节会在缓冲区累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。为了达到最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中以避免频繁调用转换器。例如: 
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
        (2)FileReader 用来读取字符文件的便捷类,用于读取字符流。
        (3)BufferedReader具有缓冲区,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 
        (4)StringReader  一个字符串的字符输入流。 
        (5)FileInputStream 要读取原始字节流。常用于读二进制文件,如图片、声音、影像等文件比如我们经常看的,就可以被读取。


        输入流:
        (1)InputStreamReader是字节流通向字符流的一座桥梁:它使用指定的 charset 读取字节并将其解码为字符。每次调用里的 read() 方法都会导致从基础输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从基础流读取更多的字节,使其超过满足当前读取操作所需的字节。平时我们开发的时候,为了达到最高效率,可以考虑在 BufferedReader 内包装 InputStreamReader。比如: BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        (2)FileWriter 用来写入字符文件的便捷类。
        (3)BufferedWriter  具有缓冲区,将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
        (4)StringWriter  一个字符串的字符输出流,可以用其回收在字符串缓冲区中的输出来构造字符串。 
        (5)FileOutputStream 写入原始字节流。常用于读二进制文件,如图片、声音、影像等文件。


(4)代码实例分析如下:

点击(此处)折叠或打开

  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.FileReader;
  7. import java.io.FileWriter;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import org.junit.Test;

  11. public class TestStream {
  12.     // 读取文件中字符
  13.     @Test
  14.     public void testRead() throws IOException {
  15.         String path = "read.txt";
  16.         FileReader read = new FileReader(path);
  17.         BufferedReader reader = new BufferedReader(read);
  18.         while (reader.readLine() != null) {
  19.             String s = reader.readLine();
  20.             System.err.println(s);
  21.         }
  22.         reader.close();
  23.     }

  24.     // 写入字符到文件
  25.     @Test
  26.     public void testWrite() throws IOException {
  27.         String path = "write.txt";
  28.         FileWriter write = new FileWriter(path);
  29.         BufferedWriter writer = new BufferedWriter(write);
  30.         char[] buffer = new char[1024];
  31.         for (int i = 0; i < 1024; i++) {
  32.             if ((char) 'a' + i > Character.MAX_VALUE) {
  33.                 buffer[i] = 'z';
  34.                 System.err.println(1);
  35.             } else {
  36.                 buffer[i] = (char) ('a' + i);
  37.             }

  38.         }
  39.         writer.write(buffer);
  40.         writer.close();
  41.     }

  42.     // 删除文件内容
  43.     @Test
  44.     public void testDelete() throws IOException {
  45.         String path = "write.txt";
  46.         FileWriter write = new FileWriter(path);
  47.         BufferedWriter writer = new BufferedWriter(write);
  48.         StringBuffer buffer = new StringBuffer();
  49.         writer.write(buffer.toString());
  50.         writer.close();
  51.     }

  52.     // 替换内容
  53.     @Test
  54.     public void testDeleteAndReplace() throws IOException {
  55.         String path = "write.txt";
  56.         FileWriter write = new FileWriter(path);
  57.         BufferedWriter writer = new BufferedWriter(write);
  58.         int i = 0;
  59.         while (++i < 100) {
  60.             StringBuffer buffer = new StringBuffer();
  61.             buffer.append(Math.random());
  62.             writer.write(buffer.toString() + "\r\n");
  63.         }
  64.         writer.close();
  65.     }

  66.     // 拷贝一个文件内容到另一个文件
  67.     @Test
  68.     public void copyFile(String oldPath, String newPath) {
  69.      try {
  70.      int byteread = 0;
  71.      File oldfile = new File(oldPath);
  72.      if (oldfile.exists()) { //文件存在时
  73.      InputStream inStream = new FileInputStream(oldPath); //读入原文件
  74.      FileOutputStream fs = new FileOutputStream(newPath);
  75.      byte[] buffer = new byte[100];
  76.                 while ((byteread = inStream.read(buffer)) != -1) {
  77.      fs.write(buffer, 0, byteread);
  78.      }
  79.      inStream.close();
  80.      fs.close();
  81.      }
  82.      } catch (Exception e) {
  83.      e.printStackTrace();
  84.      }
  85.      }

  86.     //读取字符流
  87.     @Test
  88.     public static void testReadByte() {
  89.         String path = "write.txt";
  90.         File file = new File(path);
  91.         InputStream in = null;
  92.         try {
  93.             // 一次读一个字节
  94.             in = new FileInputStream(file);
  95.             int tempbyte;
  96.             while ((tempbyte = in.read()) != -1) {
  97.                 System.out.write(tempbyte);
  98.             }
  99.             in.close();
  100.         } catch (IOException e) {
  101.             e.printStackTrace();
  102.             return;
  103.         }
  104.         try {
  105.             // 一次读多个字节
  106.             byte[] tempbytes = new byte[100];
  107.             int byteread = 0;
  108.             in = new FileInputStream(path);
  109.             while ((byteread = in.read(tempbytes)) != -1) {
  110.                 System.out.write(tempbytes, 0, byteread);
  111.             }
  112.         } catch (Exception e1) {
  113.             e1.printStackTrace();
  114.         } finally {
  115.             if (in != null) {
  116.                 try {
  117.                     in.close();
  118.                 } catch (IOException e1) {
  119.                 }
  120.             }
  121.         }
  122.     }
  123. }

总结一下,对于一些初学者来说,经常会被IO流这块搞晕,很多人在这块花费了大量的时间,但是效果也不是很好。给初学者一个建议,学习的时候不要扣的太深,点到即止即可,否则扣到疼了就不好了。等有了一些经验,达到了一个深度之后,再去扣,就会比较爽了。  
阅读(242) | 评论(0) | 转发(0) |
0

上一篇:java里面的线程池

下一篇:java中的static

给主人留下些什么吧!~~