【学习笔记】Java输入输出流
流的分类:
- 按操作数据单位不同分为:字节流、字符流
- 按数据流的流向不同:输入流、输出流
- 按流的角色不同分为:节点流、处理流/包装流
抽象基类 | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
FileInputStream:文件输入流
构造方法
FileInputStream(File file)
该文件通过文件系统中的File
对象file
指定。FileInputStream(String path)
该文件通过文件系统中的路径名path
指定。FileInputStream(FileDescriptor fdObj)
通过使用文件描述符fdObj
创建一个FileInputStream
,该文件描述符表示到文件系统中某个实际文件的现有连接。
方法摘要
返回值类型 | 方法名及形参列表 | 说明 |
---|---|---|
void |
close() |
关闭此文件输入流并释放与此流有关的所有系统资源。 |
int |
read() |
从此输入流中读取一个数据字节。 |
int |
read(byte[] b) |
从此输入流中将最多 b.length
个字节的数据读入一个byte数组中。 |
int |
read(byte[] b, int off, int len) |
从此输入流中将最多 len 个字节的数据读入一个 byte
数组中。 |
public int read()
- 返回:
- 下一个数据字节,如果到达文件末尾则返回 -1
1 | public class FileInputStram01 { |
public int read(byte[] b)
- 参数:
- b:存储读取数据的缓冲区
- 返回:
- 读入缓冲区的字节总数,如果因为已经到达文件末尾则返回 -1
1 | public class FileInputStram02 { |
public int read(byte[] b, int off, int len)
参数:
b:存储读取数据的缓冲区
off:目标数组 b 中的起始偏移量
len:读取的最大字节数
返回:
- 读入缓冲区的字节总数,如果因为已经到达文件末尾则返回 -1。
FileOutputStream:文件输出流
构造方法
FileOutputStream(File file)
该文件通过文件系统中的File
对象file
指定。FileOutputStream(File file, boolean append)
该文件通过文件系统中的File
对象file
指定。FileOutputStream(String path)
该文件通过文件系统中的路径名path
指定。FileOutputStream(String path, boolean append)
该文件通过文件系统中的路径名path
指定。FileOutputStream(FileDescriptor fdObj)
通过使用文件描述符fdObj
创建一个FileOutputStream
,该文件描述符表示到文件系统中某个实际文件的现有连接。
方法摘要
返回值类型 | 方法名及形参列表 | 说明 |
---|---|---|
void |
close() |
关闭此文件输出流并释放与此流有关的所有系统资源。 |
void |
write(int b) |
将指定字节写入此文件输出流。 |
void |
write(byte[] b) |
将 b.length 个字节从指定 byte
数组写入此文件输出流中。 |
void |
write(byte[] b, int off, int len) |
将指定 byte 数组中从偏移量 off 开始的 len
个字节写入此文件输出流。 |
1 | public class FileOutputStream01 { |
文件拷贝
思路分析:
- 创建文件的输入流,将文件读入到程序
- 创建文件输出流,将读取到的文件数据,写入到指定文件
1 | public class FileCopy { |
FileReader:字符输入流
构造方法
new FileReader(File file)
在给定从中读取数据的File
的情况下创建一个新FileReader
。new FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新FileReader
。
方法摘要
返回值类型 | 方法名及形参列表 | 说明 |
---|---|---|
int |
read() |
读取单个字符。 |
int |
read(char[] cbuf) |
批量读取多个字符到数组,返回读取到的字符数 |
int |
read(char[] cbuf, int offset, int length) |
将字符读入数组中的某一部分。 |
相关API:
new String(char[])
将char[]
转换成String
new String(char[],off,len)
将char[]
指定部分转换成String
错误的读取方式:
1 | hello world!wangqinlei王勤磊 |
1 | public class Reader01 { |
错误分析:
每次均读取缓冲数组char[]
中所有内容,存在上次读取后未清除的部分
第一次读取:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
h | e | l | l | o | w | o |
第二次读取:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
r | l | d | ! | w | a | n | g |
第三次读取:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
q | i | n | l | e | i | 王 | 勤 |
第四次读取:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
磊 | i | n | l | e | i | 王 | 勤 |
因此输出结果为:hello world!wangqinlei王勤磊inlei王勤
正确的读取方式
- 使用
read()
逐个字符读取
1 | public class Reader02 { |
- 使用
read(char[] buf)
批量读取
1 | public class Reader03 { |
FileWriter:字符输出流
构造方法
new FileWriter(File file/String fileName)
覆盖模式new FileWriter(File file/String fileName , true)
追加模式
方法摘要
返回值类型 | 方法名及形参列表 | 说明 |
---|---|---|
void |
close() |
关闭此流,但要先刷新它 |
void |
flush() |
刷新该流的缓冲。 |
String |
getEncoding() |
返回此流使用的字符编码的名称 |
void |
write(int c) |
写入单个字符 |
void |
write(char[] cbuf) |
写入整个字符数组 |
void |
write(char[] cbuf, int off, int len) |
写入字符数组的某一部分 |
void |
write(String str, int off, int len) |
写入字符串的某一部分 |
void |
write(String str) |
写入整个字符串 |
相关API:
toCharArray
可将String
转成char[]
FileWriter
使用后,必须要关闭(close)或刷新(close),否则写入不到指定文件
1 | public class Writer01 { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 亦晓白笔记!