Java OOP File I/O章节
1.1操作文件或目录的属性
1.1.1使用File类操作文件或目录属性
(1)File对象既可以表示文件也可以表示目录,利用它可用来对文件或目录进行基本操作。语法:
File file = new File(String pathName);
//String pathName表示所指向的文件路径名
(2)File类的常用方法
方法名称 | 说明 |
---|---|
boolean exists() | 判断文件或目录是否存在 |
boolean isFile() | 判断是否是文件 |
boolean isDirectory() | 判断是否是目录 |
String getPath() | 返回此对象表示的文件的相对路径名 |
String getAbsolutePath() | 返回此对象表示的文件的绝对路径名 |
String getName() | 返回此对象表示的文件或目录的名称 |
boolean delete() | 删除此对象指定的文件或目录 |
boolean createNewFile() | 创建名称的空文件,不创建文件夹 |
long length() | 返回文件的长度,单位为字节,若文件不存在,则返回OL |
(3)举例
public class FileMethods {
public static void main(String[] args) {
FileMethods fm = new FileMethods();
java.io.File file = new java.io.File("E:\\save.txt");
fm.showFileInfo(file);
}
/**
* 显示文件信息
*/
public void showFileInfo(java.io.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("文件不存在!");
}
}
}
public class FileMethods2 {
public static void main(String[] args) {
FileMethods2 fm = new FileMethods2();
java.io.File file = new java.io.File("E:\\save1.txt");
fm.create(file);
fm.showFileInfo(file);
//fm.delete(file);
}
/**
* 创建文件的方法
*/
public void create(java.io.File file) {
if(!file.exists()) {
try {
file.createNewFile();
System.out.println("文件已创建!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 删除文件
*/
public void delete(java.io.File file) {
if(file.exists()) {
file.delete();
System.out.println("文件已经删除!");
}
}
/**
* 显示文件信息
*/
public void showFileInfo(java.io.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.2Java的流
(1)流的定义:流是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道。一个流是一个输入设备或输出设备的抽象表示。
(2)流的分类:
1、按照流的流向进行划分,可以分为输入流和输出流。
输入流:只能从中读取数据,而不能向其中写入数据。(OutputStream和Writer作为基类)
输出流:只能向其中写入数据,而不能从中读取数据。(InputStream和Reader作为基类)
2、按照所操作的数据单元的不同,流又可划分字节流和字符流。
字节流操作的最小数据单元为8位的字节。
字符流操作的最小数据单元为16为的字符。
1.3读写文本文件
1.3.1使用字节流读取文本文件
(1)字节输入流InputStream类
字节输入流InputStream的作用就是将文件中的数据输入到内部存储器中。常用的方法如下:
方法名称 | 说明 |
---|---|
int read() | 读取一个 字节数据 |
int read(byte[] b) | 将数据读取到字节数据中 |
int read(byte[] b,int off,int len) | 从输入流中读取最多len长度的字节,保存到字节数组b中,保存的位置从off开始 |
void close() | 关闭输入流 |
int available() | 返回输入流读取的估计字节数 |
(2)字节输入流FileInputStream类
我们通常使用InputStream的子类FileInputStream类来实现文本文件内容的读取。语法:
File file = new File("C:\\test.txt");
InputStream fileObject = new FileInputStream(file);
(3)使用FileInputStream读取文件
1、引入相关类
import java.io.*;
2、创建一个文件输入流的对象
InputStream fileObject = new FileInputStream("C:\\test.txt");
3、利用文件输入流的方法读取文本文件的数据
fileObject.avaiable();//可读取的字节数
fileObject.read();//读取文件的数据
4、关闭文件输入流的对象
fileObject.close();
举例:
public class FileInputStreamTest {
public static void main(String[] args) {
//声明流对象
FileInputStream fis =null;
try {
fis = new FileInputStream("E:\\save.txt");
int data;
System.out.println("可读取的字节数:"+fis.available());
System.out.print("文件内容:");
//循环读取数据
while((data=fis.read())!=-1) {
System.out.print((char)data+"");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if(fis!=null) {
fis.close();
}
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}
1.3.2使用字节流写文本文件
(1)字节输出流OutputStream类
字节输出流OutputStream类的作用是把内存的数据输出到文件中,常用方法如下:
方法名称 | 说明 |
---|---|
void write(int c) | 写入一个字节数据 |
void write(byte[] buf) | 写入数据buf的所有字节 |
void write(byte[] b,int off,int len) | 将字节数组中从off位置开始,长度为len的字节数据输出带输出流中 |
void close() | 关闭输出流 |
(2)字节输出流FileOutputStream类
我们通常使用OutputStream的子类FileOutputStream类来实现文本文件内容的写入。语法:
File file = new File("C:\\test.txt");
FileOutputStream fos = new FileOutputStream(file);
(3)使用FileOutputStream写入文件
1、引入相关类
import java.io.*;
2、创建一个文件输入流的对象
OutputStream fos = new FileOutputStream("C:\\test.txt");
3、利用文件输出流的方法写入数据到文本文件
String str ="好好学习!";
byte[] words =str.getBytes();
//利用write方法将数据写入文件中
fos.write(words,0,words.length);
4、关闭文件输出流的对象
fileObject.close();
举例:
public class FileOutputStream {
public static void main(String[] args) {
java.io.FileOutputStream fos=null;
try {
String s ="好好学习Java";
byte[] words =s.getBytes();//字节数组
//创建流对象追加方式写入文件
fos= new java.io.FileOutputStream("E:save.txt",true);
//写入文件
fos.write(words,0,words.length);
System.out.println("save文件已经更新!");
} catch (IOException e) {
System.out.println("创建文件出错!");
}finally {
try {
if(fos!=null) {
fos.close();
}
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}
1.3.3使用字符流读取文本文件
(1)字符输入流Reader类
Reader类是读取字符流的抽象类,常用方法如下:
方法名称 | 说明 |
---|---|
int read() | 从输入流中读取单个字符 |
int read(byte[] c) | 从输入流中读取c.length长度的字符,保存在字符数组c中,返回实际读取的字符数 |
read(char[] c,int off,int len) | 从输入流读取最多len长度字符,保存到字符数据c中,保存位置从off位置开始,返回实际读取的字符长度 |
void close() | 关闭流 |
(2)字符输入流FileReader类
FileReader类是Reader类的子类,语法:
Reader fr = new FileReader("C:\\\test.txt");
(3)使用FileReader读取文件
1、引入相关类
import java.io.*;
2、创建一个FileReader的对象
Reader fr = new FileReader("C:\\test.txt");
3、利用文件输入流的方法读取文本文件的数据
int.read();//读取单个字符
4、关闭相关流的对象
fr.close();
举例:
public class FileReader {
public static void main(String[] args) {
java.io.Reader fr =null;
StringBuffer sbf=null;
try {
fr = new java.io.FileReader("E:\\简介.txt");
char ch[] = new char[1024];//创建字符数组作为中转站
sbf = new StringBuffer();
int length =fr.read(ch);//将字符读出
//循环读取并追加字符
while((length!=-1)) {
sbf.append(ch);//追加
length=fr.read();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally{
try {
if(fr!=null) {
fr.close();
}
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}
(4)字符输入流BufferedReader类
BufferedReader类是Reader类的子类,它与FileReader类的区别在于BufferedReader类带有缓冲区。语法:
Reader fr = new FileReader("C:\\test.txt");
BufferedReader br = new BufferedReader(fr);
(5)使用FileReader和BufferedReader读取文本文件
1、引入相关类
import java.io.*;
2、创建一个BufferedReader的对象
Reader fr = new FileReader("C:\\test.txt");
BufferedReader br = new BufferedReader(fr);
3、利用BufferedReader类的方法读取文本文件的数据
br.read();//读取一行数据返回字符串
4、关闭相关流的对象
br.close();
fr.close();
举例:
public class BufferedReader {
public static void main(String[] args) {
java.io.FileReader fr=null;
java.io.BufferedReader br=null;
try {
//创建一个FileReader对象
fr = new FileReader("E:\\save.txt");
//创建一个BufferedReader对象
br = new java.io.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 e2) {
e2.printStackTrace();
}
}
}
}
1.3.4使用字符流写文本文件
(1)字符输出流Writer类
Writer类是向文件写入数据的字符流,常用方法如下:
方法名称 | 说明 |
---|---|
write(String str) | 将str字符串里包含的字符输出到指定的输出流中 |
write(String str,int off,int len) | 将str字符串里从off位置开始长度为len的字符输出到输出流 |
void close() | 关闭输出流 |
void flush() | 刷新输出流 |
(2)字符输出流FileWriter类
FileWriter类是Writer的子类,语法:
Writer fr = new FileWriter("C:\\test.txt");
(3)使用FileWriter写文本文件
1、引入相关类
import java.io.*;
2、创建一个FileWriter的对象
Writer fr = new FileWriter("C:\\test.txt");
3、利用文件输出流的方法写入数据到文本文件
bw.write("Hello!");
4、关闭文件输出流的对象
bw.flush();//刷新该流的缓冲
fw.close();//关闭此流
举例:
public class FileWriter {
public static void main(String[] args) {
java.io.Writer fw=null;
try {
//创建一个FileWriter对象
fw = new java.io.FileWriter("E:\\save.txt");
//写入信息
fw.write("我热爱我的团队!");
fw.flush();//刷新缓冲区
System.out.println("写入成功!");
} catch (IOException e) {
System.out.println("文件不存在!");
}finally {
try {
if(fw!=null) {
fw.close();
}
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}
(4)字符输出流BufferedWriter类
BufferedWriter类是BufferedWriter类的子类,BufferedWriter与BufferedReader的流方向正好相反,BufferedWriter是把一批数据写到缓冲区。语法:
Writer fw = new FileWriter("C:\\test.txt");
BufferedWriter bw = new BufferedWriter(fw);
(5)使用BufferedWriter和FileWriter写文本文件
1、引入相关类
import java.io.*;
2、创建一个BufferedWriter的对象
Writer fw = new FileWriter("C:\\test.txt");
BufferedWriter bw = new BufferedWriter(fw);
3、利用BufferedWriter类的方法写文本文件的数据
bw.write("Hello!");
4、关闭相关流的对象
bw.flush();//刷新该流的缓冲
fw.close();//关闭此流
举例:
public class File {
public static void main(String[] args) {
java.io.FileWriter fw =null;
java.io.BufferedWriter bw=null;
try {
//创建一个FileWriter对象
fw = new FileWriter("E:\\save.txt");
//创建一个BufferedWriter对象
bw = new BufferedWriter(fw);
//写入信息
bw.write("大家好!");
bw.write("我正在学习BufferedWriter。");
bw.newLine();
bw.write("多多指教!");
bw.newLine();//插入换行
bw.flush();//刷新
fw.close();//关闭文件流
java.io.FileReader fr = new FileReader("E:\\save.txt");
java.io.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(bw!=null) {
bw.close();
}if(fw!=null) {
fw.close();
}
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}
1.4二进制文件的读写
1.4.1使用字节流类DataInputStream读二进制文件
DataInputStream类是FileInputStream的子类,它是FileInputStream的扩展。
1、引入相关类
import java.io.*;
2、创建一个数据输入流的对象
FileInputStream fis = new FileInputStream("C:\\HelloWorld.class");
DataInputStream dis = new DataInputStream(fis);
3、利用数据输入流的方法读取文本文件的数据
dis.read();//读取数据字节
4、关闭相关流的对象
dis.close();//关闭数据输入流
1.4.1使用字节流类DataOutputStream写二进制文件
DataOutputStream类是FileOutputStream的子类,它是FileOutputStream类的扩展。
1、引入相关类
import java.io.*;
2、创建一个数据输入流的对象
FileOutputStream fos = new FileOutputStream("C:\\HelloWorld.class");
DataOutputStream out = new DataOutputStream(fis);
3、利用数据输入流的方法写文本文件的数据
out.write(1);//将指定字节数据写入
4、关闭相关流的对象
out.close();//关闭数据输入流
例如:
public class DataOutputStream {
public static void main(String[] args) {
java.io.DataOutputStream out =null;
java.io.DataInputStream dis=null;
try {
//创建输入流对象
java.io.FileInputStream fis = new FileInputStream("E:\\save.txt");
dis = new DataInputStream(fis);
//创建输出流对象
java.io.FileOutputStream outFile = new FileOutputStream("E:\\save1.txt");
out = new java.io.DataOutputStream(outFile);
int temp;
//读取文件
while((temp=dis.read())!=-1) {
out.write(temp);
}
System.out.println("成功!");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(dis!=null) {
dis.close();
}if(out!=null) {
out.close();
}
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}