File类(表示文件)
我们要在java程序中操作硬盘上的文件,首先需要在程序中表示一个对应的文件.
一个File类的对象表示硬盘上的一个文件或目录(文件夹)
/*
一个File类的对象,表示一个文件或目录
new File("String类型的文件名 可以是相对路径,也可以是绝对路径");
new File(父级,子级);
*/
/* File f1 = new File("E:/demo.txt");
System.out.println(f1.length());*/
/* String p = "E:/";
File f1 = new File(p,"demo.txt");
File f2 = new File(p,"demo1.txt");*/
操作方法:
判断功能
File f1 = new File("E:/demo.txt");
System.out.println(f1.canWrite());//是否可以写
System.out.println(f1.canRead());//是否可以读
System.out.println(f1.exists());//是否存在
System.out.println(f1.isHidden());//是否隐藏
System.out.println(f1.isFile());//是不是文件
System.out.println(f1.isDirectory());//是不是文件夹
System.out.println(f1.isAbsolute());//是不是绝对路径
获取功能
File f1 = new File("E:/demo.txt");
System.out.println(f1.length());//文件的长度(以字节为单位的)
System.out.println(f1.lastModified());//最后一次修改的时间 1644456727960
System.out.println(new Date(1644456727960L));
System.out.println(f1.getParent());
System.out.println(f1.getName());
System.out.println(f1.getAbsolutePath());
/* File f2 = new File("IO");//相对路径
System.out.println(f2.getAbsolutePath());//获取文件的绝对路径*/
File f2 = new File("E:/api"); //这表示的是一个文件夹
//获取 api目录下所有的文件和文件夹,返回的都是文件名的字符串形式
/* String[] fs = f2.list();
for (String fn : fs){
System.out.println(fn);
}*/
//获取 api目录下所有的文件和文件夹,返回的是文件对象
//File[] fs = f2.listFiles();
//文件筛选
File[] fs = f2.listFiles( (dir,name)->{ return name.endsWith("chm"); });
for (File fn : fs){
System.out.println(fn);
}
创建,删除功能
/* File f1 = new File("E:/demo2.txt");
try {
f1.createNewFile();//创建一个新的文件,前提是文件不存在
} catch (IOException e) {
e.printStackTrace();
}*/
// f1.delete(); 删除文件
//File f = new File("E:/a");
File f = new File("E:/a");
//f.mkdir();//创建一个文件夹,只能创建一级
//f.mkdirs();创建文件夹,可以创建多级目录
f.delete();//delete在删除文件时,一次只能删除一级目录,且目录中为空
File类只能表示文件,不能对文件内容进行读写操作
I(input) O(output) 输入和输出
按照读写的单位分为:
字节流(一次读写一个字节): 使用的多 图片,视频,音频,exe...
字节输入流 从硬盘向程序中读数据
InputStream
字节输出流 从程序中向硬盘上写数据
OutputStream
//需求,把E:/demo.txt ---> F:/demo.txt
//创建一个输入流管道,为其指定输入的文件, 输入流要求文件是存在的,否则会报错
FileInputStream in = new FileInputStream(new File("E:/demo.txt"));
//创建一个输出流管道,为其指定输出的文件,输出文件可以不存在,会自动创建
FileOutputStream out = new FileOutputStream(new File("F:/demo.txt"));
//int b = in.read();//从文件中读数据,一次读一个字节,文件内容读完后返回-1.
int b=0;
while( (b=in.read())!=-1){
out.write(b);
}
in.close(); //关闭流通道,释放文件
out.close();
//需求,把E:/demo.txt ---> F:/demo.txt
//创建一个输入流管道,为其指定输入的文件, 输入流要求文件是存在的,否则会报错
FileInputStream in = new FileInputStream(new File("E:/demo.txt"));
//创建一个输出流管道,为其指定输出的文件,输出文件可以不存在,会自动创建
FileOutputStream out = new FileOutputStream(new File("F:/demo.txt"));
//read() 一次只读取一个字节,并返回结果, a-97 , 读完返回-1 效率低
//read(byte[] b) 一次读取一个byte数组个字节内容,返回数组中实际装入内容的长度,读完返回-1
//44个字节 数组长度是10
byte[] b = new byte[10];
int size = 0; //实际向数组中读到的内容长度, 主要是最后一次的实际数量
while((size=in.read(b))!=-1){
// write(装内容的数组,数组的第0个位置开始,size,实际写出的长度); 最后一次之后4个字节,向外只写4个即可
out.write(b,0,size);
}
in.close();
out.close();
节点流和处理流
节点流: FileInputStream,FileOutputStream
流对象中封装的是的数据源. 直接用来读文件的
处理流:BufferedInputStream,BufferedOutputStream(提供内部缓冲区功能) ObjectInputStream,ObjectOutputStream
流对象中包含的是其他流对象,可以提供一些其他操作.
//需求,把E:/demo.txt ---> F:/demo.txt
//节点流
FileInputStream in = new FileInputStream(new File("E:/feige.exe"));
//处理流
BufferedInputStream bin = new BufferedInputStream(in);
//节点流
FileOutputStream out = new FileOutputStream(new File("F:/feige.exe"));
//处理流
BufferedOutputStream bout = new BufferedOutputStream(out);
byte[] b = new byte[10240];//数组的大小一定看具体的情况,不是越大越好 数组是在内存中存储的
int size = 0;
while((size=bin.read(b))!=-1){
bout.write(b,0,size);//虽然每次调用了write方法,但是不一定每次都会真正写出
}
bin.close();
bout.flush();//刷新缓冲区
bout.close();
字符流(一次读写一个字符):只能读纯文本文件 txt java c
字符输入流 Reader
InputStreamReader 转换流 把原始的字节转为字符 将1个中文的3个字节转为一个字符编码
FileReader
/*
字符流可以一次直接读取到一个字符内容
1个汉字三个字节组成,直接可以读到
*/
FileReader reader = new FileReader(new File("E:/demo.txt"));
FileWriter writer = new FileWriter(new File("E:/demo1.txt"));
int c = 0;
while((c=reader.read())!=-1){
writer.write(c);
}
/*
char[] c = new char[10];
int size = 0;
while((size=reader.read(c))!=-1){
writer.write(c, 0, size);
}
*/
reader.close();
writer.close();
字符输出流 Writer
OutputStreamWriter
FileWriter
字符处理流:BufferedReader,BufferedWriter 提供对数据的缓冲功能
FileReader reader = new FileReader(new File("E:/demo.txt"));
BufferedReader breader = new BufferedReader(reader);
FileWriter writer = new FileWriter(new File("E:/demo1.txt"));
BufferedWriter bwriter = new BufferedWriter(writer);
//breader.readLine();//一次读一行数据,没有数据了,返回null
String line=null;
while((line=breader.readLine())!=null){
bwriter.write(line);//一次写出一个字符串
bwriter.newLine();//写出一个换行符
}
breader.close();
bwriter.flush();
bwriter.close();
print流
没有输入,只是从程序中向外输出
PrintStream 打印字节流
PrintWriter 打印字符流 百度搜索 输入信息 点击百度按钮,向服务器端发送数据,服务器端搜索,将搜索到的内容响应到浏览器
对象输入,输出流(对象序列化和对象反序列化)
就是把程序运行时所产生的对象信息(内存中存储) 输出到一个文件中(实现对象信息的持久化保存) 称为对象序列化
例如系统升级,停止服务器, 可以将一些对象保存到硬盘中, 服务器启动,从文件中读取信息.
从文件中 将对象信息读取到内存中, 称为反序列化(重新创建一个对象) (也是java中创建对象的一种方式)
/* //程序运行时产生两个对象
String s = new String("abc");
Date date = new Date();
// 使用对象输出流 将对象信息输出到文件中, 称为对象序列化
FileOutputStream out = new FileOutputStream(new File("E:/object.txt"));
ObjectOutputStream objout = new ObjectOutputStream(out);
objout.writeObject(s);
objout.writeObject(date);
objout.flush();
objout.close();*/
//对象输入流读取文件中的对象信息 反序列化
FileInputStream in = new FileInputStream(new File("E:/object.txt"));
ObjectInputStream objin = new ObjectInputStream(in);
String s = (String)objin.readObject();
Date date = (Date)objin.readObject();
System.out.println(s);
System.out.println(date);
objin.close();