一、基本概念
-
数据流
输入输出时,数据在通信通道中流动。所谓数据流就是所有数据通信通道之中数据的起点和终点。 -
输入/输出类
在java.io中提供了60多个类(流),从功能上分为2大类:输入流/输出流;从流结构上分为:字节流/字符流;
二、类层次结构
三、文件的顺序访问
- 使用引入语句引入 java.io 包 import java.io.*;
- 根据不同数据源和输入输出任务 建立字节流或字符流对象
- 若需要对字节或字符流信息组织加工为数据 在已建字节流或字符流对象上构建数据流对象
- 用输入输出流对象类的成员方法进行读写操作 需要时设置读写位置指针
-
关闭流对象
其中步骤 2--5 要考虑异常处理
四、类对象&成员方法
4.1 FileInputStream 和FileOutputStream类
一. FileInputStream 类构造方法有
FileInputStream(String name) //用文件名name建立流对象
FileInputStream(File file) //用文件对象file建立流对象
二. 读取文件信息
int read() //读流中一个字节 若流结束则返回-1
int read(byte b[]) //从流中读字节填满字节数组b 返回所读字节数 若流结束则返回-1
int read(byte b[],int off, int len) //从流中读字节填入b[off]开始处 返回所读字节数 若流结束则返回-1
三.FileOutputStream类的构造方法有
FileOutputStream(String name,boolean append) //用文件名name创建流对象
FileOutputStream(File file,boolean append) //用文件对象 file 建立流对象
PS:这2中构造函数的第二个参数都是可选的。若这个参数的值为 true 则向文件尾输出字节流
四.向输出流写信息
void write(int b) //将整型数据的低字节写入输出流
void write(byte b[])//将字节数组b中的数据写入输出流
void write(byte b[],int off,int len)//将字节数组 b 中从 off 开始的 len 个字节数据写入输出流
五.关闭FileInputStream/FileOutputStream
fin.close();
fos.close();
4.2 BufferedInputStream 和 BufferedOutputStream 类
缓冲流类一般与另外的输入输出流类一起配合使用
一.BufferedInputStream 类的构造方法如下
BufferedInputStream(InputStream in) //并创建一个内部缓冲区数组来保存输入数据
BufferedInputStream(InputStream in , int size)//用 指 定 的 缓 冲 区 大 小 size 创 建 BufferedInputStream流对象
二.BufferedOutputStream 类的构造方法如下
BufferedOutputStream(OutputStream out) //创建缓冲输出流 写数据到参数指定的输出流 缓冲区设为默认的 512 字节大小
BufferedOutputStream(OutputStream out, int size)//创建缓冲输出流 写数据到参数指定 的输出流 缓冲区设为指定的size字节大小
三. 用flush()方法更新流
要想在程序结束之前将缓冲区里的数据写入磁盘 除了填满缓冲区或关闭输出流外 还可以显式调用flush()方法
4.3 InputSteamReader 和 OutputStreamWriter 类
这是 java.io 包中用于处理字符流的基本类 用来在字节流和字符流之间搭一座 桥
一.InputSteamReader 和 OutputStreamWriter 类的构造方法如下
public InputSteamReader(InputSteam in)
public InputSteamReader(InputSteam in,String enc)
public OutputStreamWriter(OutputStream out)
public OutputStreamWriter(OutputStream out,String enc)
//enc为指定的编码规范 若无此参数 表示使用当前平台的默认规范 可用getEncoding()方法得到当前字符流所用的编码方式
二.对象成员方法
读写字符的方法 read() write() 关闭流的方法 close()等 与 Reader 和 Writer 类的同名方法用法都是类似的
4.4 FileReader 和 FileWriter 类
FileReader 和 FileWriter 类是 InputSteamReader 和 OutputStreamWriter 类的子类 利用它 们可方便地进行字符输入/输出操作
一.FileReader 类的构造方法有
FileReader(File file) //对指定要读的file创建FileReader对象
FileReader(String fileName) //对指定要读的fileName创建FileReader对象
二.FileWriter 类的构造方法有
FileWriter(File file) 对指定的file创建FileWriter对象
FileWriter(String fileName) 对指定的fileName创建FileWriter对象
// 两个构造方法都可带第二个布尔值的参数append 当append 为true时 为添加到输出流
三.FileReader 类的成员方法
read() //返回输入字符
read(char[] buffer) //输入字符到字符数 组中等
四.FileWriter类的成员方法
write(String str) //输出字符串
write(char[]buffer) //输出字符串
write(int char)
flush() //输出缓冲字符
close() //在执行flush后关闭输出流
getEncoding() //获得 文件流字符的编码
4.5 BufferedReader 和 BufferedWriter 类
一.构造方法
public BufferedReader(Reader in)
public BufferedReader(Reader in,int sz)
public BufferedWriter(Writer out)
public BufferedWriter(Writer out,int sz)
//其中in和out分别为字符流对象 sz为缓冲区大小 从上述构造方法的声明可以看出 缓冲流的构造方法是基于字符流创建相应的缓冲流
二.成员方法
在 BufferedReader 和 BufferedWriter 类中 除了 Reader 和 Writer 中提供的基本读写方法 外 增加了对整行字符的处理方法readLine()和newLine()
readLine() //从输入流中读取一行字符 行结束标志为回车符和换行符
newLine() //向字符输出流中写入一个行结束标记 该标记是由系统 定义的属性 line.separator
五、文件的随机访问
1.建立随机访问文件流对象
RandomAccessFile(File file, String mode)
RandomAccessFile(String name, String mode)
//mode为访问文件的方式 有 r 或 rw 两种形式 若 mode 为 r 则文件只能读出 对这个对象的任何写操作将抛出 IOException 异常 若 mode 为 rw 并且文件不存在 则该文件将被创建 若 name 为目录 名 也将抛出IOException异常
2.访问随机访问文件
read()
write()
3.移动文件指针
public long getFilePointer() throws IOException //返回文件指针的当前字节位置
public void seek(long pos) throws IOException //将文件指针定位到一个绝对地址pos,pos参数指明相对于文件头的偏移量 地址0表示文件的开头
public long length() throws IOException //返回文件的长度 地址 length() 表示文件 的结尾
public int skipBytes(int n) throws IOException //将文件指针向文件尾方向移动n个字节
六、目录和文件管理
6.1 目录管理
public boolean mkdir() //根据抽象路径名创建目录
public String[] list() //返回抽象路径名表示路径中的文件名和目录名
6.2 文件管理
- 创建一个新的文件对象
File(String pathname) //通过给定的路径名变换的抽象路径创建文件对象
File(File parent, String child) //从父抽象路径 目录 和子路径字符串创建文件对象
File(String parent, String child) //从父路径和子路径字符串创建文件对象
- 获得文件名
public String getName() //得到一个文件名
public String getParent() //得到一个抽象路径的父路径名
public String getPath() //得到一个文件的路径名
public String getAbsolutePath() //得到一个抽象路径的绝对路径名
- 文件重命名
public boolean renameTo(File dest) //将抽象路径文件名重命名为给定的新文件名
- 文件删除
public boolean delete() //删除抽象路径表示的文件或目录
- 文件测试
public boolean exists() //检查抽象路径表示的文件是否存在
public boolean canWrite() //检查抽象路径表示的文件是否可写
public boolean canRead() //检查抽象路径表示的文件是否可读
public boolean isFile() //检查抽象路径表示的文件是否为正常文件 非目录
public boolean isDirectory() //检查抽象路径表示的是否为目录
public boolean isAbsolute() //检查抽象路径表示的是否为绝对路径
- 获得一般文件信息
public long lastModified() //得到抽象路径表示的文件最近一次修改的时间
public long length() //得到抽象路径表示的文件的长度
七、Q&A
1.字节流操作图片文件不会损坏,而字符流会损坏?
答:字节流是读取的是字节,也就是机器存储时的源码,任何软件在计算机中存储的形式都是二进制。用字符流复制的时候,他会按照你系统的字符码表进行查找和替换,把二进制数据全部按照码表替换了,有一些代码能在编码表中找到编码,就转换成编码,但是还有好多找不到的代码,JVM就会用一些类似的编码代替,文件就会改变了,所以打不开。
项目地址:https://gitee.com/neimenggudaxue/java_study/tree/master/
作者:迷糊银儿
链接:https://www.jianshu.com/p/706cfe679d02
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。