文件在程序中是以流的形式来操作的
流:数据在数据源(文件)和程序(内存)之间经历的路径
输入流:数据从文件到内存的路径
输出流:数据从内存到文件的路径
Java流分为两类:
字节流:可以用于读写二进制文件及任何类型的文件(二进制文件:以字节byte为单位读取的)
字符流:读写文本文件,不能操作二进制文件
字节流 字符流
输入 InputStream Reader
输出 OutputStream Writer
字节流示例: 图片拷贝
//先把图片读入到内存,再写入到某个文件
//输入流
FileInputStream fis=null;
//输出流 先声明
FileOutputStream fos=null;
try {
fis=new FileInputStream("c:\\a.jpg");
fos=new FileOutputStream("d:\\a.jpg");
byte buf[]=new byte[1024];
//记录读取到的字节数
int n=0;
//循环读取
while((n=fis.read(buf))!=-1)
{
//输出到指定文件
fos.write(buf);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//关闭流一定要在finally中执行,防止出异常没有关闭
try{
fis.close();
fos.close();
}catch(Exception e){
e.printStackTrace();
}
}
//文件取出字符流对象
FileReader fr=null;
//文件写入字符流对象
FileWriter fw=null;
try{
//创建fr对象
fr = new FileReader("c:\\test.txt");
//创建fw对象
fw=new FileWriter("d:\\te.txt");
//记录实际读取的字符数
int n=0;
//读入到内存中
char c[]=new char[1024];
while((n=fr.read(c))!=-1){
String s=new String(c,0,n);
System.out.println(s);
fw.write(c);
}
}catch (Exception e){
e.printStackTrace();
}finally{
try{
fw.close();
fr.close();
}catch (Exception e)
{
e.printStackTrace();
}
}
虽然字符流(char)效率高于字节流(byte),但是还不够用,所以引入缓冲字符流(String),可以一行一行读取。
缓冲字符流示例:
BufferedReader br=null;
BufferedWriter bw=null;
try{
//先创建FileReader对象,然后再升级为BufferedReader
FileReader fr=new FileReader("c:\\test.txt");
br=new BufferedReader(fr);
//创建FileWriter
FileWriter fw=new FileWriter("d:\\aa.txt");
bw=new BufferedWriter(fw);
//循环读取文件
String s="";
while((s=br.readLine())!=null)
{
//输出到磁盘
bw.write(s);
}
}catch (Exception e)
{
e.printStackTrace();
}finally{
try{
bw.close();
br.close();
}catch (Exception e){
e.printStackTrace();
}
}
注意:文件流不关闭,可能造成很多问题,比如:读不到