IO流
1、概述
IO流用来处理设备之间的数据传输,java对数据的操作是通过流的方式来操作的。Java用于操作流的对象都在IO包中。数据的最常见体现形式是:文件
2、流的分类
1、按操作数据分为两种:字节流和字符流
2、按流向分为:输入流和输出流。
3、IO流常用基类
(1)字节流的抽象基类:InputStream,OutputStream
(2)字符流的抽象基类:Reader,Writer
注意:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀
如:InputStream的子类FileInputStream
Reader的子类FileReader
4、字符流
FileWriter类:
用来写入字符文件的便捷类
步骤:
1、创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将会被覆盖。
其实第一步就是在明确数据要存放的目的地。
FileWriter fw=new FileWriter(“文件目录”);
2、调用write方法将字符串写入到流中
fw.write(“aaaa”);
3、刷新流对象中的缓冲中的数据,将数据刷到目的地文件中
fw.flush();
4、关闭流资源,但是关闭之前会刷新一次内部缓冲中的数据,将数据刷到目的地中,和flush的区别,flush刷新后,流可以继续使用,close刷新后,会将流关闭
fw.close();
5、IO异常的处理方式
public class IOdemo {
public static void main(String[] args) {
//创建FileWriter引用对象
FileWriter fw=null;
try{
//初始化FileWrite对象,其实就是要指定要操作文件的目录
fw=new FileWriter("iodemo.txt");
//调用write方法将字符串写入流中
fw.write("hahaha");
//刷新流对象的缓冲中的数据,到目的文件中
fw.flush();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
6、IO流文件的续写
在创建FileWriter对象时,传递一个true参数,代表不覆盖已有的文件,并在已有文件的末尾处进行数据续写。
FileWriter fw=new FileWriter(“操作文件路径”,true);
程序演示:
public class IOdemo {
public static void main(String[] args) { FileWriter fw=null;
try {
//初始化FileWriter对象,并传递一个true参数,代表不覆盖已有文件,并在已有文件末尾续写
fw=new FileWriter("IoDemo.txt",true);
//“\r\n”代表换行,即将会在下一行写入新的内容
fw.write("\r\nthank you!");
fw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fw!=null)
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
输出结果:
hello world!
thank you!
7、文本文件读取方式Reader
FileReader:用来读取字符文件的便捷类,此类的构造方法假定默认字符编码和默认字节缓冲区大小都适当的。要自己指定这些值,可以先在FileInputStream上构造一个InputStreamReader。
FileReader用于读取字符流。要读取原始字节流,考虑使用FileInputStream。
方式一:
1、创建一个文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,否则会发生FileNotFoundException异常。
2、调用读取流的read方法。
read():一次读一个字符,而且会自动往下读。将读取的字符作为整数返回,如果已到达流的末尾,则返回-1.所以可以将返回值作为读取的结束条件。
3、关闭读取流资源
程序演示:
class FileReaderDemo{
public static void main(String args[]){
//创建FileReader的引用对象
FileReader fr=null;
try {//初始化对象,并指定相关联文件
fr=new FileReader("iodemo.txt");
//调用read方法
int ch=0;
while((ch=fr.read())!=-1){//判断是否读到了文件的末尾
//read方法将读取的字符作为整数返回,所以要将返回值强转成字符型
System.out.println((char)ch);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fr!=null)
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
方式二:通过字符数组进行读取
read(char[] cbuf);
将字符读入数组,如果已到达流的末尾,则返回-1.其中cbuf是目标缓冲区。
定义一个字符数组,用于存储读到的字符,该read(char[])返回的是读到的字符个数。
程序:
private static void method_2(FileReader fr){
try {
fr=new FileReader("iodemo.txt");
//定义数组用于临时存储读取的字符,数组长度一般定义成1024的整数倍
char[] buf=new char[1024];
int num=0;//num用于存放read方法的返回值,即读取的字符个数
while((num=fr.read(buf))!=-1){
//将数组buf中的元素以字符串形式显示,并且只取0-num之间的元素
System.out.println(new String(buf,0,num));
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fr!=null)
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
文件读取练习:
1、读取一个.java文件,并打印在控制台上
程序:
class IOdemo{
public static void main(String args[]){
//创建FileReader的引用对象
FileReader fr=null;
try {
fr=new FileReader("D:\\Program Files\\workspace\\jihe\\src\\day17\\DateDemo.java");
char[] buf=new char[1024];
int num=0;
while((num=fr.read(buf))!=-1){
System.out.print(new String(buf,0,num));
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fr!=null)
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、将c盘的一个文本文件复制到D盘
复制的原理:其实就是将c盘下的文件数据存储到d盘的一个文件中。
步骤:
1、在d盘创建一个文件,用于存储c盘文件中的数据
2、定义读取流和c盘文件关联
3、通过不断的读写完成数据存储。
4、关闭资源
程序:
class IOdemo{
public static void main(String args[]){
FileWriter fw=null;
FileReader fr=null;
try {
fw=new FileWriter("D:\\filewrite.txt");
fr=new FileReader("c:\\test.java");
char[] buf=new char[1024];//定义内存缓冲区
int num=0;
while((num=fr.read(buf))!=-1){
fw.write(buf,0,num);
fw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fr!=null)
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
if(fw!=null)
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}