Java文件操作基础
目录
二、java.io.FileInputStream和java.io.FileOutputStream
3.FileInputStream和FileOutputStream拷贝文件
一、java.io.File
java.io.File类用于描述文件系统中的一个文件或目录 该类可以:
- 1、访问文件或目录的属性信息
- 2、访问一个目录中的所有子项
- 3、操作文件或目录(创建、删除)
该类不可以:
- 访问文件的具体内容
开发时注意不同操作系统的路径的表示方法的差异(如'/'或'\'),使用File.separator
可以屏蔽不同操作系统的路径的差异。
1.读取文件属性
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FileDemo1 {
public static void main(String[] args) {
/*
* 尽量不写绝对路径。
* 常用的是相对路径:
* 1、相对于项目目录(当前目录)
* 2、相对于类加载目录(实际开发更常用)
*/
File file = new File("." + File.separator + "test.txt"); //分隔符
System.out.println(file);
/*
* 获取当前文件的属性信息
*/
//获取文件名(不包括文件路径)
String name = file.getName();
System.out.println("文件名:"+name);
//获取文件大小(字节)
long length = file.length();
System.out.println("文件大小(字节):"+length);
//最后修改时间(毫秒数)
long time = file.lastModified();
System.out.println(time);
Date date = new Date();
date.setTime(time);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
String str = sdf.format(date);
System.out.println(str);
/*
* 可读、可写、可执行、隐藏
*/
file.canRead();
file.canWrite();
file.canExecute();
file.isHidden();
System.out.println(file.getPath());
}
}
2.创建文件
import java.io.File;
import java.io.IOException;
public class FileDemo2 {
public static void main(String[] args) throws IOException {
/*
* 在当前目录下创建demo.txt文件 ;不能再没有的目录里创建文件,父目录不存在会报错
* 不写“./”就是默认在当前目录
*/
File file = new File("." + File.separator + "demo.txt");
/*
* 判断file表示的文件或目录是否存在
*/
if(! file.exists()){
boolean flag = file.createNewFile(); //没有判断也不会覆盖
System.out.println("创建成功" + flag);
}else{
System.out.println("创建失败");
}
}
}
3.删除文件
import java.io.File;
public class FileDemo3 {
public static void main(String[] args) {
/*
* 将当前目录中的demo.txt删除; 不会放入回收站
*/
File file = new File("demo.txt");
if(file.exists()){
file.delete();
System.out.println("文件已删除");
}else{
System.out.println("文件不存在");
}
}
}
4.创建一个目录
import java.io.File;
public class FileDemo4 {
public static void main(String[] args) {
/*
* 在当前目录下创建一级目录demo
*/
File file = new File("demo");
if(! file.exists()){
file.mkdir(); //mkdir只能创建一级目录,不能创建多级目录,也不报错
System.err.println("创建成功");
}else{
System.out.println("目录已经存在");
}
}
}
5.创建多级目录
import java.io.File;
import java.io.IOException;
public class Demo106_MKdir {
public static void main(String[] args) throws IOException {
File file=new File("D:/temp/java23");
//创建目录
System.out.println("创建目录"+file.mkdir());
//System.out.println(file.createNewFile());
File file1=new File("D:/temp/java1011/test/aaa/bbb");
System.out.println("创建多级目录"+file1.mkdirs());
}
}
6.删除目录
import java.io.File;
public class Demo105_Delete {
public static void main(String[] args) {
File file=new File("./test.txt");
if (file.exists()){
System.out.println("删除文件"+file.delete());
}else {
System.out.println("文件不存在");
}
}
}
7.获取一个目录的所有子项
import java.io.File;
public class FileDemo5 {
public static void main(String[] args) {
/*
* 获取当前目录中的所有内容
*/
File file = new File("D:/temp");
/*
* boolean isDirectory()
* 判断是不是目录
*/
if(file.isDirectory()){
/*
* File[] listFiles()
* 查看当前File表示的目录中的所有子项
* 每个子项以一个File对象表示,所有子项存入一个File对象数组,并返回
*/
File[] sub = file.listFiles();
for(File f : sub){
System.out.println(f.getName());
}
}
}
}
8.过滤一个目录中的部分子项
import java.io.File;
import java.io.FileFilter;
/**
* 获取一个目录中的部分子项
* File支持一个重载的listFile方法,要求传入一个文件过滤器FileFilter(是接口),这样只会返回该目录中满足该过滤器要求的子项
*/
public class FileDemo6 {
public static void main(String[] args) {
/*
* 仅仅获取文件
*/
File dir = new File("." );
System.out.println(dir);
File[] sub = dir.listFiles(
new FileFilter(){//内部类
@Override
public boolean accept(File file){
System.out.println("正在过滤:" +file.getName());
//return file1.isFile(); //获取文件,不要目录
//return file1.getName().endsWith(".pom"); //获取以".xml"结尾的文件
return file.getName().startsWith("."); //获取以"."开头的文件
}
}
);
for(File tmp : sub){
System.out.println(tmp.getName());
}
}
}
二、java.io.FileInputStream和java.io.FileOutputStream
输入流都有一个抽象父类:java.io.InputStream,他是所有字节输入流的父类。FileInputStream是InputStream的子类,是文件字节输入流,是一个低级流(节点流),InputStream及其子类只负责读文件,不负责写文件。
输出流都有一个抽象父类:java.io.OutputStream,他是所有字节输出流的父类。FileOutputStream是OutputStream的子类,是文件字节输出流,是一个低级流(节点流),OutputStream及其子类只负责写文件,不负责读文件。
1.FileInputStream读文件
import java.io.*;
public class Demo201_InputStream {
public static void main(String[] args) throws IOException {
FileInputStream inputStream=new FileInputStream("d:/temp/test/abc.txt");
byte[] bytes=new byte[100];
while (true){
int len= inputStream.read(bytes);
if (len==-1){
break;
}
for (int i = 0; i < len; i++) {
System.out.println(bytes[i]);
}
}
inputStream.close();
}
public static void main1(String[] args) throws IOException {
//1.创建一个输入流
FileInputStream inputStream=new FileInputStream("d:/temp/test/abc.txt");
// //2.
// File file=new File("d:temp/test/abc.txt");
// FileInputStream inputStream1=new FileInputStream(file);
while (true){
int bate = inputStream.read();
if (bate==-1){
break;
}
System.out.println(bate);
}
inputStream.close();
}
}
2.FileOutputStream写文件
import java.io.FileOutputStream;
import java.io.IOException;
public class Deno202_OutputStream {
public static void main(String[] args) throws IOException {
//创建一个输出流
FileOutputStream outputStream=new FileOutputStream("d:/temp/test/abc.txt");
outputStream.write(97);
outputStream.write(98);
outputStream.write(99);
outputStream.flush();
outputStream.close();
}
}
3.FileInputStream和FileOutputStream拷贝文件
import java.io.*;
import java.util.Scanner;
public class Demo208_Copy {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("请输入源文件路径");
Scanner scanner=new Scanner(System.in);
String filePath= scanner.nextLine();
File sourcefile=new File(filePath);
if (!sourcefile.exists()){
System.out.println("此源文件无效");
return;
}
System.out.println("请输入目标路径");
String targetPath= scanner.next();
File targetFile=new File(targetPath);
if (targetFile.exists()) {
System.out.println("目标文件已存在,请重新输入.");
return;
}
// 判断目标文件的父目录必须存在
if (!targetFile.getParentFile().exists()) {
System.out.println("目标文件的目录不正确.");
return;
}
try(FileInputStream inputStream=new FileInputStream(sourcefile);
FileOutputStream outputStream=new FileOutputStream(targetFile)) {
//读取源文件内容
byte[] bytes=new byte[1024];
while (true){
int len=inputStream.read(bytes);
if (len==-1){
break;
}
outputStream.write(bytes,0,len);
}
outputStream.flush();
System.out.println("复制成功"+sourcefile.getCanonicalPath()+"----->"+targetFile.getCanonicalPath());
} catch (IOException e) {
e.printStackTrace();
}
}
}