关于Java IO流学习总结

来源:互联网 发布:通假字 错别字 知乎 编辑:程序博客网 时间:2024/05/17 06:11
摘自: www.chinaitlab.com  被阅读次数: 18

由 yangyi 于 2009-03-03 22:00:02 提供

    一、IO流的三种分类方式

    1.按流的方向分为:输入流和输出流

    2.按流的数据单位不同分为:字节流和字符流

    3.按流的功能不同分为:节点流和处理流

    二、IO流的四大抽象类:

    字符流:Reader Writer

    字节流:InputStream(读数据)

    OutputStream(写数据)

    三、InputStream的基本方法

    int read() throws IOException 读取一个字节以整数形式返回,如果返回-1已到输入流的末尾

    void close() throws IOException 关闭流释放内存资源

    long skip(long n) throws IOException 跳过n个字节不读

    四、OutputStream的基本方法

    void write(int b) throws IOException 向输出流写入一个字节数据

    void flush() throws IOException 将输出流中缓冲的数据全部写出到目的地

    五、Writer的基本方法

    void write(int c) throws IOException 向输出流写入一个字符数据

    void write(String str) throws IOException将一个字符串中的字符写入到输出流

    void write(String str,int offset,int length)

    将一个字符串从offset开始的length个字符写入到输出流

    void flush() throws IOException

    将输出流中缓冲的数据全部写出到目的地

    六、Reader的基本方法

    int read() throws IOException 读取一个字符以整数形式返回,如果返回-1已到输入流的末尾

    七、节点流类型

    八、访问文件之FileInputStream和FileOutputStream继承基类用于向文件中输入输出字节

    九、访问文件之FileReader和FileWriter继承基类用于向文件中输入输出字符

----输出流在构造函数第二个参数可以设置true意义为跟在已有文件后进行输入
----此类流会抛出FileNotFoundException需要对其进行显示捕捉

 

    十、缓冲流:缓冲流要套接在相应的节点流之上,提高了读写的效率。

    此处理流的构造方法都得传相对应的基类类型

    BufferedReader:提供了readLine方法用于高校读取一行字符串

    BufferedWriter:提供了newLine用于写入一个行分隔符也就是换行

    BufferedInputStream 没多大用处

    BufferedOutputStream 没多大用处

    十一、转换流:主要作用将字节流转换成字符流。用处较大!

    转换流在构造时可以指定其编码集合

    InputStreamReader需要和InputStream套接

    OutputStreamWriter需要和OutputStream套接

    例:OutputStreamWriter osw = new OutputStreamWriter (new FileOutputStream(文件路径);

    方法例:osw.getEncoding(); 获得流的编码方式

    十二、数据流与字节数组流:

    数据流主要为实现可以存取Java原始数据类型如long,boolean

    数据流是字节流

    DataInputStream需要和InputStream套接

    DataOutputStream需要和OutputStream套接

    DataInputStream方法:readBoolean() readInt() read……()……

    readUTF():网络传输常用方法 读一个Unicode字符串

    DataOutputStream方法与DataInputStream基本对应为写的方法

    //此构造函数等于已可以往一个字节数组里输入内容

    ByteArrayOutputStream baos = new ByteArrayOutputStream ();

    //此方法为获取一个字节数组方法返回字节数组

    baos.toByteArray();

    //此方法获取字节数组占了多少字节

    new ByteArrayInputStream(一个字节数组)。available()

 1ByteArrayOutputStream baos = 
 2                        new ByteArrayOutputStream(); 
 3    DataOutputStream dos = 
 4                        new DataOutputStream(baos);
 5    try {
 6      dos.writeDouble(Math.random());
 7      dos.writeBoolean(true);
 8      ByteArrayInputStream bais = 
 9          new ByteArrayInputStream(baos.toByteArray());
10      System.out.println(bais.available());
11      DataInputStream dis = new DataInputStream(bais);
12      System.out.println(dis.readDouble());
13      System.out.println(dis.readBoolean());
14      dos.close();  dis.close();
15    }
 catch (IOException e) {
16      e.printStackTrace();
17    }

    十二、Print流

    Print流只有输出流无输入流,PrintWriter和PrintStream分别针对字符字节

    两个类提供了重载的Print和Println方法用于多种数据类型的输出

    PrintWriter和PrintStream的输出操作不会抛出异常

    PrintWriter和PrintStream有自动flush功能

    ----System.setOut(接收OutputStream类):用于设置系统默认输出流

    十二、Object流

    等同于c#序列化,用直接将Object写入或读出

    transient关键字为不序列化此成员变量

    需要序列化的类必须实现Serializable接口

    主要方法:writeObject(Object); readObject();

    读出为Object类型需要强转数据类型

 1 import java.io.*;
 2 
 3 public class TestObjectIO {
 4     public static void main(String args[]) throws Exception {
 5         T t = new T();
 6         t.k = 8;
 7         FileOutputStream fos = new FileOutputStream("d:/share/java/io/testobjectio.dat");
 8         ObjectOutputStream oos = new ObjectOutputStream(fos);
 9         oos.writeObject(t);
10         oos.flush();
11         oos.close();
12         
13         FileInputStream fis = new FileInputStream("d:/share/java/io/testobjectio.dat");
14         ObjectInputStream ois = new ObjectInputStream(fis);
15         T tReaded = (T)ois.readObject();
16         System.out.println(tReaded.i + " " + tReaded.j + " " + tReaded.d + " " + tReaded.k);
17         
18     }
19 }
20 
21 class T 
22     implements Serializable
23 {
24     int i = 10;
25     int j = 9;
26     double d = 2.3;
27     transient int k = 15;
28 }

 

原文链接: http://java.chinaitlab.com/base/...

最后补充点:

一. Input和Output
1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型:
1.1 以字节为导向的stream
以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型:
1) input stream:
1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
2) StringBufferInputStream:把一个String对象作为InputStream
3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作
4) PipedInputStream:实现了pipe的概念,主要在线程中使用
5) SequenceInputStream:把多个InputStream合并为一个InputStream
2) Out stream
1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
2) FileOutputStream:把信息存入文件中
3) PipedOutputStream:实现了pipe的概念,主要在线程中使用
4) SequenceOutputStream:把多个OutStream合并为一个OutStream
1.2 以Unicode字符为导向的stream
以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型:
1) Input Stream
1) CharArrayReader:与ByteArrayInputStream对应
2) StringReader:与StringBufferInputStream对应
3) FileReader:与FileInputStream对应
4) PipedReader:与PipedInputStream对应
2) Out Stream
1) CharArrayWrite:与ByteArrayOutputStream对应
2) StringWrite:无与之对应的以字节为导向的stream
3) FileWrite:与FileOutputStream对应
4) PipedWrite:与PipedOutputStream对应

以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。如 CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。
1.3 两种不现导向的stream之间的转换
InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。
2. stream添加属性
2.1 “为stream添加属性”的作用
运用上面介绍的Java中操作IO的API,我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类,我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。
如果我们要往一个文件中写入数据,我们可以这样操作:
FileOutStream fs = new FileOutStream(“test.txt”);
然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,如果我们想实现“先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中”的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和 FilterOutStream的子类,为FileOutStream添加我们所需要的功能。
2.2 FilterInputStream的各种类型
2.2.1 用于封装以字节为导向的InputStream
1) DataInputStream:从stream中读取基本类型(int、char等)数据。
2) BufferedInputStream:使用缓冲区
3) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber(int)
4) PushbackInputStream:很少用到,一般用于编译器开发
2.2.2 用于封装以字符为导向的InputStream
1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream
2) BufferedReader:与BufferedInputStream对应
3) LineNumberReader:与LineNumberInputStream对应
4) PushBackReader:与PushbackInputStream对应
2.3 FilterOutStream的各种类型
2.2.3 用于封装以字节为导向的OutputStream
1) DataIOutStream:往stream中输出基本类型(int、char等)数据。
2) BufferedOutStream:使用缓冲区
3) PrintStream:产生格式化输出
2.2.4 用于封装以字符为导向的OutputStream
1) BufferedWrite:与对应
2) PrintWrite:与对应
3. RandomAccessFile
1) 可通过RandomAccessFile对象完成对文件的读写操作
2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
3) 可以直接跳到文件中指定的位置

原创粉丝点击