File IO
在之前学习C#的过程中我们就已经对文件操作有所了解了,现在我们就来了解一下Java的文件操作。在Java中常用的文件编码主要有:utf-8、gbk、iso-8859-1这几种。
一、File类
在C#中用来操作文件的是File类和FileInfo类,用来操作目录的是Directory类和DirectoryInfo类;而在Java中不论是操作文件还是目录都是用File类并且是非static的。
创建一个File对象的语法及其常用方法如下:
File file = new File(String pathName); //小括号里放路径
//常用方法
exists() //判断文件或目录是否存在
isFile() //判断是否是文件
isDirectory() //判断是否是目录
getPath() //返回此对象表示的文件的相对路径名
getAbsolutePath() //返回此对象表示的文件的绝对路径名
getName() //返回此对象表示的文件或目录的名称
delete() //删除此对象指定得到文件或目录
createNewFile() //创建名称的空文件,不创建文件夹
length() //返回文件的长度,单位为字节,若文件不存在,则返回0L
例如,下面来看一下File类是如何获取文件属性的:
public static void main(String[] args) {
FileMethods fm = new FileMethods();
File file = new File("D:\\hello.txt");
fm.showFileInfo(file);
}
/**
* 显示文件信息
*/
public void showFileInfo(File file) {
if(file.exists()) { //判断文件或目录是否存在
if(file.isFile()) { //如果是文件
System.out.println("名称:" + file.getName());
System.out.println("相对路径:" + file.getPath());
System.out.println("绝对路径:" + file.getAbsolutePath());
System.out.println("文件大小:" + file.length() + "字节");
}
if(file.isDirectory()) {
System.out.println("此文件是目录");
}
}else {
System.out.println("文件不存在");
}
}
运行结果为:
文件读取步骤
1、导入包:java.io;
2、创建流对象;
3、使用对象读写;
4、关闭流。
二、Java的流
前面讲述了如何利用File类对文件或目录的属性进行操作,但File类不能访问文件的内容,所以我们就需要借助于文件流来对文件进行读写的操作。
Java的文件流按读取方式分类可分为:字符流(一次读取一个字符)和字节流(一次读取一个字节);根据读取方向分为输入流(读)和输出流(写)。
读取一张图片一般是采用字节流的方式,,字符流能实现的功能字节流都能实现,反之却不一定。
1、字节流
(1)输入流
输入流InputStream是一个抽象类,在实际应用中我们通常使用InputStream的子类FileInputStream类来实现文本文件内容的读取。它们的常用方法是:
read() //读取一个字节数据
read(byte[] b) //将数据读取到字节数组中
read(byte[] b,int off,int len) //从输入流中读取最多len长度的字节,保存到字节数组b中,保存的位置从off开始
close() //关闭输入流
available() //返回输入流读取的估计字节数
它的读取方法都是返回值为-1的时候表示读取结束。
DataInputStream类是FileInputStream的子类,他是FileInputStream类的扩展。利用DataInputStream类读取二进制文件的实现步骤其实与FileInputStream类读取文本文件的步骤及其相似,而且还要用到FileInputStream类。
例如:
DataInputStream dis = null;
try {
//创建输入流对象
FileInputStream fis = new FileInputStream("D:\\File.class");
dis = new DataInputStream(fis);
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(dis != null) {
dis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
(2)输出流
字节输出流OutputStream类,在实际应用中我们通常使用OutputStream的子类FileOutputStream类来实现文本文件内容的读取。它们的常用方法是:
write(int c) //写入一个字节数据
write(byte[] buf) //写入数组buf的所有字节
write(byte[] b,int off,int len) //将字节数组中从off位置开始,长度为len的字节数据输出到输出流中
close() //关闭输出流
DataOutputStream类是FileOutputStream的子类,他是FileOutputStream类的扩展。利用DataOutputStream类读取二进制文件的实现步骤其实与FileOutputStream类读取文本文件的步骤及其相似,而且还要用到FileOutputStream类。
例如:
DataOutputStream dos = null;
try {
//创建输入流对象
FileOutputStream outFile = new FileOutputStream("D:\\Temp.class");
out = new DataOutputStream(outFile);
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(dos != null) {
dos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
2、字符流
(1)输入流
字符输入流Reader类,在实际应用中我们通常使用InputStream的子类FileReader类来实现文本文件内容的读取。它们的常用方法是:
read() //从输入流中读取单个字符
read(byte[] b) //从输入流中读取b.length长度的字符,保存到字符数组b中,返回实际读取字符数
read(char[] b,int off,int len) //从输入流中读取最多len长度的字节,保存到字节数组b中,保存的位置从off开始,返回实际读取的字符长度
close() //关闭输入流
它的读取方法都是返回值为-1的时候表示读取结束。
字符输入流BufferedReader类也是Reader类的子类,它和FileReader类的区别在于BufferedReader类带有缓冲区,它可以先把一批数据读到缓冲区,接下来的读操作都是从缓冲区内获取数据。它的常用构造方法是:
BufferedReader(Reader in)
br.readLine() //br为对象名,此方法是BufferedReader独有的方法,表示读取一行数据
例如,使用FileReader和BufferedReader读取文本文件:
FileReader fr = null;
BufferedReader br = null;
try {
//创建一个FileReader对象
fr = new FileReader("D:\\hello.txt");
//创建一个BufferedReader对象
br = new BufferedReader(fr);
//读取一行数据
String line = br.readLine();
while(line != null) {
System.out.println(line);
line = br.readLine();
}
}catch (IOException e) {
System.out.println("文件不存在!");
}finally {
try {
if(br != null) {
br.close();
}
if(fr != null) {
fr.close();
}
}catch (IOException e) {
e.printStackTrace();
}
}
在控制台将输出从文本文件读取出来的内容。
(2)输出流
字符输出流Writer类,在实际应用中我们通常使用Writer的子类FileWriter类来实现文本文件内容的读取。它们的常用方法是:
write(String c) //将str字符串里包含的字符输出到指定的输出流中
write(String str,int off,int len) //将str字符串从off位置开始,长度为len的字符输出到输出流中
close() //关闭输出流
flush() //刷新输出流
字符输出流BufferedWriter类也是Writer类的子类,它和FileWriter类的区别在于BufferedWriter类带有缓冲区,它可以先把一批数据读到缓冲区,接下来的读操作都是从缓冲区内获取数据。它的常用构造方法是:
BufferedWriter(Writer out)
例如,使用FileWriter和BufferedWriter读取文本文件:
FileWriter fw = null;
BufferedWriter bw = null;
try {
//创建一个FileWriter对象
fw = new FileWriter("D:\\hello.txt");
//创建一个BufferedWriter对象
bw = new BufferedWriter(fw);
//写入信息
bw.write("大家好!");
bw.write("我正在学习BufferedWriter!");
bw.newLine();
bw.write("请多多指教!");
bw.newLine(); //换行
bw.flush(); //刷新
bw.close();
fw.close(); //关闭文件流
}catch (IOException e) {
System.out.println("文件不存在!");
}finally {
try {
if(br != null) {
br.close();
}
if(fr != null) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
在指定的文件夹中将添加文本信息。
好啦,今天就到这里啦!