概述
IO流的分类
IO流的体系
这四个类都是抽象类,所以需要实现类对象才能使用--->
字节流
FileInputStream-->
书写细节
代码示范
此时文件a.txt内容为abcde
使用char强转和read方法调用五次read方法-->
使用char强转和read方法调用六次read方法-->最后一个值为-1public static void main(String[] args) throws IOException {/*演示:字节输入流FileInputStream实现需求:读取文件中的数据(暂时不写中文)实现步骤:创建对象读取数据释放资源*///1.创建对象FileInputStream fis = new FileInputStream("myio\\a.txt");//2.读取数据int b1 = fis.read();System.out.println((char)b1);//aint b2 = fis.read();System.out.println((char)b2);//bint b3 = fis.read();System.out.println((char)b3);//cint b4 = fis.read();System.out.println((char)b4);//dint b5 = fis.read();System.out.println((char)b5);//e//3.释放资源fis.close();}
循环读取-->public static void main(String[] args) throws IOException {/*演示:字节输入流FileInputStream实现需求:读取文件中的数据(暂时不写中文)实现步骤:创建对象读取数据释放资源*///1.创建对象FileInputStream fis = new FileInputStream("myio\\a.txt");//2.读取数据int b1 = fis.read();System.out.println((char)b1);//aint b2 = fis.read();System.out.println((char)b2);//bint b3 = fis.read();System.out.println((char)b3);//cint b4 = fis.read();System.out.println((char)b4);//dint b5 = fis.read();System.out.println((char)b5);//eint b6 = fis.read();System.out.println((char)b6);////3.释放资源fis.close();}
public static void main(String[] args) throws IOException {/*字节输入流的循环读取*///1.创建对象FileInputStream fis = new FileInputStream("myio\\a.txt");//2.循环读取int b;while ((b = fis.read()) != -1){System.out.println((char)b);}/*结果:abcde*///3.释放资源fis.close();}
FileOutputStream-->
书写细节
代码示范
先创建一个空的txt文件:a.txt
一次写一个字节数据-->
public static void main(String[] args) throws IOException {/*演示:字节输出流FileOutputStream实现需求:写出一段文字到本地文件中(暂时不写中文)实现步骤:创建对象写出数据释放资源*///1.创建对象//写出 输出流 OutputStreamFileOutputStream fos = new FileOutputStream("myio\\a.txt");//2.写出数据fos.write(97);//3.释放资源fos.close();}
结果-->>文件中添加了a
一次写一个字节数组数据-->
public static void main(String[] args) throws IOException {//1.创建对象FileOutputStream fos = new FileOutputStream("myio\\a.txt");//2.写出数据byte[] bytes = {97, 98, 99, 100, 101};fos.write(bytes);//3.释放数据fos.close();}
结果-->>文件中添加了abcde
一次写一个字节数组的部分数据-->
public static void main(String[] args) throws IOException {//1.创建对象FileOutputStream fos = new FileOutputStream("myio\\a.txt");//2.写出数据byte[] bytes = {97, 98, 99, 100, 101};fos.write(bytes,1,2);//3.释放数据fos.close();}
结果-->>文件中添加了bc
换行-->
public static void main(String[] args) throws IOException {/*换行写:再次写出一个换行符Windows:\r\nLinux:\nMac:\r细节:在Windows操作系统中,java对回车换行进行了优化虽然完整是\r\n,但是我们写其中一个\r或者\njava也可以实现换行,因为java在底层会自动补全建议:不要省略*///1.创建对象FileOutputStream fos = new FileOutputStream("myio\\a.txt");//2.写出数据String str1 = "kankelaoyezhenshuai";byte[] bytes1 = str1.getBytes();fos.write(bytes1);//再次写出一个换行符String warp = "\r\n";byte[] bytes2 = warp.getBytes();fos.write(bytes2);String str2 = "666";byte[] bytes3 = str2.getBytes();fos.write(bytes3);//释放资源fos.close();}
结果-->>
续写-->
public static void main(String[] args) throws IOException {/*续写:如果需要续写,打开续写开关即可开关位置:创建对象的第二个参数默认false:表示关闭续写,此时创建对象会清空文件手动传递true:表示打开续写,此时创建对象不会清空文件*///1.创建对象FileOutputStream fos = new FileOutputStream("myio\\a.txt",true);//2.写出数据String str1 = "kankelaoyezhenshuai";byte[] bytes1 = str1.getBytes();fos.write(bytes1);//再次写出一个换行符String warp = "\r\n";byte[] bytes2 = warp.getBytes();fos.write(bytes2);String str2 = "666";byte[] bytes3 = str2.getBytes();fos.write(bytes3);//释放资源fos.close();}
结果-->>
小结
练习-->文件拷贝
public static void main(String[] args) throws IOException {//文件拷贝//核心思想:边读边写//创建对象FileInputStream fis = new FileInputStream("myio\\a.txt");FileOutputStream fos = new FileOutputStream("myio\\b.txt");//拷贝int b;while ((b = fis.read()) != -1){fos.write(b);}//规则:先开的最后关闭fos.close();fis.close();}
FileInputStream读取的问题
一次只读取一个字节导致效率慢
解决方案
字节数组返回值:获取了几个字符
读取abcde时,第三次会出现只读取e的情况,只获取了一个元素,而数组中存放了两个,只会覆盖一半,所以使用时应该加上起始索引和结束索引
代码示范
try...catch异常处理
未来在springboot框架中一般使用抛出异常,try...catch掌握即可
由于代码太过繁琐,Java做出了简化方案,提出了接口
接口:AutoCloseable
特点:特定情况下,可以自动释放资源
代码演示
基本做法-->
public static void main(String[] args) {//创建对象FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream("myio\\a.txt");fos = new FileOutputStream("myio\\a.txt");//拷贝int len;byte[] bytes = new byte[2];while ((len = fis.read(bytes)) != -1){fos.write(bytes,0,len);}} catch (IOException e){//e.printStackTrace();} finally {//释放资源if(fos != null){try {fos.close();} catch (IOException e){e.printStackTrace();}}if(fis != null){try {fis.close();} catch (IOException e){e.printStackTrace();}}}}
JDK7方案-->
public static void main(String[] args) {/*JDK7:IO流中捕获异常的写法try后面的小括号写创建对象的代码注意:只有实现AutoCloseable接口的类,才能在小括号中创建对象*/try(FileInputStream fis = new FileInputStream("myio\\a.txt");FileOutputStream fos = new FileOutputStream("myio\\a.txt")){//拷贝int len;byte[] bytes = new byte[2];while ((len = fis.read(bytes)) != -1){fos.write(bytes,0,len);}}catch (IOException e){e.printStackTrace();}}
JDK9方案-->
public static void main(String[] args) throws FileNotFoundException {/*JDK9:IO流中捕获异常的写法*/FileInputStream fis = new FileInputStream("myio\\a.txt");FileOutputStream fos = new FileOutputStream("myio\\a.txt");try(fis;fos){//拷贝int len;byte[] bytes = new byte[2];while ((len = fis.read(bytes)) != -1){fos.write(bytes,0,len);}}catch (IOException e){e.printStackTrace();}}