IO流是用来处理设备之间的数据传输;
Java对数据的操作时通过流的方式;
Java用于操作流的对象都在IO包中
流按操作数据分为两种:字节流与字符流
流按流向分为:输入流、输出流;
IO流常用基类
字节流的抽象基类:
InputStream、OutputStream
字符流的抽象基类:
Reader、Writer
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀
如:InputStream的子类FileInputStream
Reader的子类FileReader
先学习一下字符流的特点
既然IO流是用于操作数据的,
那么数据的最常见体现形式是:文件
那么先以操作文件为主来演示
package com.javaxl.io.characterStream;
import java.io.FileWriter;
import java.io.IOException;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2019-06-06 21:51
*
* 需求:在硬盘上,创建一个文件并写入一些文件数据。
* 在已存在的文件上续写字符串?
*
* 找到一个专门用于操作文件的writer子类对象,FileWriter。
* 后缀名是父类名,前缀名是该流对象的功能;
*/
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
// 创建一个FileWriter对象,对该对象一被初始化就必须明确被操作的对象
// 而且该文件会被创建到指定目录下,如果该目录下已有同名文件,则被覆盖;
// 其实该步就是在明确数据要存放的目的地
// FileWriter fw = new FileWriter("FileWriterDemo.txt");
// 传递一个true参数,代表不覆盖已有的文件,并在已有文件的末尾处进行数据续写
FileWriter fw = new FileWriter("FileWriterDemo.txt",true);
// 调用write方法,将字符串写入到流中
fw.write("eeeee");
// 刷新流对象中的缓冲中的数据
// 将数据刷到目的地中
// fw.flush();
// 关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据;
// 将数据刷到目的地中;
// 和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭;
fw.close();
}
}
异常的处理方式
package com.javaxl.io.characterStream; import java.io.FileWriter; import java.io.IOException; /** * @author 小李飞刀 * @site www.javaxl.com * @company * @create 2019-06-06 21:51 * * 需求:在硬盘上,创建一个文件并写入一些文件数据。 * * 找到一个专门用于操作文件的writer子类对象,FileWriter。 * 后缀名是父类名,前缀名是该流对象的功能; */ public class FileWriterDemo2 { public static void main(String[] args) { FileWriter fw = null; try { fw = new FileWriter("FileWriterDemo.txt"); fw.write("abcde"); } catch (IOException e) { System.out.println("catch:"+e); }finally { if(fw !=null) { try { fw.close(); } catch (IOException e) { System.out.println(e); } } } } }
读取指定文件的字符串
读取方式一:
package com.javaxl.io.characterStream; import java.io.FileReader; import java.io.IOException; /** * @author 小李飞刀 * @site www.javaxl.com * @company * @create 2019-06-06 22:24 */ public class FileReaderDemo { public static void main(String[] args) throws IOException { // 创建一个文件读取流对象,和指定名称的文件相关联; // 要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException; FileReader fr = new FileReader("FileWriterDemo.txt"); // 调用读取流对象的read方法; // read():一次读一个字节,而且会自动往下读; int read = 0; while((read = fr.read())!=-1){ System.out.println((char)read); } fr.close(); } }
图解代码
上面读取效率太低,一次只能读取一个字符
读取方式二:
package com.javaxl.io.characterStream; import java.io.FileReader; import java.io.IOException; /** * @author 小李飞刀 * @site www.javaxl.com * @company * @create 2019-06-06 22:24 */ public class FileReaderDemo2 { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("FileWriterDemo.txt"); // 定义一个字符数组,用于存储读到字符 // 该read(char[])返回的是读到字符个数 char[] cbuf = new char[1024]; int len = 0; while((len = fr.read(cbuf))!=-1){ System.out.println(new String(cbuf, 0, len)); } fr.close(); } }
图解代码
小练习
将C盘一个文本文件复制到D盘
复制的原理:
其实就是将C盘下的文件数据存储到D盘的一个文件夹中;
步骤:
1、在D盘创建一个文件,用于存储C盘文件中的数据;
2、定义读取流和C盘文件关联;
3、通过不断的读写完成数据传输;
4、关闭资源
package com.javaxl.io.characterStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2019-06-08 7:09
*/
public class Demo1 {
public static void main(String[] args) throws IOException {
// copy_1();
copy_2();
}
/**
* 读一个字符写一个字符的方式
*
* @throws IOException
*/
private static void copy_1() throws IOException {
//创建目的地
FileReader fileReader = new FileReader("C:\\Demo2.java");
//与已有文件关联
FileWriter fileWriter = new FileWriter("D:\\Demo2.java");
int ch = 0;
while ((ch = fileReader.read()) != -1) {
fileWriter.write(ch);
fileWriter.flush();
}
fileReader.close();
fileWriter.close();
}
private static void copy_2() throws IOException {
//创建目的地
FileReader fileReader = new FileReader("C:\\Demo2.java");
//与已有文件关联
FileWriter fileWriter = new FileWriter("D:\\Demo2.java");
char[] cbuf = new char[1024];
int len = 0;
while ((len = fileReader.read(cbuf)) != -1) {
fileWriter.write(new String(cbuf, 0, len));
fileWriter.flush();
}
fileReader.close();
fileWriter.close();
}
}
图解文件复制过程
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有