IO流
IO :输入输出流(input/output)
流: 是文件数据在计算机中传输的一种形式
常见的操作:文件的上传 下载 文件的复制
IO流中的输入输出 是相对于程序而言:
将外部存储设备中的文件读入到程序中,则为输入;
将程序中的数据 输入出到外部存储设备 称为输出。
IO流的分类:
按照数据的流向: 输入流(读) 输出流(写)
按照数据的单位: 字节流(bit) 字符流(char)
IO流的基本:
字节输入流 字节输出流 字符输入流 字符输出流
字节流和字符流的使用场景:
字符流:纯文本文件(.txt)
字节流:图片 视频 音频 图文混合
字节流读写
abstract class InputStream 是所有字节输入流的基类
abstract class OutputStream 是所有字节输出流的基类
所有的字节输入输出流的子类都是以父类的名称作为子类名称的后缀
字节输出流
FileOutputStream 文件输出流是用于将数据写入到输出流File
如何将数据写出到文件
1 创建字节输出流对象
2 调用输出流的相关方法 将数据写出到指定的文件.
3 关闭流(释放资源)
public class FileOutputStreanDemo {
public static void main(String[] args) throws IOException {
//创建字节流输出对象
//方式一:
//FileOutputStream fos1 = new FileOutputStream("d:\\IO\\os\\fos.txt");
// 方式二:
File file = new File("d:\\IO\\os\\fos.txt");
/*创建字节输出流对象时的过程:
1 当要写出的目标文件如果不存在 会调用系统相关的功能来创建一个新的文件
2 创建FileOutputStream对象
3 让输出流对象 指向目标文件
*/
FileOutputStream fos = new FileOutputStream(file);
// 使用文件 字节输出流 向指定的文件中写出数据 void write(int b)
fos.write(100);//d
// 释放资源
fos.close();
}
使用字节输出流完成字节数组的输出
public static void main(String[] args) throws IOException {
// 此处使用相对路径进行表示 相对路径时相对当前工程
// 绝对路径 一般都是从盘符开始写
FileOutputStream fos = new FileOutputStream("day_10_IODemom\\output\\fos.txt");
// 使用字节数组
byte[] bytes = new byte[]{97,99,98,100,102,105,110};
// 如果要写出一个字符串 Hello World
String str = "Hello World";
byte[] bytes1 = str.getBytes();// 获取字符串相对应的字节数组
//fos.write(bytes1);
//写字节数组的一部分
fos.write(bytes1,0,5);
fos.close();
}
字节输出流的两个问题:
- 如何使用字节输出流实现追加写?
将append的值置为true即可实现追加写
public static void main(String[] args) throws IOException {
// 此处使用相对路径进行表示 相对路径时相对当前工程
// 绝对路径 一般都是从盘符开始写
FileOutputStream fos = new FileOutputStream("day_10_IODemom\\output\\fos.txt",true);
// 使用字节数组
byte[] bytes = new byte[]{97,99,98,100,102,105,110};
fos.write(bytes);
// 如果要写出一个字符串 Hello World
String str = "Hello World";
byte[] bytes1 = str.getBytes();// 获取字符串相对应的字节数组
fos.write(bytes1);
//写字节数组的一部分
//fos.write(bytes1,0,5);
fos.close();
}
-
实现换行写的功能:
换行功能:windows \r\n Linux \n Mac: \r
public static void main(String[] args) throws IOException {
// 此处使用相对路径进行表示 相对路径时相对当前工程
// 绝对路径 一般都是从盘符开始写
FileOutputStream fos = new FileOutputStream("day_10_IODemom\\output\\fos.txt",true);
// 使用字节数组
byte[] bytes = new byte[]{97,99,98,100,102,105,110};
fos.write(bytes);
fos.write("\r\n".getBytes());
// 如果要写出一个字符串 Hello World
String str = "Hello World";
byte[] bytes1 = str.getBytes();// 获取字符串相对应的字节数组
fos.write(bytes1);
fos.write("\r\n".getBytes());// 写出换行符
//写字节数组的一部分
//fos.write(bytes1,0,5);
fos.close();
}
}
IO中异常的处理方式
抓抛以后在finally块中关闭流也可能出现异常,需要再try catch一下
public static void main(String[] args) {
FileOutputStream fos= null;
try {
// 创建字节流输出对象
fos = new FileOutputStream("day_10_IODemom\\output\\fos_02.txt");
//写出数据
fos.write("中北大学".getBytes());
fos.write("\r\n".getBytes());
fos.write("中国山西".getBytes(StandardCharsets.UTF_8));//使用UTF-8字符集获取字节数组
}catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fos != null){// 当且仅当fos不为null 才需要关闭
try {
fos.close();//此处也有可能存在异常 同样需要处理
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字节输入流
FileInputStream 从文件系统中的文件获取输入字节
读的方法
public static void main(String[] args) throws IOException {
// 创建一个字节输入流
FileInputStream fis = new FileInputStream("day_10_IODemom\\output\\fos.txt");
/* int r;
r = fis.read();
r == -1 ; // 表示得到了文件末尾
*/
int r;
// 如果每次读取返回的不是-1 证明文件还没有读完
while( (r = fis.read()) != -1){
System.out.print((char)r);
}
// 释放资源
fis.close();
}
注意:
使用字节输出流写数据时,如果文件不存在 ,系统会自动为我们创建一个新文件
使用字节输入流读数据时,如果文件不存在 则会报FileNotFoundException
读取过程
- 创建文件表示要读取的 文件的路径
- 创建FileInputStream 对象
- 让FileInputStream对象指向文件,如果文件存在则可以使用相应的方法去读取 ,如果不存在则会爆出FileNotFoundException