JAVA文件操作
java.io包也是Java内置的包,其中包含一系列对文件和目录的属性进行操作,对文件进行读写操作的类;
程序中如果要使用到该包中的类,对文件或流进行操作,则必须显式地声明如下语句:
import java.io.*;
什么是文件?
文件可以认为是相关记录或存放在一起的数据的集合;
文件一般是存放在磁盘上的,例如:硬盘、软盘和光盘等等。
File类的对象不但可以表示文件,还可以表示目录,在程序中一个File类对象可以代表一个文件或目录;
当创建一个文件对象后,就可以利用它来对文件或目录的属性进行操作,如:文件名、最后修改日期、文件大小等等;
需要注意的是,File对象并不能直接对文件进行读/写操作,只能查看文件的属性;
File类的构造方法有4种重载方式,常用的如下:
构造方法 | 说明 |
---|---|
File(String pathname) | 指定文件(或目录)名和路径创建文件对象 |
如:
import java.io.File;
public class note {
public static void main(String[] args) {
//在当前目录下创建一个与aaa.txt文件名相关联的文件对象
File f1 = new File("note.txt");
//指明详细的路径以及文件名,请注意双斜线
File f2 = new File("D:\\Java\\Hello.java");
}
}
File类中的常用方法:
boolean exists() | 判断文件是否存在,存在返回true,否则返回false |
---|---|
boolean isFile() | 判断是否为文件,是文件返回true,否则返回false |
boolean isDirectory() | 判断是否为目录,是目录返回true,否则返回false |
String getName() | 获得文件的名称 |
String getAbsolutePath() | 获得文件的绝对路径 |
long length() | 获得文件的长度(字节数) |
boolean createNewFile() throws IOException | 创建新文件,创建成功返回true,否则返回false,有可能抛出IOException异常,必须捕捉 |
boolean delete() | 删除文件,删除成功返回true,否则返回false |
File[] listFiles() | 返回文件夹内的子文件与子文件夹的数组 |
//显示与文件有关的属性信息
System.out.println("文件或目录是否存在:" + file.exists());
System.out.println("是文件吗:" + file.isFile());
System.out.println("是目录吗:" + file.isDirectory());
System.out.println("名称:" + file.getName());
System.out.println("绝对路径:" + file.getAbsolutePath());
System.out.println("文件大小:" + file.length());
流是指一连串流动的数据信号,是以先进先出的方式发送和接收数据的通道。
根据流动方向的不同,流分为输入流和输出流;
对于输入和输出流,由于传输格式的不同,又分为字节流和字符流:
字节流是指8位的通用字节流,以字节为基本单位,在java.io包中,对于字节流进行操作的类大部分继承于InputStream(输入字节流)类和OutputStream(输出字节流)类;
字符流是指16位的Unicode字符流,以字符(两个字节)为基本单位,非常适合处理字符串和文本,对于字符流进行操作的类大部分继承于Reader(读取流)类和Writer(写入流)类。
**
FileInputStream类
称为文件输入流,继承于InputStream类,是进行文件读操作的最基本类;
作用是将文件中的数据输入到内存中,我们可以利用它来读文件;
由于它属于字节流,因此在读取Unicode字符(如中文)的文件时可能会出现问题。
FileInputStream对象读文件方式1
public class FileInputStreamDemo1 {
public static void main(String[] args) {
try {
File file = new File("test.txt"); //创建文件对象
//使用文件对象创建文件输入流对象,相当于打开文件
FileInputStream fis = new FileInputStream(file);
for (int i = 0; i < file.length(); i++) {
char ch = (char)(fis.read()); //循环读取字符
System.out.print(ch);
}
System.out.println();
fis.close(); //关闭流
} catch (FileNotFoundException fnfe) {
System.out.println("文件打开失败。");
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
FileInputStream对象读文件方式2:
public class FileInputStreamDemo2 {
public static void main(String[] args) {
try {
File file = new File("test.txt"); //创建文件对象
FileInputStream fis = new FileInputStream(file);
//根据文件的字节长度创建字节数组
byte[] buf = new byte[(int)(file.length())];
fis.read(buf); //读取文件中的数据存放到字节数组中
String str = new String(buf); //利用字节数组创建字符串
System.out.println(str); //打印字符串
fis.close(); //关闭流
} catch (FileNotFoundException fnfe) {
System.out.println("文件打开失败。");
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
**
FileOutputStream类
称为文件输出流,继承于OutputStream类,是进行文件写操作的最基本类;
它的作用是将内存中的数据输出到文件中,我们可以利用它来写文件。
FileOutputStream对象写文件方式-1
public class FileOutputStreamDemo1
{
//在函数内部不进行异常处理,将异常抛出函数外部
public static void main(String[] args) throws IOException
{
String str = "Hello world!";
File file = new File("test.txt"); //创建文件对象
//通过文件对象创建文件输出流对象
//附加第二个参数true,指定进行文件追加,默认为不追加
FileOutputStream fos = new FileOutputStream(file, true);
//逐个将字符写入到文件中
for (int i = 0; i < str.length(); i++)
{
fos.write(str.charAt(i));
}
fos.close(); //关闭流
}
}
FileOutputStream对象写文件方式-2
public class FileOutputStreamDemo2
{
//在函数内部不进行异常处理,将异常抛出函数外部
public static void main(String[] args) throws Exception
{
String str = "I Love Java";
//通过文件名创建文件输出流对象
FileOutputStream fos = new FileOutputStream("test.txt");
//将字符串转化为字节数组
byte[] buffer = str.getBytes();
//将字节数组中包含的数据一次性写入到文件中
fos.write(buffer);
//关闭流
fos.close();
}
}
创建一个目录和文件,并且写入数据然后再读出数据
import java.io.*;
public class FileOperation {
public static void main(String[] args) throws IOException {
//创建目录
String directories ="D:\\aa\\bb\\cc";
File file = new File(directories);
boolean result = file.mkdirs();//创建多级目录
if(!file.exists()){
System.out.println("目录创建成功");
}else{
System.out.println("目录已存在");
}
System.out.println("文件是否存在:"+file.exists());//判断文件是否存在
//创建文件
String directories1 ="D:\\aa\\bb\\cc\\chw.txt";
File file1 = new File(directories1);
if (!file1.exists()){
try {
file1.createNewFile();
System.out.println("目录创建成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
//获取目录大小
// long size = FileUtils.sizeOfDirectory(new File("C:/test"));
// System.out.println("Size: " + size + " bytes");
//查询文件夹内的子文件夹
File [] fs= file.listFiles();
for (int i=0; i<fs.length;i++){
System.out.println(fs[i].getName());//还能输出隐藏文件
}
//向文件中写入数据
//FileOutputStream fos = new FileOutputStream(file1);//将文件里原来的数据覆盖
FileOutputStream fos = new FileOutputStream(file1,true);//在文件中原有的内容追加上我写入是数据
String str ="aaaaa";
fos.write(str.getBytes());
//将文件的内容读取到java程序中
FileInputStream fis = new FileInputStream(file1);
byte[] bs = new byte[(int) file1.length()];
fis.read(bs);
String strs = new String(bs);
System.out.println(strs);
}
}
查看结果
目录已存在
文件是否存在:true
chw.txt
aaaaa
字符流
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class Work {
//字节流:fileinputStream读 fileOutputStream写
public static void main(String[] args) {
// TODO Auto-generated method stub
//文件的字符流 filereader filewriter
File f=new File("D:\\test\\first.txt");
// try {
// FileReader fr=new FileReader(f);
// //char[] cs=new char[f.length()];//f.length获取内容字节长度
// //fr.read(cbuf);
// BufferedReader br=new BufferedReader(fr);
// String str=br.readLine();
// System.out.println(str);
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
FileWriter fw=null;
try {
fw=new FileWriter(f, true);//字符流需要清理通道
PrintWriter pw=new PrintWriter(fw, true);
fw.write("qwerytrhjgfh");
//fw.flush();//清理管道
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
// try {
// //fw.close();//既会fw关闭,还会自动去清理管道
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
}
FileInputStream/FileOutputStream小结
FileInputStream类和FileOutputStream类是成对出现的,一个进行输入(读文件)操作,一个进行输出(写文件)操作;
由于采用字节方式进行数据传输,不必考虑数据的格式问题,这两个类对文件操作的效率较高;
可以使用这两个类完成复制文件的操作