io 流

本文深入探讨Java中IO流的分类、基本方法及其在实际应用中的操作与优化,包括输入流与输出流、字节流与字符流、节点流与处理流的使用,以及如何通过FilterInputStream和FilterOutputStream为流添加特定功能。通过实例演示如何利用Java IO流进行文件读写操作,以及如何使用RandomAccessFile实现文件的高效读写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

InputStream的任务就是代表那些从各种输入源获取数据的类,这些源主要有byte数组,String对象,文件,管道,流序列,Internet.这些数据源各自都有与之相对应的InputStream的子类.

1)ByteArrayInputStream:以缓冲区内存为InputStream

2)StringBufferInputStream:以String为InputStream

3)FileInputStream:专门用来读文件

4)PipedInputStream:从PipedOutputStream提取数据实现"管道"功能

5)SequenceInputStream:把两个或者多个InputStream合并成一个.

6)FilterInputStream:一个为decorator定义接口用的抽象类.

OutputStream是解决往哪里输出的类,是byte数组,文件或者是管道.

1)ByteArrayOutputStream:在内存里创建一个缓冲区,数据送到流里就是写入这个缓冲区.

2)FileOutputStream:把数据写入文件.

3)PipedOutputStream:写入这个流的数据,最终都会变成与之相关联的PipedInputStream的数据源.

4)FilterOutputStream:一个能decorator提供接口的抽象类.

 

下面几种类型:
Input stream
1) CharArrayReader:与ByteArrayInputStream对应
2) StringReader:与StringBufferInputStream对应
3) FileReader:与FileInputStream对应
4) PipedReader:与PipedInputStream对应
Out stream
1) CharArrayWrite:与ByteArrayOutputStream对应
2) StringWrite:无与之对应的以字节为导向的stream
3) FileWrite:与FileOutputStream对应
4) PipedWrite:与PipedOutputStream对应

以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,只是在操作时的导向不同。如CharArrayReader:和 ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是后者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。

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.3.1 用于封装以字节为导向的OutputStream
1) DataIOutStream:往stream中输出基本类型(int、char等)数据。
2) BufferedOutStream:使用缓冲区
3) PrintStream:产生格式化输出

2.3.2 用于封装以字符为导向的OutputStream
1) BufferedWrite:与对应
2) PrintWrite:与对应

3. RandomAccessFile

1) 可通过RandomAccessFile对象完成对文件的读写操作
2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
3) 可以直接跳到文件中指定的位置

 

    一、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已到输入流的末尾

 

实例一:

package io.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class IOTest {
 public static void main(String[] args){
  InputStream is = null;
  OutputStream os = null;
  File f = null;
  int len = -1;
  try {
   f = new File("D:\\up\\a.txt");  //up文件夹下面要有a.txt文件
   is = new FileInputStream(f);// == new FileInputStream("D:\\up\\a.txt")
   os = new FileOutputStream("D:\\down\\a.txt");  //理解为下载到D:/down下,名为a.txt
   byte[] b = new byte[1024];
   while ((len = is.read())>0) {
    os.write(b, 0 , len);
   }
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e1) {
   e1.printStackTrace();
  } finally {
   try {
    if(null != is)
     is.close();
    if(null != os)
     os.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  
 }
}

实例二:

.... 继续 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值