目录
3、FileOutputStream 和 Filelnputstream 的综合示例
3.1、文件拷贝:把aaa.txt里的内容拷贝到bbb.txt中
3.2、文件拷贝plus:把aaa.txt里的内容拷贝到bbb.txt中,并且实现捕获异常,含自动关闭通道的书写方法
3.2.1、用finally代码块确保一定关闭通道的方法示例:
1、IO流概述及其体系
一个程序总是离不开数据的输入(Input)输出(IO),而Java IO流就是用于程序从外部读取数据,以及向外部写出数据的java处理包。以流的方式进行输入输出的操作就是IO(Input Output)流。流是一个抽象的概念,它是一串连续动态的数据集合,可以将流理解为水管,而数据就是水,水通过水管从一端流到另一端。
1.1、 IO流的分类
1.安流的方向分类可以分为输入流和输出流
输入流:侧重于读,数据从数据源读入程序。
输出流:侧重于写,数据从程序写出到目的地。2. 按处理的数据单元分类可以分为字节流和字符流
字节流:以 字节(1Byte=8bit) 为单位进行读取或者写出数据。
字符流:以 字符为单位进行读取或者写出数据。
字节流能操作所有类型的文件,而字符流只能操作纯文本文件
纯文本文件:Windows自带的记事本打开能读懂的就是纯文本文件,比如:txt文件,md文件,xml文件,lrc文件等
1.2、IO流体系
2、字节流
因为 InputStream 类和 OutputStream 类都是抽象类,不能直接创建它们的对象,得看它们的子类:FileOutputStream(文件字节输出流)和 Filelnputstream(文件字节输入流)
2.1、FileOutputStream(文件字节输出流)
FileOutputStream是操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。
字节输出流的注意点:
1、创建字节输出流对象
注意点1:参数是字符串表示的路径或者是File对象都是可以的
注意点2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
注意点3:如果文件已经存在,则文件里原有的内容会被本次要写入的内容覆盖
2、写数据
注意点:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
3、释放资源
每次使用完流之后都要释放资源,否则java会一直占用着这个资源
FileOutputStream的三种输出方式
void write(int b) | 一次写一个字节数据 |
void write(byte[ ] b) | 一次写一个字节数组数据 |
void write(byte[ ] b, int off, int len) | 一次写一个字节数组的部分数据 |
(byte[ ] b, int off, int len) 参数一:保存要被写入数据的数组;参数二:起始索引;参数三:个数
IO流-FileOutputStream-换行和续写
换行写:再次写出一个换行符就可以了,windows系统里 \r\n是完整的换行, \r 是回车,\n 是换行;Linux系统里 \n 是换行;Mac:系统里 \r 是换行
细节:在windows操作系统当中,java对回车换行进行了优化。虽然完整的是\r\n,但是我们写其中一个\r或者\n,java也可以实现换行,因为java在底层会补全。
建议:不要省略,还是写全了
续写:如果想要续写,打开续写开关即可,开关位置在创建对象的第二个参数,默认false表示关闭续写,此时创建对象会清空文件,手动传递true表示打开续写,此时创建对象不会清空文件
FileOutputStream示例代码:
public static void main(String[] args) throws IOException {
/*
换行写:
再次写出一个换行符就可以了
windows: \r\n \r是回车,\n是换行
Linux: \n
Mac: \r
提示:在windows操作系统当中,java对回车换行进行了优化。
虽然完整的是\r\n,但是我们写其中一个\r或者\n,java也可以实现换行,
因为java在底层会补全。
建议:不要省略,还是写全了,
续写:
如果想要续写,打开续写开关即可
开关位置:创建对象的第二个参数
默认false:表示关闭续写,此时创建对象会清空文件
手动传递true:表示打开续写,此时创建对象不会清空文件
*/
//1.创建对象,并且开启续写
FileOutputStream fos = new FileOutputStream("..\\javaEEStudy\\aaa.txt",true);
//2.写出数据
String str = "liaotaodashuaige";
byte[] bytes1 = str.getBytes();//把字符串str转换成字节数组bytes1
fos.write(bytes1);//一次写一个字节数组数据,数组为bytes1
String wrap = "\r\n";//要换行就写出一个换行符就可以了
byte[] bytes2 = wrap.getBytes();
fos.write(bytes2);
String str2 = "666";
byte[] bytes3 = str2.getBytes();
fos.write(bytes3);
//3.释放资源
fos.close();
}
运行两次代码后的结果:这时发现第一次写入的内容没有被覆盖
FileOutputStream总结:
1、FileOutputStream的作用就是可以把程序中的数据写到本地文件上,是字节流的基本流
2、书写步骤:创建对象,写出数据,释放资源
3、三步操作的注意点
创建对象:文件存在、文件不存在、追加写入
写出数据:写出整数、写出字节数组、换行写
释放资源:要关闭通道
2.2、Filelnputstream(文件字节输入流)
Filelnputstream读取字节的方法
public int read() | 一次读一个字节数据 |
public int read(bytel buffer) | 一次读一个字节数组数据 |
注意:
1、一次读一个字节数组的数据,每次读取会尽可能把数组装满,所以一般会创建长度为1024整数倍大小的字节数组
2、FileInputStream的read( )方法一次读写一个字节,速度慢
Filelnputstream书写步骤:
1、创建字节输入流对象:如果文件不存在,就直接报错
2、读取数据:一次读一个字节,读出来的是数据在ASCII上对应的数字;读到文件末尾了,read方法返回-1
3、释放资源:每次使用完流必须要释放资源
Filelnputstream一次读多个字节的方法示例:
//创建对象
FileInputStream fis = new FileInputStream("..\\javaEEStudy\\aaa.txt");//文件中的内容为:abcde
//读取数据
byte[] bytes = new byte[3];
//一次读取多个字节数据,具体读多少,跟数组的长度有关
//返回值:本次读取到了多少个字节数据
int len1 = fis.read(bytes);
String s1 = new String(bytes);//把字节数组转换成字符串
System.out.println("第一次读取到"+ len1 +"个数据,为:"+ s1);//第一次读取到3个数据,为:abc
int len2 = fis.read(bytes);
String s2 = new String(bytes);//把字节数组转换成字符串
System.out.println("第二次读取到"+ len2 +"个数据,为:"+ s2);//第二次读取到2个数据,为:dec
运行结果
因为 fis 在第二次读取内容时,只能从aaa.txt中读取出 d e 这两个数据,所以就把 d e 这两个数据读取出来,并分别放到字节数组 bytes 数组中的 0 和 1 索引处,而 2 索引处还是原来第一次读取数据时所放入的 c ,所以第二次的输出结果为 dec
改进后的代码和结果:
String s1 = new String(bytes); 改成 String s1 = new String(bytes, 0, len1);
String s2 = new String(bytes); 改成 String s2 = new String(bytes, 0, len2);
3、FileOutputStream 和 Filelnputstream 的综合示例
3.1、文件拷贝:把aaa.txt里的内容拷贝到bbb.txt中
一个字节一个字节拷贝的方法示例:
//1.创建对象
FileInputStream fis = new FileInputStream("..\\javaEEStudy\\aaa.txt");
FileOutputStream fos = new FileOutputStream("..\\javaEEStudy\\bbb.txt");
//2.拷贝
//核心思想:边读边写
int b;
while ((b = fis.read()) != -1) {
fos.write(b);
}
//3.释放资源
//规则:先开的最后关闭
fos.close();
fis.close();
3.2、文件拷贝plus:把aaa.txt里的内容拷贝到bbb.txt中,并且实现捕获异常,含自动关闭通道的书写方法
在捕获异常时,不管前面的try有没有捕获到异常,被finally控制的语句一定会执行,除非IVM退出,所以要把资源释放的代码写在finally控制的语句中,确保资源一定会被释放
3.2.1、用finally代码块确保一定关闭通道的方法示例:
public static void main(String[] args) throws IOException {
//1.创建对象
FileInputStream fis = null;
fos = null;
try {
fis = new FileInputStream("..\\javaEEStudy\\aaa.txt");
fos = new FileOutputStream("..\\javaEEStudy\\bbb.txt");
//2.拷贝
int len;
byte[] bytes = new byte[3];
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//3.释放资源
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.2.2、自动关闭通道的书写方法
JDK7:IO流中捕获异常的写法
try后面的小括号中写创建对象的代码,
注意:只有实现了Autocloseable接口的类,才能在小括号中创建对象。
写法:
try(创建流对象1;创建流对象2){
可能出现异常的代码;
} catch(异常类名 变量名){
异常的处理代码;
} 资源用完最终自动释放
自动关闭通道的方法示例:
public static void main(String[] args) throws IOException {
try (FileInputStream fis = new FileInputStream("..\\javaEEStudy\\aaa.txt");
FileOutputStream fos = new FileOutputStream("..\\javaEEStudy\\bbb.txt")) {
//拷贝
int len;
byte[] bytes = new byte[3];
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
JDK9:IO流中捕获异常的写法
try后面的小括号中写创建对象的代码,
注意:只有实现了Autocloseable接口的类,才能在小括号中创建对象。
写法:
创建流对象1;
创建流对象2;
try(流1;流2){
可能出现异常的代码;
} catch(异常类名 变量名){
异常的处理代码;
} 资源用完最终自动释放
示例代码:
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("..\\javaEEStudy\\aaa.txt");
FileOutputStream fos = new FileOutputStream("..\\javaEEStudy\\bbb.txt");
try (fis; fos) {
//拷贝
int len;
byte[] bytes = new byte[3];
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
关于字符流内容会写在下一章 !!!
推荐:
【java基础】异常处理机制-CSDN博客https://blog.csdn.net/m0_65277261/article/details/136581375?spm=1001.2014.3001.5501【计算机网络】DHCP原理与配置-CSDN博客https://blog.csdn.net/m0_65277261/article/details/136230649?spm=1001.2014.3001.5501【数据结构】二叉查找树和平衡二叉树,以及二者的区别_二叉查找树和其他二叉树的区别-CSDN博客https://blog.csdn.net/m0_65277261/article/details/136137098?spm=1001.2014.3001.5501