目录
Java IO原理
- I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
- ava程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行。
- ava.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据
- 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
- 输出output:写入将程序(内存)数据输出到磁盘、光盘等存储设备中。
流的分类
- 按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
- 按数据流的流向不同分为:输入流,输出流
字符流,只能操作文本文件,不能操作图片,视频等非文本文件。所以当我们单纯的想操作文本文件,就使用字符流,其他情况一律使用字节流。 - 按流的角色的不同分为:节点流,处理流
- Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。
- 由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
分类 字节输入流 字节输出流 字符输入流 字符输出流 抽象基类 InputStream OutputStream Reader Wirter 节点流/文件流 FileInputStream FileOutputStream FileReader FileWriter 访问数组 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWirter 访问管道 PipedInputStream PipedOutputStream PipedReader PipedWirter 访问字符串 # # StringReader StringWriter 缓冲流 BufferedInputStream BufferedOutputStream BufferedReader BufferedWinter 转换流 # # InputStreamReader OutputStreamWriter 对象流 ObjectInputStream ObjectOutputStream # # 过滤流 FilterInputStream FilterOutputStream FilterReader FilterWriter 打印流 # PrintStream # PrintWriter 退回输入流 PushbackInputStream # PushbackReader # 特殊流 DataInputStream DataOutputStream # #
节点流和处理流
- 节点流:直接从数据源或目的地读写数据
- 处理流:不直接连接到数据源或目的地,而是"连接"在已存在地流,(节点流或处理流)之上,通过对数据地处理为程序提供更为强大地读写功能.
InputStream & Reader 输入流
- InputStream 和 Reader是所有输入流地基类
- InputStream 字节输入流(典型实现类 FileInputStream)
- int read()
- int read(byte[] b)
- int read(byte[] b,int off,int len)
参数:
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
abstract void close•() 关闭流并释放与之相关联的任何系统资源。
int read•() 读一个字符.
int read•(char[] cbuf) 将字符读入数组.
abstract int read•(char[] cbuf, int off, int len) 将字符读入数组的一部分.
void mark•(int readAheadLimit) 标记流中的当前位置.
boolean markSupported•() 告诉这个流是否支持mark()操作.
int read•(CharBuffer target) 尝试将字符读入指定的字符缓冲区.
boolean ready•() 告诉这个流是否准备好被读取.
void reset•() 重置流.
long skip•(long n) 跳过字符.
InputStream 方法
- int read()
从输入流中读取数据的下一个字节。返回0 到255 范围内的int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值-1。- int read(byte[] b)
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。否则以整数形式返回实际读取的字节数。
- int read(byte[] b)
- int read(byte[] b, int off,int len)
将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回值-1。 - public void close() throws IOException
关闭此输入流并释放与该流关联的所有系统资源。
void close•() 关闭此输入流并释放与流相关联的任何系统资源。
abstract int read•() 从输入流读取数据的下一个字节。
int read•(byte[] b) 从输入流中读取一些字节数,并将它们存储到缓冲器阵列 b 。
int read•(byte[] b, int off, int len) 从输入流读取最多 len个字节的数据到字节数组。
//-1表示读取到文件末尾了
int available•() 从下一次调用此输入流的方法返回可从该输入流读取(或跳过)的字节数,而不会阻塞。
void mark•(int readlimit) 标记此输入流中的当前位置。
boolean markSupported•() 测试此输入流是否支持 mark和 reset方法。
byte[] readAllBytes•() 从输入流读取所有剩余字节。
int readNBytes•(byte[] b, int off, int len) 将所请求的字节数从输入流读入给定的字节数组。
void reset•() 将此流重新定位到最后在此输入流上调用 mark方法时的位置。
long skip•(long n) 跳过并丢弃来自此输入流的 n字节的数据。
long transferTo•(OutputStream out) 从该输入流中读取所有字节,并按读取的顺序将字节写入给定的输出流。
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
关闭此输入流并释放与该流关联的所有系统资源。
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
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 个字节写入此输出流。
参数;
int off:数组的起始索引
int len:写入的字节数
- public void flush()throws IOException
刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标。 - public void close() throws IOException
关闭此输出流并释放与该流关联的所有系统资源。
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
关闭此输出流并释放与该流关联的所有系统资源。
Writer append•(char c) 将指定的字符附加到此作者。
Writer append•(CharSequence csq) 将指定的字符序列附加到此作者。
Writer append•(CharSequence csq, int start, int end) 将指定字符序列的子序列附加到此作者。
abstract void close•() 关闭流,先刷新。
abstract void flush•() 刷新流。
void write•(char[] cbuf) 写入一个字符数组。
abstract void write•(char[] cbuf, int off, int len) 写入字符数组的一部分,从char数组的起始索引值off开始,len
个字符个数。
void write•(int c) 写一个字符
void write•(String str) 写一个字符串
void write•(String str, int off, int len) 写一个字符串的一部分,从字符串起始索引off开始,写入len个字符个
数。
如果流已关闭则不可以在添加了否则抛出异常
推荐
节点流/文件流 FileOutputStream/FileInputStream FileReader/FileWriter