File基础应用
import java.io.File;
/*
* java.io.File
* File用来表示硬盘上的一个文件或目录(本质是表示一个抽象路径)
* 作用:
* 访问其表示的文件或目录的属性信息
* 创建和删除文件或目录
* 访问一个目录中的所有子项
* 注意:
* File不能访问文件数据。
*/
public class FileDemo01 {
public static void main(String[] args) {
// File file = new File("D:/idea/items/JsdSe/demofile.txt"); //绝对路径
File file = new File("./demofile.txt"); //相对路径,其中./表示当前项目目录下
System.out.println(file.length()); //文件字节数
System.out.println(file.getName()); //获取文件名字
System.out.println(file.canRead()); //文件是否可读
System.out.println(file.canWrite()); //文件是否可写
System.out.println(file.isHidden()); //文件是否隐藏
}
}
创建文件
createNewFile()方法
import java.io.File;
import java.io.IOException;
/*
* 创建文件
*/
public class CreatNewFileDemo {
public static void main(String[] args) throws IOException {
File file = new File("./test.txt");
if (file.exists()) { //判断文件是否存在
System.out.println("文件已存在");
}else {
file.createNewFile(); //创建文件
System.out.println("创建成功");
}
}
}
删除文件
delete()方法
import java.io.File;
/*
* 删除文件
*/
public class DeleteFileDemo {
public static void main(String[] args) {
File file = new File("./test.txt");
if (file.exists()) { //判断文件是否存在
file.delete();
System.out.println("删除成功");
}else {
System.out.println("文件不存在");
}
}
}
创建目录
mkdir()方法
import java.io.File;
/*
* 创建目录
*/
public class MkDirDemo {
public static void main(String[] args) {
//File file = new File("iml");
File file = new File("iml/impl/impo");
if (file.exists()) {
System.out.println("目录已存在");
}else {
/*
* mkdir()创建目录是要求该目录所在的目录必须存在,否则无法创建
* mkdirs()创建目录时会将所有不存在的父目录一同创建出来,推荐使用.
*/
// file.mkdir(); //创建目录
file.mkdirs(); //创建所有不存在的目录
System.out.println("目录创建成功");
}
}
}
访问目录所有子项
import java.io.File;
import java.io.FileFilter;
/*
* 访问一个目录中所有子项
*/
public class ListFilesDemo {
public static void main(String[] args) {
File file = new File("./src/main/java/com/example/filetest");
extracted2(file);
}
private static void extracted2(File file) {
if (file.isDirectory()) {
/*
* 过滤器
*/
FileFilter filter = (File pathname)->{
return pathname.getName().contains("M");
};
File[] files = file.listFiles(filter);
System.out.println(files.length);
for (File f:files
) {
System.out.print(f.getName() + " ");
}
}
}
private static void extracted1(File file) {
/*
* 查询该目录下有多少个子项
*/
File[] files = file.listFiles();
System.out.println(files.length);
for (File f:files
) {
System.out.print(f.getName() + " ");
}
}
private static void extracted(File file) {
if (file.isDirectory()) { //判断是否为目录
// System.out.println(file.getName() + "是一个目录");
/*
* 过滤器
*/
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File pathname) {
/*
* getName()获取经过过滤器元素的名字,
* indexOf("F")判断是否有F
*/
// return pathname.getName().indexOf("F") != -1;
return pathname.getName().contains("F");
}
};
/*
* 查询该目录下有多少个子项
*/
File[] files = file.listFiles(filter);
System.out.println(files.length);
for (File f:files
) {
System.out.print(f.getName() + " ");
}
}
}
}
I/O流
输出流写文件
import java.io.FileOutputStream;
import java.io.IOException;
/*
* Java IO
* I:INPUT 输入
* O:OUTPUT 输出
* Java用方向输入与输出划分读写操作,其中输入用来读取,输出用来写入
* java.io.InputStream 输入流,是所有输入流的超类,定义了读取字节的相关方法
* java.io.OutputStream 输出流,是所有输出流的超类,定义了写出字节的相关方法。
*
* 文件流:
* java.io.FileInputStream 继承自InputStream
* java.io.FileOutputStream 继承自OutputStream
* 是专门用来连接程序与文件直接爱你的管道,用来读写文件数据的流
*/
public class FosDemo {
public static void main(String[] args) throws IOException {
/*
* 向文件写入字节
*/
FileOutputStream fos = new FileOutputStream("./fos.dat");
/*
* java.io.OutputStream定义写操作
* void write(int d)
* 出一个字节,写出的给定的int值对应的2进制的低8位
*/
fos.write(1);
System.out.println("写出完毕");
fos.close(); //关闭流
}
}
输入流读文件
/*
* 用文件输入流读取文件数据
*/
public class FisDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("./fos.dat");
/*
* java.io.FileInputStream定义了读取字节方法
* read()读取一个字节(8位2进制),以int型表示(将读取的字节存入该int值最低八位上),
* 并将其返回.如果返回的int值表示整数-1则表示流读取到了末尾.
* 读取到的数据存在低8位上,高8位2进制全部补0
*/
int r1 = fis.read(); //读取第一个字节
int r2 = fis.read(); //再次调用读取第二个字节,如果没有字节则输出-1
System.out.println(r1+" "+r2);
fis.close();
}
}
文件复制
单字符复制
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 文件复制
*/
public class CopyDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("./310792.jpg");
FileOutputStream fos = new FileOutputStream("./image.jpg");
int rs;
long start = System.currentTimeMillis(); //读取运行开始的时间
while ((rs = fis.read()) != -1) {//判断文件是否结束
fos.write(rs); //将读取出来的字节复制给新文件
}
long end = System.currentTimeMillis(); //读取运行结束的时间
System.out.println("复制完成" + " " + (end-start));
fis.close(); //关闭流
fos.close();
}
}
public class TimeDemo {
public static void main(String[] args) {
/*
* long返回的是1970年1月1日0时0分0秒后的毫秒值
*/
long now = System.currentTimeMillis();
System.out.println(now);
System.out.println(now/1000/60/60/24/365 + 1970);
}
}
块读写
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 在InputStream OutputStream两个超类上定义了块读写操作
* 在InputStream上定义的快读取:
* int read(byte[] data)
* 一次性将给定所有数读出
* 在OutputStream上定义的快写操作:
* int read(byte[] data)
* 一次性将给定所有数写入
* void write(byte b[], int off, int len)
* 一次性将给定的字节数组data从下标off连续读取len个数据写入
*
*/
public class CopyDemo2 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("./310792.jpg");
FileOutputStream fos = new FileOutputStream("./image.jpg");
byte[] data = new byte[1024*10]; //声明一个10240的字节数组 10kb
int rs; //每次实际读取到的字节量
long start = System.currentTimeMillis(); //读取运行开始的时间
while ((rs = fis.read(data)) != -1){
fos.write(data,0, rs);
}
long end = System.currentTimeMillis(); //读取运行结束的时间
System.out.println("Copy成功" + " " + (end-start));
fis.close();
fos.close();
}
}
向文本中写入文本数据
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/*
* 向文本中写入文本数据
*/
public class WriteStringDemo {
public static void main(String[] args) throws IOException {
/*
* 文件流的构造器
* FileOutputStream(String name) FileOutputStream(File file)
* 以上两个构造器创建文件流时,为“覆盖模式”
* 特点:
* 如果指定文件不存在会自动创建
* 如果文件存在,该文件会自动清除所有数据,然后将通过这个流写出的数据全部保留在文件当中
* FileOutputStream(String name, boolean append)
* 当append为true时,文件流采取追加模式
* 特点:
* 如果指定文件不存在会自动创建
* 如果文件存在,该文件会保留之前数据,然后将通过这个流写出的数据全部追加在之前数据后
* 将其保留在文件当中
*/
FileOutputStream fos = new FileOutputStream("./demofile.txt",true);
/*
* UTF-8 万国码
* 英文,数字,符号每个字符各占2个字节
* 中文每个字符占3个字节
* getBytes()
* 将一组字符串转换成一组字节
*/
// String line = "这是中文写入文本测试";
// byte[] bytes = line.getBytes(StandardCharsets.UTF_8); //将String转为UTF-8编码
// fos.write(bytes);
fos.write("这是第二次中文写入文本测试".getBytes(StandardCharsets.UTF_8));
System.out.println("写入成功");
fos.close();
}
}