概述:
IO是重要的设备间数据传输工具,包括网络传输也是靠IO流完成的。
IO流具有以下特点:
1.处理设备间的数据传输
2.JAVA对数据的操作通过流的方式进行
3.java操作流的工具都在java.io包中。
4.按流向分为输入流和输出流
5.按数据分为字符流和字节流
IO流的四大基类:
字节 | 字符 | |
输入 | InputStream | Reader |
输出 | OutputStream | Writer |
注意:Reader和Writer的ctor权限为protected,只有其子类才能使用。
通用读写方法:
close()关闭资源
输入:
1.int read(),读取单个数据的字节/字符。
2.int read(byte[]/char[]),将读取的一部分数据存放到字节/字符数组中,并返回一次读取的数目。
输出
1.write(int)
2.write(buf)
3.write(buf,0,len)
写入一个或者多个数据。
4.flush()刷新缓冲区
因为IO涉及了底层系统资源,所以在使用时可能会产生IO异常。IOException
一、字符流
(一)特点:
1、字符流将字节流的数据用编码表解码。使用的是默认的编码,即当前系统的编码。
2、字符流专门用于处理文字数据,字节流可以对所有类型的数据进行IO处理。
(二)通用读写流程:
写入:
1.创建流对象:FileWriter fout=new FileWriter("a.txt");//FileWriter是Writer的子类,专门用来处理硬盘文件。ctor须要一个源作为参数。
x.关闭流对象:fout.close();//在流操作完成不再继续使用后,应当执行关闭操作,否则会一直占用系统资源。
2.写入数据。
fout.write('a');//int
fout.write("abc".toCharArray());//char[]
fout.write("def");//String
3.刷新缓冲:fout.flush();
4.关闭资源: fout.close();//close()在关闭时会将缓冲区数据全部写入,也起到刷新缓冲的作用。
注意:
1. FileWriter(Strings,boolean append),append=true时,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
2.在创建一个文件时,如果目录下有同名文件将被覆盖。
读取:
1.创建流对象:FileReader fin=new FileReader("a.txt");//与FileWriter相同。
2.读取数据:
char[]buf=new char[1024];
int cntBuf=0;
cntBuf=fin.read(buf);
String s=new String(buf,0,cntBuf);
3.关闭资源:fin.close();
注意:在读取文件时,必须保证该文件已存在,否则出异常。
另外,定义文件路径时,可以用“/”或者“\\”。
/*
1.FileWriter创建一个目标文件准备写入
2.FileWriter关联源文件准备读取
3.读取一个写入一个
4.关闭资源
*/
import java.io.*;
class CopyTextFileDemo
{
public static void main(String[] args) throws IOException
{
//copyDemo1();
copyDemo2();
}
//读一个写一个对硬盘损伤较大,而且效率不高,应当一次读取多个到缓存(内存),然后再将缓存中的一次性写入到新位置。
public static void copyDemo1() throws IOException
{
FileWriter fout=new FileWriter("FileWriterDemo_copy.java");//目标文件
FileReader fin=new FileReader("FileWriterDemo.java");//源文件
int temp=0;
while((temp=fin.read())!=-1)
{
//fout.write((char)temp);//不需要转换类型,FileWriter里本身就有void write(int c);
fout.write(temp);
}
fout.close();
fin.close();
}
public static void copyDemo2()
{
FileWriter fout=null;
FileReader fin=null;
//流对象在try外声明,在try内初始化。
try
{
fout=new FileWriter("FileWriterDemo_copy.java");
fin=new FileReader("FileWriterDemo.java");
//定义缓冲区存放读取到的字符
char[] cbuf=new char[10];
int cntCbuf=0;
//循环读取知道文件尾。即cntCbuf=-1
while((cntCbuf=fin.read(cbuf))!=-1)
{
fout.write(cbuf,0,cntCbuf);
fout.flush();
}
}
catch(IOException e)
{
newPrint("in copyDemo2 catch: "+e.toString()+"\n");
throw new RuntimeException("RW failed!");//抛出让程序停止下来
}
finally
{
if(null!=fin)
{
try
{
fout.close();
}
catch(IOException e)
{
newPrint("in finally fout catch: "+e.toString()+"\n");
}
}
if(null!=fin)
{
try
{
fin.close();
}
catch(IOException e)
{
newPrint("in finally fin catch: "+e.toString()+"\n");
}
}
}
}
public static void newPrint(Object obj)
{
System.out.print(obj);//若直接打印,这里应该用print而不是ln否则在换行时会产生一点小问题。
}
}