Java进阶之旅第十天
文章目录
IO流(输入输出流)(上)
IO流分类
- 按照流向
- 输出流: 程序 -> 文件
- 输入流: 文件 -> 程序
- 操作文件类型
- 字符流: 可以操作所有类型的文件
- 字节流: 只能操作纯文本文件
字节流
字节输出流
FileOutputStream
(创建字节输出对象)
- 操作本地文件的字节输出流,可以把程序中的数据写到本地文件中
- 代码
public static void main(String[] args) throws IOException {
/*
*需求: 将一段文字写到本地文件中
* 实现步骤:
* 创建对象
* 写出数据
* 释放资源(关闭文件
* */
//一下方法均会抛出编译时期异常
FileOutputStream file = new FileOutputStream("src\\text.txt");
file.write(97);
file.close();
}
- 结果(对应文件中)
a
- 细节:
- 1.如果路径文件不存在,则会创建一个新的文件,但要保证父级路径是存在的
- 2.如果文件已经存在,则会清空文件内容
- 3.最后关闭文件,是为了解除对文件资源的占用
FileOutputStream
写数据的3种方式
方法名称 | 说明 |
---|---|
void write(int b) | 一次写一个字节数据 |
void write(byte[] b) | 一次写一个字节数组数据 |
void write(byte[] b,int off,int len) | 一次写一个字节数组的部分数据 |
- 代码实现
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("src\\text.txt");
//一次写一个数据
fos.write(97);
fos.write("\r\n".getBytes());
//一次写一组数据
byte[] data = {97,98,99,100};
fos.write(data);
fos.write("\r\n".getBytes());
//一次写一组数据的部分
fos.write(data,1,3);
fos.write("\r\n".getBytes());
//关闭文件
fos.close();
}
- 结果
a
abcd
bcd
- 小笔记
- 想要输入一长串字符时,可以调用字符串的
getBytes()
方法获取byte[]
字节数组后再写入 - 换行:
\r\n
也可以单独写\r
或\n
- 续写(追加模式):
FileOutputStream()
的第二个参数就时续写开关,设置为true
即可续写,不清空文件
- 想要输入一长串字符时,可以调用字符串的
字节输入流
FileInputStream
(创建字节输入流对象)
- 将文件内容输入到程序当中
- 代码展示
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("src\\text.txt");
//读取一个数据
int read = fis.read();
System.out.println(read);
fis.close();
}
- 结果
97
- 细节:
- 1.如果文件不存在(异常: FileNotFoundException),则会直接报错
- 2.读取文件内容到末尾后,方法返回-1
FileInputStream
读数据的3种方式
方法名称 | 说明 |
---|---|
int read() | 一次读一个字节数据,数据保存在返回值中 |
int read(byte[] b) | 一次读一个字节数组数据,数据保存在byte[]数组中,返回值为读取元素个数 |
int read(byte[] b,int off,int len) | 一次读一个字节数组的部分数据,数据保存在byte[]数组中,返回值为读取元素个数,off指将读取元素存储在字符数组的那个位置 |
- 细节
read(byte[] b)
方法中的byte[]
数组应当创建数组的大小,例如:byte[] data = new byte[10];
FileInputStream
循环读取
- 利用
read()
方法读取到末尾返回-1
的特性遍历文件内容 - 代码展示
FileInputStream fis = new FileInputStream("src\\text.txt");
int data;
while((data= fis.read())!=-1){
System.out.println((char)data);
}
fis.close();
- 结果
a
b
c
d
文件拷贝
-
方法
- 1.每读一个就写入一个
- 缺点: 速度太慢,不推荐
- 2.每读取一堆数据,再写入
- 推荐使用,创建的数组大小看情况使用,推荐5M(102410245)
- 1.每读一个就写入一个
-
代码
public static void main(String[] args) throws IOException {
//原数据
FileInputStream fis = new FileInputStream("src\\text.txt");
//拷贝数据
FileOutputStream fos = new FileOutputStream("src\\copy.txt");
//开始拷贝
//设置容量
int cap = 1024*1024*5;
//创建数组
byte[] data = new byte[cap];
//拷贝逻辑
int num;
while((num = fis.read(data))!=-1){
//写入num个读取的数据
fos.write(data,0,num);
}
//关闭资源(先开的后关
fos.close();
fis.close();
}