Java文件操作——IO流

简介

Java IO流有输入流、输出流,也可以看成是字节流、字符流。
1、输入流和输出流很好理解,只需要搞清楚所谓的输入和输出是相对与程序来说的。
2、字符流实际上是通过字节流实现的,所以字符流能完成的工作,字节流都可以胜任。另外,根据API的说明,我们提倡在读取文本文件时采用字符流,而读取非文本文件(图像和音频等)时必须使用字节流。
3、IO流与File类的关系,简单的说File类是用来表示文件的属性,IO流是用来读取文件内容的。

常用的IO流

IO输入流输出流
字节流InputStreamOutputStream
字符流ReaderWriter

字节流InputStream和OutputStream作为字节流的最基本类,都在Java io包下,它们是抽象类,不能够被实例化,所以在实际使用中需要根据实际情况选择它们的子类来实例化。相同的,字符流Reader和Writer也是如此。

InputStream OutputStream

InputStream常用子类——FileInputStream

构造方法:
FileInputStream(File file)
FileInputStream(String name)

常用方法分析:
int available() 返回可以不受阻塞地从此文件输入流中读取的字节数。
void close() 关闭此文件输入流并释放与此流有关的所有系统资源。

int read() 从此输入流中读取一个数据字节。
int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个字节数组中。
int read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个字节数组中。

long skip(long n) 从输入流中跳过并丢弃 n 个字节的数据。

值得注意的是关于read方法,可以视为一次只读取一个字节和一次性读取多个字节。一般后者的读取速度比前者要快。

InputStream常用子类——DataInputStream

DataInputStream
构造方法:
DataInputStream(InputStream in) 使用指定的基础 InputStream 创建一个 DataInputStream。

常用方法分析:
int read(byte[] b) 从所包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b 中。
int read(byte[] b, int off, int len) 从所包含的输入流中将 len 个字节读入一个字节数组中。
boolean readBoolean() 参见 DataInput 的 readBoolean 方法的常规协定。
byte readByte() 参见 DataInput 的 readByte 方法的常规协定。
char readChar() 参见 DataInput 的 readChar 方法的常规协定。
double readDouble() 参见 DataInput 的 readDouble 方法的常规协定。
float readFloat() 参见 DataInput 的 readFloat 方法的常规协定。
void readFully(byte[] b) 参见 DataInput 的 readFully 方法的常规协定。
void readFully(byte[] b, int off, int len) 参见 DataInput 的 readFully 方法的常规协定。
int readInt() 参见 DataInput 的 readInt 方法的常规协定。
long readLong() 参见 DataInput 的 readLong 方法的常规协定。
String readUTF() 参见 DataInput 的 readUTF 方法的常规协定。
static String readUTF(DataInput in) 从流 in 中读取用 UTF-8 修改版格式编码的 Unicode 字符格式的字符串;然后以 String 形式返回此字符串。
int skipBytes(int n) 参见 DataInput 的 skipBytes 方法的常规协定。

该类方法的主要特点是包装了直接读取制定类型数据,可以一次性读取int ,long,double等数据

InputStream常用子类——BufferedInputStream

BufferedInputStream
构造方法:
BufferedInputStream(InputStream in) 创建 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的 BufferedInputStream,并保存其参数,即输入流 in,以便将来使用。

常用方法分析:
int available() 返回可以不受阻塞地从此输入流读取的字节数。
void close() 关闭此输入流并释放与该流关联的所有系统资源。
void mark(int readlimit) 参见 InputStream 的 mark 方法的常规协定。
boolean markSupported() 测试此输入流是否支持 mark 和 reset 方法。
int read() 从输入流读取下一个数据字节。
int read(byte[] b, int off, int len) 在此字节输入流中从给定的偏移量开始将各字节读取到指定的 byte 数组中。
void reset() 将此流重新定位到对此输入流最后调用 mark 方法时的位置。
long skip(long n) 跳过和放弃此输入流中的 n 个数据字节。

该类的主要特点是提供的每次读取多个字符的read方法,从而进一步提高了数据获取的效率

OutputStream常用子类——FileOutputStream

构造方法:
FileOutputStream(File file)

常用方法分析:
void close() 关闭此输出流并释放与此流有关的所有系统资源。
void flush() 刷新此输出流并强制写出所有缓冲的输出字节。

void write(byte[] b) 将 b.length 个字节从指定的字节数组写入此输出流。
void write(byte[] b, int off, int len) 将指定字节数组中从偏移量 off 开始的 len 个字节写入此输出流。

值得注意的是,关于flush这个方法,是将已经写入到内存的内容交由系统写入文件。一般系统会自动写入文件,可用可不用。

OutputStream常用子类——DataOutputStream

DataoutputStream
构造方法:
DataOutputStream(OutputStream out) 创建一个新的数据输出流,将数据写入指定基础输出流。

常用方法分析:
void flush() 清空此数据输出流。
int size() 返回计数器 written 的当前值,即到目前为止写入此数据输出流的字节数。
void write(byte[] b, int off, int len) 将指定字节数组中从偏移量 off 开始的 len 个字节写入基础输出流。
void writeXXX(XXX v)
将一个XXX值以相应的形式写出到基础输出流中。

与DataInputStream相对应,主要特点是提供将一定格式的字符以相应的格式输出

OutputStream常用子类——BufferedOutputStream

BufferedOutStream
构造方法:
BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的基础输出流。
BufferedOutputStream(OutputStream out, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。

常用方法分析:
void flush() 刷新此缓冲的输出流。
void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。
void write(int b) 将指定的字节写入此缓冲的输出流。

与BufferedinputStream相对应,提供一次性输出多字符的方法

Reader常用子类——FileReader

FileReader
构造方法:
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。

常用方法分析:
int read() 读取单个字符。返回作为整数读取的字符,如果已达到流末尾,则返回 -1。
int read(char []cbuf) 将字符读入数组。返回读取的字符数。如果已经到达尾部,则返回-1。
void close()关闭此流对象。释放与之关联的所有资源。

Reader常用子类——InputStreamReader

inputStream

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。

构造方法:
InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, Charset cs) 创建使用给定字符集的 InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec) 创建使用给定字符集解码器的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。

常用方法分析:
主要用途是配合BufferedReader使用

Reader常用子类——BufferedReader

BufferedReader
构造方法:
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。
eg.

FileReader fr = new FileReader("D:/test.txt");
BufferedReader br = new BufferedReader(fr);
//用于接收键盘和其他设备录入
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));

常用方法分析:
void close() 关闭该流。
void mark(int readAheadLimit) 标记流中的当前位置。
boolean markSupported() 判断此流是否支持 mark() 操作(它一定支持)。

int read() 读取单个字符。
int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。
String readLine() 读取一个文本行。

boolean ready() 判断此流是否已准备好被读取。
void reset() 将流重置为最新的标记。
long skip(long n) 跳过字符。

关于read方法和readLine方法,read方法与一般的读方法大致相同,readLine方法则可以一次性读取一行,效率相对较高。

Writer常用子类——FileWriter

FileWriter
构造方法:
FileWriter(File file) 在给出 File 对象的情况下构造一个 FileWriter 对象。
FileWriter(String fileName) 在给出文件名的情况下构造一个 FileWriter 对象。

常用方法分析:
void write(String str) 写入字符串。当执行完此方法后,字符数据还并没有写入到目的文件中去。此时字符数据会保存在缓冲区中。此时在使用刷新方法就可以使数据保存到目的文件中去。

viod flush() 刷新该流中的缓冲。将缓冲区中的字符数据保存到目的文件中去。
viod close() 关闭此流。在关闭前会先刷新此流的缓冲区。在关闭后,再写入或者刷新的话,会抛IOException异常。

Writer常用子类——BufferedWriter

BufferedWriter
构造方法:
BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz) 创建一个使用指定大小输出缓冲区的新缓冲字符输出流。

常用方法分析:
void close() 关闭该流。
void flush() 刷新该流的缓冲。
void newLine() 写入一个行分隔符。
void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
void write(int c) 写入单个字符。
void write(String s, int off, int len) 写入字符串的某一部分。

几个例子

eg.复制test.txt中的内容到copy.txt

package com.buaa.io;
//文本文件复制,优先使用字符流,且使用BufferedReader和BufferedWriter效率最高
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

public class copyFile {
    public static void main(String[] args)throws Exception {
        BufferedWriter bw = new BufferedWriter(new FileWriter("d:/copy.txt")); 
        FileReader fr = new FileReader("d:/test.txt");
        BufferedReader br = new BufferedReader(fr);
        String s = null;
        while((s=br.readLine())!=null){
            bw.write(s);
            bw.newLine();
        }
        br.close();
        bw.close();
    }

}

eg.复制test.rar压缩包

留白
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值