前言
在计算机中,通常使用各种各样的文件来保存数据,如何在Java程序中操作这些文件呢?java.io包提供了一些接口和类,对文件进行基本的操作,包括对文件和目录属性的操作、对文件读写的操作等。首先学习使用File类操作文件和目录。
File
-
File对象可以表示文件或目录,程序中一个File对象可以代表一个文件或目录。可以利用他对文件或目录进行基本操作。如查看名称、最后修改日期、文件大小等。
-
File类构造方法:
方法 | 说明 |
---|---|
File(String pathname) | 用指定文件路径构造文件 |
File(String dir,String subpath) | 指定文件路径下创建指定文件名的文件 |
File(File parent,String subpath) | 指定文件对象中创建指定文件名文件 |
-
File类常见方法
方法 说明 boolean exists() 文件是否存在,存在返回true String getAbsolutePath() 返回此对象表示的文件的绝对路径名 String getName() 返回吃对象表示的文件的名称 String getParent() 返回此File对象的路径名的上一级,没有则返回null boolean delete() 删除此对象指定的文件 boolean isDirectory() 是否是目录 boolean mkdir() 创建目录,路径由当前File对象指定 boolean mkdirs() 创建包括父目录的目录
代码示例:
public static void main(String[] args) throws IOException {
//构造文件对象
File file=new File("C:/Users/29616/desktop/1.txt");
//判断是否存在
if(file.exists()){
//存在,判断是否是文件
if(file.isFile()){
System.out.println("文件存在");
//定义str字符串
String str="好好学习,天天向上\t";
//字符流 写入 true表示向文件追加内容 false表示覆盖
FileWriter fw=new FileWriter("C:/Users/29616/desktop/1.txt",true);
//写入
fw.write(str);
//关比字符流,不关闭会导致长期占用资源,并且安全性低
fw.close();
//字符流 读取
FileReader fr=new FileReader("C:/Users/29616/desktop/1.txt");
//定义一个字符数组,用于存储读到字符
char[] datas=new char[1024];
//把读取的内容存到数组里,读到的是字符个数
fr.read(datas);
System.out.println(datas);
fr.close();
//文件大小
long length=file.length();
System.out.println(length);
//文件路径
String path=file.getPath();
System.out.println(path);
//文件绝对路径
String abspath=file.getAbsolutePath();
System.out.println(abspath);
//最后修改时间
long time=file.lastModified();
//System.out.println(time);
//格式化时间
Date date=new Date(time);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(simpleDateFormat.format(date));
//删除文件
if(file.delete()){
System.out.println("删除成功");
}
//不是文件
}else{
System.out.println("文件夹");
}
}else{
//文件不存在
System.out.println("不存在,创建");
//创建新文件
file.createNewFile();
System.out.println("创建成功" );
}
}
Java流
前面讲解的java.io包中的File类对文件或目录的属性进行操作,但File类不能访问文件的内容,即不能从文件中读取数据或往文件里写数据。下面介绍文件的读写操作。
读文件是指把文件中的数据读取到内容中,反之,写文件是指把内存中的数据写入到文件中。通过“流”可以实现读写文件的操作。
流的分类
数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的类别。
- 按照流的方向主要分为输入流和输出流两大类。
- 数据流按照数据单位的不同分为字节流和字符流。
- 按照功能可以划分为节点流和处理流。
1.输入流和输出流
输入/输出流是相对于计算机内存来说的,输入流表示数据输入到内存,输出流表示从内存中输出。Java的输出流主要由OutputStream和Write作为基类,输入流由InputStream和Reader作为基类。
2.字节流和字符流
输入/输出流又按照处理数据单元的不同分为字节流和字符流。
字节流是8位通用字节流,其基本单位是字节,字节流的基类是InputStream类(常用子类FileInputStream)和OutPutStream类(常用子类FileOutputStream),他们是抽象类。
字符流是16位Unicode字符流,基本单位是Unicode字符。字符流最适合用来处理字符串和文本,支持国际上大多数的字符集和语言。字符流的基类是Reader类(常用子类BufferedReader)和Writee(常用子类BufferedWriter)类,也是抽象类。
注:所有方法再出现错误时,都会抛出IOExcpetion。
读写文本文件
1.使用字节流读写文本文件
- 使用字节流FileInputStream读文本文件
package exam;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamTest {
/**
* 字节流读文件
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
File file=new File("C:/Users/29616/desktop/1.txt");
//创建流对象
FileInputStream fis=new FileInputStream(file);
int data;
System.out.println("可读取的字节数:"+fis.available());
System.out.println("文件内容为:");
//循环读数据
while ((data=fis.read())!=-1){
System.out.println(data+"");
}
fis.close();
}
}
- 使用字字节流FileOutputStream写文本文件
package exam;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 字节流写文件
*/
public class FileOutputStreamTest {
public static void main(String[] args) throws IOException {
try{
String str="java";
byte[] b=str.getBytes();//字节数组
FileOutputStream fos=new FileOutputStream("C:/Users/29616/desktop/1.txt",true);
fos.write(b,0,b.length);
System.out.println("文件已更新");
fos.flush();
fos.close();
}catch (IOException obj){
System.out.println("创建文件时出错");
}
}
}
2.使用字符流读写文本文件
- 使用字符流BufferedReander和FileReader读文本文件
package exam;
import java.io.*;
/**
* 字符流读文件
*/
public class BufferedReaderTest {
public static void main(String[] args) throws IOException {
File file=new File("C:/Users/29616/desktop/1.txt");
FileReader fr=new FileReader(file);
BufferedReader br=new BufferedReader(fr);
String line=br.readLine();
while(line!=null){
System.out.println(line);
line=br.readLine();
}
br.close();
fr.close();
}
}
- 使用字符流BufferedWriter和FileWriter写文本文件
package exam;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/**
* 字符流写文件
*/
public class BufferedWriterTest {
public static void main(String[] args) throws IOException {
BufferedWriter bw=new BufferedWriter(new FileWriter("C:/Users/29616/desktop/1.txt",true));
bw.write("java");
bw.newLine();
System.out.println("写入成功!");
bw.flush();
bw.close();
}
}
读写二进制文件
读写二进制文件常用的类有DataInputStream和DataOutputStream。
代码示例:
package exam;
import java.io.*;
/**
* 读取二进制文件1.class中数据,复制到另一个二进制文件2.class文件中
*/
public class ReadAndWriteClass {
public static void main(String[] args) throws IOException {
File file=new File("C:/Users/29616/desktop/1.class");
File copyfile=new File("C:/Users/29616/desktop/2.class");
file.createNewFile();
copyfile.createNewFile();
//字节流读文件
FileInputStream fis=new FileInputStream(file);
//字节流读二进制文件
DataInputStream dis=new DataInputStream(fis);
//字节流写文件
FileOutputStream fos=new FileOutputStream(copyfile,true);
//字节流写二进制文件
DataOutputStream dos=new DataOutputStream(fos);
int temp;
while ((temp=dis.read())!=-1){ //读数据
dos.write(temp); //把读取数据写入到2.clss中
}
System.out.println("读写成功");
fis.close();
fos.close();
dis.close();
dos.close();
}
}
重定向标准I/O
Java提供了两个标准输入/输出流:System.in和System.out,主要用于从键盘接受数据以及向屏幕输出数据。
使用重定向标准I/O可以使用System.in读取文件中的数据以及使用System.out向文件中写入数据。
System类提供3个重定向标准I/O的方法:
方法 | 说明 |
---|---|
static void setErr(PrintStream err) | 重定向标准错误输出流 |
static void setIn(InputStream in) | 重定向标准输入流 |
static void setOut(PrintStream out) | 重定向标准输出流 |
代码示例:
package demo1;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class Test3 {
public static void main(String[] args) {
//创建PrintStream输入流
try {
PrintStream ps=new PrintStream(new FileOutputStream("C:/Users/29616/desktop/1.txt"));
//将标准输出流重定向到文件
System.setOut(ps);
//向文件中输出内容
System.out.print("重定向测试");
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
}
}
}