`
he_wen
  • 浏览: 239437 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java流总结

    博客分类:
  • Java
阅读更多

一、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;
}

java中的io中的(input/output)stream无非就是包括基于字符的stream、基于字节的stream和把字节导向的stream转换
字符为导向的stream的stream。(很难理解么?)
以字节为导向的stream------InputStream/OutputStream
InputStream 和 OutputStream是两个abstact类,对于字节为导向的stream都扩展这两个鸡肋(基类^_^);
--InputStream
ByteArrayInputStream -- 把内存中的一个缓冲区作为InputStream使用.

construct---ByteArrayInputStream(byte[])创建一个新字节数组输入流,它从指定字节数组中读取数据。
---ByteArrayInputStream(byte[], int, int) 创建一个新字节数组输入流,它从指定字节数组中读取数据。
---mark::该字节数组未被复制。

StringBufferInputStream -- 把一个String对象作为InputStream .
注释:不推荐使用 StringBufferInputStream 方法。 此类不能将字符正确的转换为字节。
同 JDK 1.1 版中的类似,从一个串创建一个流的最佳方法是采用 StringReader 类。

construct---StringBufferInputStream(String) 据指定串创建一个读取数据的输入流串。

FileInputStream -- 把一个文件作为InputStream,实现对文件的读取操作

construct---FileInputStream(File) 创建一个输入文件流,从指定的 File 对象读取数据。
---FileInputStream(FileDescriptor) 创建一个输入文件流,从指定的文件描述器读取数据。
---FileInputStream(String) 创建一个输入文件流,从指定名称的文件读取数据。

method ---- read() 从当前输入流中读取一字节数据。
read(byte[]) 将当前输入流中 b.length 个字节数据读到一个字节数组中。
read(byte[], int, int) 将输入流中 len 个字节数据读入一个字节数组中。

PipedInputStream:实现了pipe的概念,主要在线程中使用. 管道输入流是指一个通讯管道的接收端。
一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,
这样可实现两个线程间的通讯。

PipedInputStream() 创建一个管道输入流,它还未与一个管道输出流连接。
PipedInputStream(PipedOutputStream) 创建一个管道输入流, 它已连接到一个管道输出流。

SequenceInputStream:把多个InputStream合并为一个InputStream .“序列输入流”类允许应用程序把几个输入流连续地合并起来,
并且使它们像单个输入流一样出现。每个输入流依次被读取,直到到达该流的末尾。
然后“序列输入流”类关闭这个流并自动地切换到下一个输入流。
SequenceInputStream(Enumeration) 创建一个新的序列输入流,并用指定的输入流的枚举值初始化它。
SequenceInputStream(InputStream, InputStream) 创建一个新的序列输入流,初始化为首先 读输入流 s1, 然后读输入流 s2。

--OutputSteam

ByteArrayOutputStream:把信息存入内存中的一个缓冲区中.该类实现一个以字节数组形式写入数据的输出流。
当数据写入缓冲区时,它自动扩大。用 toByteArray() 和 toString() 能检索数据。

construct --- ByteArrayOutputStream() 创建一个新的字节数组输出流。
--- ByteArrayOutputStream() 创建一个新的字节数组输出流。
--- ByteArrayOutputStream(int) 创建一个新的字节数组输出流,并带有指定大小字节的缓冲区容量。
toString(String) 根据指定字符编码将缓冲区内容转换为字符串,并将字节转换为字符。
write(byte[], int, int) 将指定字节数组中从偏移量 off 开始的 len 个字节写入该字节数组输出流。
write(int) 将指定字节写入该字节数组输出流。
writeTo(OutputStream) 用 out.write(buf, 0, count) 调用输出流的写方法将该字节数组输出流的全部内容写入指定的输出流参数。

FileOutputStream:文件输出流是向 File 或 FileDescriptor 输出数据的一个输出流。

FileOutputStream(File) 创建一个文件输出流,向指定的 File 对象输出数据。
FileOutputStream(FileDescriptor) 创建一个文件输出流,向指定的文件描述器输出数据。
FileOutputStream(String) 创建一个文件输出流,向指定名称的文件输出数据。
FileOutputStream(String, boolean) 用指定系统的文件名,创建一个输出文件。

PipedOutputStream:管道输出流是指一个通讯管道的发送端。 一个线程通过管道输出流发送数据,
而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。

PipedOutputStream() 创建一个管道输出流,它还未与一个管道输入流连接。
PipedOutputStream(PipedInputStream) 创建一个管道输出流,它已连接到一个管道输入流。


以字符为导向的stream Reader/Writer

以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream 中写入信息。
Reader/Writer 为abstact类
以Unicode字符为导向的stream包括下面几种类型:

-- Reader

1) CharArrayReader:与ByteArrayInputStream对应
CharArrayReader(char[]) 用指定字符数组创建一个 CharArrayReader。
CharArrayReader(char[], int, int) 用指定字符数组创建一个 CharArrayReader。

2) StringReader:与StringBufferInputStream对应
StringReader(String) 创建一新的串读取者。
3) FileReader:与FileInputStream对应

4) PipedReader:与PipedInputStream对应

-- Writer

1) CharArrayWrite:与ByteArrayOutputStream对应
2) StringWrite:无与之对应的以字节为导向的stream
3) FileWrite:与FileOutputStream对应
4) PipedWrite:与PipedOutputStream对应

两种不现导向的stream之间的转换
InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。
一个 InputStreamReader 类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。
使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。

InputStreamReader 的 read() 方法之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。
为了达到更高效率,考虑用 BufferedReader 封装 InputStreamReader,
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

InputStreamReader(InputStream) 用缺省的字符编码方式,创建一个 InputStreamReader。
InputStreamReader(InputStream, String) 用已命名的字符编码方式,创建一个 InputStreamReader。

OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。
每个 OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是从字符流到字节流的桥梁。

FilterInputStream、RandomAccessFile 见例子。
ObjectInputStream 、 ObjectOutputStream见另外blog。


Java IO的一般使用原则:

一、按数据来源(去向)分类:
1、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
2、是byte[]:ByteArrayInputStream, ByteArrayOutputStream
3、是Char[]: CharArrayReader, CharArrayWriter
4、是String: StringBufferInputStream, StringReader, StringWriter
5、网络数据流:InputStream, OutputStream, Reader, Writer

二、按是否格式化输出分:
1、要格式化输出:PrintStream, PrintWriter

三、按是否要缓冲分:
1、要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter

四、按数据格式分:
1、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类
2、纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类

五、按输入输出分:
1、输入:Reader, InputStream类型的子类
2、输出:Writer, OutputStream类型的子类

六、特殊需要:
1、从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter
2、对象输入输出:ObjectInputStream, ObjectOutputStream
3、进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4、合并输入:SequenceInputStream
5、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
首先,考虑最原始的数据格式是什么: 原则四
第二,是输入还是输出:原则五
第三,是否需要转换流:原则六第1点
第四,数据来源(去向)是什么:原则一
第五,是否要缓冲:原则三 (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)
第六,是否要格式化输出:原则二

1
0
分享到:
评论

相关推荐

    java数据流总结

    java数据流总结,java io流总结,节点流和处理流 java数据流总结,java io流总结,节点流和处理流 java数据流总结,java io流总结,节点流和处理流

    Java io流总结

    Java io流的总结

    JAVA_IO流学习总结

    JAVA_IO流学习总结

    JavaIO总结

    有关Java输入输出流的总结有关Java输入输出流的总结有关Java输入输出流的总结

    Java IO流 总结

    Java IO流总结 Java IO流是Java语言中最基本和最重要的输入/输出机制,负责将数据从外部世界输入到Java应用程序中或将数据从Java应用程序输出到外部世界。IO流可以分为两大类:字节流和字符流。 1. 节点流:离数据...

    java IO流总结.md

    java I/O流的总结 1.操作数据单位:字节流、字符流 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,...),使用字节流处理 2.数据的流向:输入流、输出流 ...

    《JAVA_IO流学习总结》

    总结来说,Java IO流是一个庞大的体系,覆盖了从基础的文件操作到复杂的网络通信,理解并熟练掌握这一部分将极大地提升Java开发者的技能。通过学习和实践,开发者可以灵活地处理各种数据输入输出场景,为应用程序...

    java流IO总结

    ### Java IO流详解 #### 一、概述 Java的I/O操作主要涉及使用Java语言进行输入和输出操作。Java的所有I/O机制都是基于数据流来进行输入输出,这些数据流表示了字符或字节数据的流动序列。理解Java的I/O模型对于...

    JavaIO流详细总结

    下面是对Java IO流的详细总结: 1. 流的概念: 流是一种抽象的数据传输方式,可以将数据从一个地方传输到另一个地方。Java中的流分为输入流和输出流,分别用于读取和写入数据。流按照处理数据的不同类型,又可以...

    Java数据流编程

    ### Java 数据流编程详解 #### 一、引言 在Java编程中,数据流是处理文件输入输出的基础技术之一。本文将重点介绍几种常见的数据流操作方式:单字节流复制、字节数组流复制以及缓冲流复制,并通过具体的代码示例来...

    JAVA的IO流总结

    java的IO流总结:包含Inputstream,OutputStream,writer和reader

    java 技术总结.--java 技术

    Java的I/O库提供了丰富的类和方法用于文件操作、流处理和网络通信。Socket编程是Java进行网络通信的主要方式,支持TCP/IP协议。 六、多线程 Java内置了对多线程的支持,通过Thread类和Runnable接口可以创建并管理多...

    java流详细介绍

    ### Java流详细介绍 在Java编程语言中,流(Stream)是一种用于处理输入输出(I/O)操作的基础概念。Java中的流主要分为两大类:字节流(如InputStream和OutputStream)和字符流(如Reader和Writer)。这两种类型的...

    JAVAIO流学习总结(转)

    这是别人总结的很有实用价值的javaIO流教程。

    java基础总结资料

    9. **IO流**:Java的IO流处理能力强大,包括字符流和字节流,支持读写文件、网络通信等操作。 10. **多线程**:Java支持多线程编程,通过`Thread`类或者实现`Runnable`接口创建线程。同步机制(如`synchronized`...

    Java IO流总结

    Java IO流是Java平台中处理输入输出操作的核心组件,它允许程序与各种数据源(如文件、设备、网络连接)进行交互。IO流系统由多个类和接口组成,它们位于java.io包中,为开发者提供了读写数据的丰富功能。在Java中,...

    javaIO流知识大总结

    在这个大总结中,我们将深入探讨Java IO流的基本概念、分类、常用类以及实践应用。 1. **基本概念** - **流(Stream)**:在Java中,流是一个抽象的概念,代表数据的有序序列。它可以是字节流或字符流,流向可以是...

    Java流和文件总结(二)

    在本文中,我们将深入探讨Java流和文件处理的一些关键知识点。 首先,流是Java中的一个抽象概念,它代表了数据的有序传输。流可以是字节流(处理原始字节数据)或字符流(处理Unicode字符)。Java提供了许多类来...

Global site tag (gtag.js) - Google Analytics