File对象常用方法
import java.io.File;
import java.io.IOException;
public class IOdemo {
public static void main(String[] args) throws IOException {
//1、创建一个文件对象的实例
File file=new File("E:\\下载\\a.txt");
//创建删除功能的方法
//文件不存在时,创建一个创建File指定的新的空文件
System.out.println(file.createNewFile());
//创建File指定的目录(如E:\\下载\\a目录)
System.out.println(file.mkdir());
//创建File指定的带父级的嵌套目录(如E:\\下载\\a目录\\a目录下的文件)
System.out.println(file.mkdirs());
//删除创建File指定的单个文件
System.out.println(file.delete());
// 获取属性相关方法
//返回此File的绝对路径名字字符串
System.out.println(file.getAbsoluteFile());//E:\下载\a.txt
//获取文件的所在目录
System.out.println(file.getPath());//E:\下载
//File的文件名称
System.out.println(file.getName());//a.txt
//文件长度
System.out.println(file.length());//0
//判断类的方法
System.out.println(file.exists());//预判文件是否存在
System.out.println(file.isDirectory());//判断是否是目录
System.out.println(file.isFile());//判断是否是文件
}
}
创建文件注意事项
1、所在目录不存在时
import java.io.File;
import java.io.IOException;
public class IOdemo {
public static void main(String[] args) throws IOException {
//1、创建一个文件对象的实例
File file=new File("E:\\下载\\A1\\a.txt");
//获取文件的所在的目录
System.out.println(file.getParent());
File f = new File("E:\\下载\\A1");
//先创建a.txt所在的文件夹,否不存在文件夹直接创建嵌套文件容易报错
f.mkdir();
file.createNewFile();
}
}
2、嵌套目录不存在时
import java.io.File;
import java.io.IOException;
public class IOdemo {
public static void main(String[] args) throws IOException {
//1、创建一个文件对象的实例
File file=new File("E:\\下载\\A1\\A2\\a.txt");
File parentFile = file.getParentFile();
//判断父路径是否存在
if(!parentFile.exists()){
//父路径不存在,创建父路径
parentFile.mkdirs();
}
//创建目标文件
file.createNewFile();
}
}
遍历和过滤文件
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
public class IOdemo {
public static void main(String[] args) throws IOException {
//1、创建一个文件对象的实例
File file=new File("E:\\下载\\A1");
//获取file目录中的所有子文件或目录
String[] fileNames = file.list();
for (String name : fileNames) {
//遍历出E:\下载\A1文件下的所有文件名字
System.out.println(name);
}
System.out.println("=====================");
//获取目录中的所有子文件或目录
File[] files = file.listFiles();
for (File f : files) {
//遍历出E:\下载\A1文件下的所有文件的绝对路径
System.out.println(f.getAbsolutePath());
}
System.out.println("=====================");
File[] arr = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
/**
* dir返回上级目录,name返回该文件夹下的文件名
* dir==>E:\下载\A1,name==>a.txt
* dir==>E:\下载\A1,name==>A2
*/
System.out.println("dir==>" + dir + "," + "name==>" + name);
if("A2".equals(name)){//过滤掉A2文件夹
return false;
}
return true;
}
});
//遍历过滤后的arr
for (File f : arr) {
System.out.println("@====>"+f.getName());
}
}
}
IO
使用java.io包下的内容,进行输入、输出操作
- in 输入(读) 硬盘->内存
- out 输出(写) 内存->硬盘
IO分类
根据数据的流向分为:输入流和输出流
- 输入流:把数据从其他设备上读取到内存中的流
- 输出流:把数据从内存中写出到其他设备上的流
根据数据的类型分为:字节流和字符流
- 字节流:以字节为单位,读取数据的流
- 字符流:以字符为单位,读写数据的流
体系
字节流
- 字节输入流 InputStream
FileInputStream: 文件字节输入流
使用案例:
import java.io.*;
public class IOdemo {
public static void main(String[] args) throws IOException {
//1、创建一个字节输出流对象,默认不写第二个参数是false,覆盖写,加上true是追加写
//不写路径是默认该项目的根路径
OutputStream out=new FileOutputStream("a.txt");//覆盖写
// OutputStream out=new FileOutputStream("E:\\下载\\A1\\a.txt",true);//追加写
//2、向流中写入数据,覆盖写
// out.write("大家好才是真的好\r\n".getBytes());//将字符串转为字节,使用\r\n换行回车
// out.write("大家好才是真的好\r\n".getBytes());//将字符串转为字节
// out.write(97);//数字会转为ASCII码
// out.write(65);
out.write("abcd".getBytes(),0,3);//从下标为0的为位置读取3个
//关闭流
out.close();
}
}
BufferedInputStream:字节缓冲输入流
使用案例:
import java.io.*;
/**
* 字节缓冲输入流
* 读取文件内容到内存中
*
*/
public class IOdemo {
public static void main(String[] args) throws IOException {
InputStream in =new BufferedInputStream(new FileInputStream("a.txt"));
byte[] bytes = new byte[1024];
int len=0;
while ((len=in.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
in.close();
}
}
- 字节输入流 OutoutStream
FileOutoutStream 文件字节输出流
使用案例:
import java.io.*;
public class IOdemo {
public static void main(String[] args) throws IOException {
//创建输入流对象
InputStream in= new FileInputStream("a.txt");
// System.out.println(in.read());//一次读取一个字节 -1表示读完了
// System.out.println(in.read());
// System.out.println(in.read());//-1读完了
byte[] bytes=new byte[1024];
// in.read(bytes);//将内容读取到传入的字节数组中
// System.out.println(new String(bytes));
int len=0;
while ((len=in.read(bytes))!=-1){
System.out.println("长度==="+len);
System.out.println("内容==="+new String(bytes,0,len));
}
//关闭流
in.close();
}
}
BufferedOutputStream:字节缓冲输出流
使用案例:
import java.io.*;
public class IOdemo {
public static void main(String[] args) throws IOException {
// OutputStream out = new BufferedOutputStream(new FileOutputStream("a.txt"));
OutputStream out = new BufferedOutputStream(new FileOutputStream("a.txt"),1);//当达到指定大小的时候自动刷新
out.write("Hello,world\r\n".getBytes());//并没有直接写入到文件,写入到了内存中的一个缓冲区
out.write("Hello,world\r\n".getBytes());//并没有直接写入到文件,写入到了内存中的一个缓冲区
out.write("Hello,world\r\n".getBytes());//并没有直接写入到文件,写入到了内存中的一个缓冲区
out.close();//调用close()方法的时候,会将缓冲区中的内容刷新到硬盘的目标文件,然后关闭流
}
}
使用字节输入输出流实现复制文件
import java.io.*;
public class IOdemo {
public static void main(String[] args) throws IOException {
long t1 = System.currentTimeMillis();//开启时间戳
//1.创建一个读取文件的字节输入流
InputStream in =new FileInputStream("E:\\下载\\A1\\a.txt");
//2.创建一个写入硬盘数据的字节输出流
OutputStream out=new FileOutputStream("E:\\下载\\A1\\A2\\a.txt");
byte[] bytes=new byte[1024];
int len=0;
while ((len=in.read(bytes))!=-1){
// System.out.println(len);
out.write(bytes,0,len);
}
//关闭输出流
out.close();
//关闭输入流
in.close();
long t2 = System.currentTimeMillis();//结束时间戳
System.out.println("文件复制成功,用时:"+(t2-t1)/1000+"秒");
}
}
使用字节缓冲流符复制文件
import java.io.*;
/**
*
* 使用字节缓冲流复制文件
*/
public class IOdemo {
public static void main(String[] args) throws IOException {
long t1 = System.currentTimeMillis();
//1.读取文件内容到内存
InputStream in = new BufferedInputStream(new FileInputStream("a.txt"));
//2.将读取的内容写入硬盘
OutputStream out = new BufferedOutputStream(new FileOutputStream("E:\\下载\\A1\\A2\\abc.txt"));
byte[] bytes=new byte[1024];
int len=0;
while ((len=in.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
out.write(bytes,0,len);
}
out.close();
in.close();
long t2 = System.currentTimeMillis();
System.out.println("文件复制成功,用时:"+(t2-t1)/1000+"秒");
}
}
字符流
- 字符输入流 Reader
FileReader 文件字符输入流
使用案例:
import java.io.*;
public class IOdemo {
public static void main(String[] args) throws IOException {
//1.创建一个字符输入流 一个中文汉字、字母、数字都是字符
//读文件不存在会报异常,写不会
Reader fr = new FileReader("a.txt");
// System.out.println(fr.read());//20013 一次读一个字符,输出字符对应的unicode编码
// System.out.println(fr.read());//65533 一次读一个字符,输出字符对应的unicode编码
// System.out.println(fr.read());//19978 一次读一个字符,输出字符对应的unicode编码
// System.out.println(fr.read());//28023 一次读一个字符,输出字符对应的unicode编码
// System.out.println(fr.read());//-1 读取结束
// char[] chars=new char[1024];
// System.out.println(fr.read(chars,0,1024));
// System.out.println(new String(chars,0,1024));
char[] chars=new char[10];
int len=0;//每次循环读取到的字符长度存储到该变量上
while ((len=fr.read(chars))!=-1){
System.out.print(new String(chars,0,len));
}
fr.close();
}
}
BufferedReader:字符缓冲输入流
使用案例:
import java.io.*;
/**
*
* 使用字符缓冲输入流
*/
public class IOdemo {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
String line="";
while ((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
}
}
- 字符输出流 Writer
FileWriter 文件字符输出流
import java.io.*;
public class IOdemo {
public static void main(String[] args) throws IOException {
//1.创建一个字符输出流 一个中文汉字、字母、数字都是字符
Writer fw=new FileWriter("b.txt");//覆盖写
// Writer fw=new FileWriter("b.txt",true);//追加写
//2.通过字符流想b.txt中写入内容
// fw.write("大家好才是真的好!");
// fw.write("大家好才是真的好",0,3);//从下标0开始,读3个
// fw.write("大家好才是真的好".toCharArray(),1,3); //字符串转成字符数组,从下标0开始,读3个
// fw.write("大家好才是真的好".toCharArray()); //全部
fw.write(97);//a
//3.关闭流
fw.close();
}
}
BufferedWriter:字符缓冲输出流
使用案例:
import java.io.*;
/**
*
* 使用字符缓冲输出流
*/
public class IOdemo {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("d.txt"));
bw.write("大家好才是真的好\r\n");
bw.write("大家好才是真的好");
bw.newLine();//换行
bw.write("大家好才是真的好");
bw.write("大家好才是真的好");
bw.close();
}
}
使用字符输入输出流复制文件
import java.io.*;
public class IOdemo {
public static void main(String[] args) throws IOException {
//1.创建字符文件输入流
Reader fr=new FileReader("E:\\下载\\A1\\a.txt");
//2.创建字符文件输出流
Writer fw = new FileWriter("E:\\下载\\A1\\A2\\a.txt");
char[] chars=new char[10];
int len=0;//每次循环读取到的字符长度存储到该变量上
while ((len=fr.read(chars))!=-1){
fw.write(chars,0,len);
}
fw.close();
fr.close();
}
}
字节字符转换流
InputStreamReader 输入 硬盘(字节流)–>内存(字符流)
使用案例:
import java.io.*;
import java.nio.charset.Charset;
/**
*
* 将输入到内存的字节输入流转换成字符输入流 字节(看不懂)-->字符(看得懂)
*
*/
public class IOdemo {
public static void main(String[] args) throws IOException {
/**
*
* 第一种方式
//需要传入一个字节输入流
//InputStreamReader isr = new InputStreamReader(new FileInputStream("a_GBK.txt"));
//以指定的字符编码读取文件内容,和读取的文件格式编码一致
InputStreamReader isr = new InputStreamReader(new FileInputStream("a_GBK.txt"),"GBK");
char[] chars=new char[1024];
int len=0;//存储读取到的字符个数
while ((len=isr.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
isr.close();
*/
/**
* 第二种方式
*
*/
//以字节流的方式读取a.GBK
InputStream in = new FileInputStream("a_GBK.txt");
byte[] bytes=new byte[1024];
int len=0;//存储读取到的字节个数
while ((len=in.read(bytes))!=-1){
// System.out.println(new String(bytes,0,len,"GBK"));//不写默认utf-8
System.out.println(new String(bytes,0,len, Charset.forName("GBK")));//不写默认utf-8
}
in.close();
}
}
OutputStreamWriter 输出 内存(字节流)–>硬盘(字符流)
使用案例:
import java.io.*;
/**
*
* 将输入到内存的字节输入流转换成字符输入流 字节(看不懂)-->字符(看得懂)
*
*/
public class IOdemo {
public static void main(String[] args) throws IOException {
//将内存中的字符流数据以字节流的形式写入到文件 字符-->字节
//以指定格式输出
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("c_GBK.txt"),"GBK");
osw.write("大家好才是真的好");
osw.close();
}
}
序列化
1.序列化
- 将java中的对象内容转化成字节数据的过程 java对象(内存)–>字节 字节输出流
2.反序列化
- 将对象的字节数据转换成java对象的过程 java对象(硬盘)–>字节 字节输入流
3.持久化