java IO流

一、什么是IO流

* I : Input

* O : Output

通过IO可以完成硬盘文件的读和写

二、流的分类

按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)

按数据流的流向不同分为:输入流,输出流

按流的角色的不同分为:节点流,处理流

节点流:直接从数据源或目的地读写数据

处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。

流的体系结构:

IO流体系
分类字节输入流字节输出流字符输入流字符输出流
抽象基类InputStreamOutputStreamReaderWriter
访问文件FileInputStreamFileOutputStreamFileReaderFileWriter
访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
访问通道PipedInputStreamPipedOutputStreamPipedReaderPipedWriter

访问字符串

StringReaderStringWriter
缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流InputStreamReaderOutputStreamReader
对象流ObjectInputStreamObjectOutputStream
打印流PipedStreamPipedWriter
推回输入流PushbackInputStreamPushbackReader
特殊流DataInputStreamDataOutputStream
1.输入流
(1)InputStream & Reader

InputStream 和 Reader 是所有输入流的基类。

InputStream(典型实现:FileInputStream)

int read()

int read(byte[] b)

int read(byte[] b, int off, int len)

Reader(典型实现:FileReader)

int read()

int read(char [] c)

int read(char [] c, int off, int len)

程序中打开的文件 IO 资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源。

FileInputStream 从文件系统中的某个文件中获得输入字节。FileInputStream 用于读取非文本数据之类的原始字节流。要读取字符流,需要使用 FileReader

(2)InputStream

int read()

从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。

int read(byte[] b)

从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。否则以整数形式返回实际读取的字节数。

int read(byte[] b, int off,int len)

将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回值 -1。

public void close() throws IOException

关闭此输入流并释放与该流关联的所有系统资源。

(3)Reader

int read()

读取单个字符。作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff)(2个字节的Unicode码),如果已到达流的末尾,则返回 -1

int read(char[] cbuf)

将字符读入数组。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。

int read(char[] cbuf,int off,int len)

将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读len个字符。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。

public void close() throws IOException

2、输出流
(1)OutputStream & Writer

OutputStream 和 Writer 也非常相似:

Ø void write(int b/int c);

Ø void write(byte[] b/char[] cbuf);

Ø void write(byte[] b/char[] buff, int off, int len);

Ø void flush();

Ø void close(); 需要先刷新,再关闭此流

因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以 String 对象作为参数

Ø void write(String str);

Ø void write(String str, int off, int len);

FileOutputStream 从文件系统中的某个文件中获得输出字节。FileOutputStream 用于写出非文本数据之类的原始字节流。要写出字符流,需要使用 FileWriter

(2)OutputStream

void write(int b)

将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 即写入0~255范围的。

void write(byte[] b)

将 b.length 个字节从指定的 byte 数组写入此输出流。write(b) 的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同。

void write(byte[] b,int off,int len)

将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。

public void flush()throws IOException

刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标。

public void close() throws IOException

关闭此输出流并释放与该流关联的所有系统资源。

(3)Writer

void write(int c)

写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。 即写入0 到 65535 之间的Unicode码。

void write(char[] cbuf)

写入字符数组。

void write(char[] cbuf,int off,int len)

写入字符数组的某一部分。从off开始,写入len个字符

void write(String str)

写入字符串。

void write(String str,int off,int len)

写入字符串的某一部分。

void flush()

刷新该流的缓冲,则立即将它们写入预期目标。

public void close() throws IOException

关闭此输出流并释放与该流关联的所有系统资源

3、节点流
(1)读取文件(输入)

主要步骤

1.建立一个流对象,将已存在的一个文件加载进流

FileReader fr=new FileReader(new File("Test.txt"));

2.创建一个临时存放数据的数组

char[] ch=new char[1024];

3.调用流对象的读取方法将流中的数据读入到数组中

fr.read(ch);

4.关闭资源

fr.close();

说明点:
1. read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1
2. 异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理
3. 读入的文件一定要存在,否则就会报FileNotFoundException

(2)写入文件(输出)

主要步骤

创建流对象,建立数据存放文件

FileWriter fw=new FileWriter

调用流对象的写入方法,将数据写入流

fw.write(“zuguomeihao”);

关闭流资源,并将流中的数据清空到文件中

fw.close

说明: 输出操作,对应的File可以不存在的。并不会报异常

File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。

File对应的硬盘中的文件如果存在:

如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原有文件的覆盖

如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖,而是在原有文件基础上追加内容

4.缓冲流

处理流是对节点流的封装,提供了更高级别的操作功能。它们可以提高IO操作的效率,减少对底层资源的访问次数。常用的处理流包括BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter等。

处理流还可以用来进行数据的转换、过滤等操作,例如DataInputStreamDataOutputStream可以用来读写基本数据类型。

DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"));
dos.writeInt(123); // 写入整数数据

Java的IO流提供了丰富的功能和灵活的操作方式,使得开发者能够方便地处理各种输入输出需求。通过组合使用不同类型的流,可以实现对不同数据类型的高效处理和操作。同时,Java的IO流也提供了异常处理机制,确保程序在IO操作过程中的稳定性和可靠性。因此,在Java编程中,熟练掌握各种类型的IO流是非常重要的一部分。

  • 30
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值