Java I/O系统

Java I/O系统:

1.  Java类库提供了大量类,可以帮助我们从不同的设备读取数据,并保存或输出到不同的设备中。这些类同一放在java.io包和java.nio包中,统称为java I/O系统。

2.  流:我们可以将流理解为传送数据的管道,流是java I/O的基础,是java语言对 I/O 的一个最基本的抽象

    流的两个最基本特性:

        ①含有流质。流质就是数据

          ②有方向。方向就是读或写,即针对设备进行信息的输入和输出

    流的分类:

      1)输入流和输出流——按流的方向分

        输入流:从数据源读取数据到程序中。只能读不能写。io包中的输入流都继承自抽象类OutputStream或Reader 。

        输出流:将数据从程序写入数据目的地。只能写不能读。io包中的输出流都继承自抽象类InputStream或Writer 。

      2)字节流和字符流——流按处理数据的最小单位的不同分

        字节流:以byte为最小单位进行数据传送。io包中的字节流都继承自抽象类InputStream或OutputStream 。

        字符流:以char为最小单位进行数据传送。io包中的字节流都继承自抽象类Reader 或Writer 。

      3)节点流和处理流——按流的功能分

        节点流:又叫低级流,是可以直接 从 / 向 一个特定的数据源 读 / 写 数据的流 。

          处理流:又叫高级流,处理流不能直接连接到设备,而是连接在已存在的流之上,通过对数据的处理为程序提供更强大的 读 / 写 功能 。

         *  如果类的构造器带有一个已存在的流作为参数,那它就是高级流 。

3.  I/O库中类具有对成性:

             1)输入流和输出流的对称

             2)字节流和字符流的对称

I/O操作步骤:建立流—>操作流—>关闭流

4.  文件类:将File对象看成是代表一个文件或目录的名称和位置的字符串。

5.  字节流:用于处理二进制文件

 1  import java.io.File;
 2  import java.io.FileInputStream;
 3  import java.io.FileNotFoundException;
 4  import java.io.FileOutputStream;
 5  import java.io.IOException;
 6  import java.io.InputStream;
 7  import java.io.OutputStream;
 8  
 9  /**
10   * 字节输入输出流测试
11   * 
12   * 
13   */
14 public class IOTest {
15 
16      public static void main(String[] args) {
17          StringBuffer buffer = new StringBuffer(); // 字符串缓冲
18          
19          /* 输入流 */
20          InputStream in = null;
21  
22          try {
23              // 1. 打开输入流
24              in = new FileInputStream("E:\\jg\\exercise.txt");
25              // 2. 读取
26  //            byte[] b = new byte[128];
27              byte[] b = new byte[1024 * 4];
28             int len = in.read(b); // 返回读取到的字节数,返回-1表示读取到流结尾
29              while(len != -1){
30                  buffer.append(new String(b, 0, len)); // 将读取到的字节解析为String追加到缓冲
31                  len = in.read(b);
32             }
33  //            System.out.println("读到" + len + "字节的数据");
34              System.out.println(buffer.toString());
35          } catch (FileNotFoundException e) {
36              e.printStackTrace();
37          } catch (IOException e) {
38              e.printStackTrace();
39          } finally {
40              // 3. 释放资源,关闭输入流
41              if (in != null){
42                 try {
43                     in.close();
44                  } catch (IOException e) {
45                      e.printStackTrace();
46                  }
47              }
48          }
49          
50          /* 输出流 */
51          OutputStream out = null;
52          
53          try {
54              File file = new File("D:\\test\\demo\\test.txt");
55              if (!file.getParentFile().exists()){ // 文件路径不存在,则创建路径中所有不存在的目录
56                  file.getParentFile().mkdirs();
57              }
58              // 1. 打开输出流
59              out = new FileOutputStream(file);
60              // 2. 写
61              out.write(buffer.toString().getBytes());
62          } catch (FileNotFoundException e) {
63              e.printStackTrace();
64          } catch (IOException e) {
65              e.printStackTrace();
66          } finally {
67              // 3. 释放输出流资源
68              if (out != null){
69                 try {
70                      out.flush();
71                      out.close();
72                  } catch (IOException e) {
73                     e.printStackTrace();
74                  }
75              }
76          }
77      }
78  }

 

6.  字符流:用于处理文本文件

 1  import java.io.FileNotFoundException;
 2  import java.io.FileReader;
 3  import java.io.FileWriter;
 4  import java.io.IOException;
 5  import java.io.Reader;
 6  import java.io.Writer;
 7  
 8  /**
 9   * 字符输入输出流测试
10   * 
11   *
12   */
13  public class IOTest2 {
14  
15      public static void main(String[] args) {
16          StringBuffer buffer = new StringBuffer();
17  
18          /* 输入流 */
19          Reader reader = null;
20  
21          try {
22              // 1. 打开流
23              reader = new FileReader("E:\\jg\\exercise.txt");
24              // 2. 读取
25              char[] ch = new char[128]; // 缓冲区
26              int len;
27              do {
28                  len = reader.read(ch);
29                  if (len == -1)
30                      break;
31                  buffer.append(new String(ch, 0, len));
32             } while (len != -1);
33             System.out.println(buffer.toString());
34         } catch (FileNotFoundException e) {
35              e.printStackTrace();
36         } catch (IOException e) {
37              e.printStackTrace();
38          } finally {
39              // 3. 释放资源
40              if (reader != null) {
41                  try {
42                      reader.close();
43                  } catch (IOException e) {
44                      e.printStackTrace();
45                  }
46              }
47          }
48  
49          /* 输出流 */
50  
51          Writer writer = null;
52  
53          try {
54              // 1. 打开流
55              writer = new FileWriter("d:\\test.txt");
56              // 2. 写入
57              writer.write(buffer.toString());
58          } catch (IOException e) {
59              e.printStackTrace();
60          } finally {
61              // 3. 释放资源
62              if (writer != null) {
63                  try {
64                      writer.flush();
65                      writer.close();
66                  } catch (IOException e) {
67                      e.printStackTrace();
68                  }
69             }
70          }
71      }
72  } 

 

7.  对象流:基于对象的读写,由ObjectInputStream / ObjectOutputStream来提供

      读写对象:①对应的类必须实现java.io.Serializable接口;

           ②类被序列化之后通过ObjectInputStream / ObjectOutputStream对对象进行读写。

      在定义类是用 transient 修饰属性则该属性不能被实例化。这样有利于保护数据安全性。

      实现接口后使用ObjectInputStream 类将对象拆成字节序列的过程称为序列化;使用 ObjectOutputStream 类将字节序列还原称对象的过程称为反序列化。

8. java IO一般使用原则:

  8.1按数据来源(去向)分类:

    1、是文件:FileInputStream, FileOutputStream, FileReader, FileWriter 

    2、是byte[]ByteArrayInputStream, ByteArrayOutputStream 

    3、是Char[]: CharArrayReader, CharArrayWriter 

    4、是String: StringBufferInputStream, StringReader, StringWriter 

    5、网络数据流:InputStream, OutputStream, Reader, Writer 

  8.2按是否格式化输出分:

    1、要格式化输出:PRintStream, PrintWriter 

  8.3按是否要缓冲分:

    1、要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter 

  8.4按数据格式分:

    1、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类

    2、纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类

  8.5按输入输出分:

    1、输入:Reader, InputStream类型的子类

    2、输出:Writer, OutputStream类型的子类

  8.6特殊需要:

    1、从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter 

    2、对象输入输出:ObjectInputStream, ObjectOutputStream 

    3、进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter

    4、合并输入:SequenceInputStream 

    5、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader 

 

posted @ 2015-04-26 15:31  Myth_寸虽  阅读(149)  评论(0编辑  收藏  举报