Java IO
java支持对文本及文件的内容进行读取和写入数据操作,并且数据位于内存中并且属于特定的类型,程序才可以操作它们,如后缀为 txt、doc、xls、jpg、java、class…等的文件。
操作文件的基类 File
File对象可以表示文件也可以表示目录,利用一个File对象可进行一些基本操作。
import java.io.*; //导入包
File file=new File(String path);//创建一个File对象 path 为文件或目录路径
File类的常用方法
方法名 | 说明 |
---|---|
boolean exists() | 判断文件或目录是否存在 |
boolean isFile() | 判断是否为文件 |
boolean isDirectory() | 判断是否为目录 |
String getPath() | 返回文件的相对路径 |
String getAbsolutePath() | 返回文件的绝对路径 |
String getName() | 返回文件或目录的名称 |
boolean delete() | 删除此对象指定的目录或文件 |
boolean createNewFile() | 创建名称的空文件,不创建文件夹 |
long length() | 返回文件的长度,单位为字节,若文件不存在,则返回OL |
Java流
流–是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道,可以进行读取和写入操作,流就像是一个个的字节序列。
-
按流向分类:输入流、输出流
-
按操作对象分类:字节流、字符流
-
按功能分类:节点流、处理流
操作文件的 java.iO包涵类图
在进行文件的读取和写入操作时要进行异常的捕捉操作,通常有FileNotFoundException类型异常,关闭文件流会有IOException类型异常。 (以下代码将省略此操作!)
关闭文件流时遵循先开后关原则!
*使用InputStream的子类FileInputStreame读取文件以及用OutputStream
的子类FileOutputStream写入读取的信息到文件的方法
import java.io.*;//直接导入所有包含的包
class Test{
public void static main(String[] args){
//创建输入流对象 读取文件信息 D://a.txt
FlieInputStream fs=new FileInputStream("D://a.txt");
//创建输出流对象 将读取信息写入 E://b.txt
FileOutputStream fo=new FileOutputStream("E://b.txt");
//创建一个中装数组保存读取信息
byte [] b=new byte[1024];
//循环读取文件 并进行文件的写入 ==-1到文件末尾停止读取
while(fs.read(b)!=-1){
fo.write(b,0,b.length);//写入文件
}
.......
//关闭文件流操作
}
}
在使用BufferedReader和BufferedWrite进行读写操作时通常与FileReader和FileWrite一起使用提高读取写入文件的效率
import java.io.*;
public class Dome {
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferedReader br=null;
BufferedWriter bw=null;
try {
br=new BufferedReader(new FileReader("D://12.txt"));
bw=new BufferedWriter(new FileWriter("E://my.txt"));
String line=br.readLine();//校验有无数据
while(line!=null){
bw.write(line);
line=br.readLine();
}
System.out.println("复制成功!");
}catch(FileNotFoundException f){
f.printStackTrace();
}finally{
try {
if(bw!=null)bw.close();
if(br!=null)br.close();
} catch (IOException s) {
s.printStackTrace();
}
}
}
在很多程序中经常看到声明空的对象,是为了避免内存空间的浪费,放在try中若有异常直接被捕获不会造成不必要的空间浪费!
二进制文件的读写使用DataInputStream和DataOutputStream进行图片的复制操作
import java.io.*;
public class Picture{
public void static main(String[] args){
int temp;//接收读取信息保存变量
DataInputStream dis=null;
DataOutputStream dos=null;
try{
//创建输入流对象 与FileInputStream一起使用提高读取文件速度
dis=new DataInputStream(new FileInputStream("D://1.jpg"));
//创建输入流对象 与FileOutputStream一起使用提高写入文件速度
dos=new DataOutputStream(new FileOutputStream("E://2.jpg"));
while((temp=dis.read())!=-1){
dos.write(temp);//写入信息
}
System.out.print("图片保存成功!");
}catch (FileNotFoundException f){
f.printStackTrace();
}finally{
try {
if(dos!=null)dos.close();
if(dis!=null)dis.close();
} catch (IOException s) {
s.printStackTrace();
}
}
}
字节流: 以byte性数组为中转站保存读取的信息
字符流:以char数组和String作为保存信息的中转站
区别
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容