1、File对象
File 类 就是当前系统中文件或者文件夹的抽象表示 ,通俗的讲就是使用File对象,来操作我们电脑系统中的文件或者文件夹。
File类 其实就是通过file对象,我们可以对系统中的文件或是文件夹进行增加、删除、修改、查询的操作。
2、File对象的使用
2.1 创建File对象
在创建File对象前我们要准备好要操作的文件夹,然后创建File对象。
在创建对象时,要注意的是,不同的系统它的目录层级是不同的 。在window系统下层级分割符为\ ,但是在linux和mac系统上分割符为 /。
但是Java语言是一种跨平台的语言。我们在window系统上做开发,但是我们项目部署在linux系统上。这样使我们的代码能在任意系统下来用。
对于分隔符我们有两种解决办法
(1)第一种 因为window 兼容 / 和 \
(2)第二种 File.separator根据当前代码所在得系统自动获取相应得分割符 3
public static void main(String[] args) {
//创建一个File对象 并指定文件得路径 \转移字符串
//第一种Windows通用两种分隔符
File file01 = new File("D:\\AAA\\aaa.txt");
File file02 = new File("D:/AAA/bbb.txt");
// 第二种 File.separator根据当前代码所在得系统自动获取相应得分割符
System.out.println(File.separator); // \因为我们当前在window下
File file03 = new File("D:"+File.separator+"AAA"+File.separator+"ccc.txt");
}
2.2 添加文件
//创建文件对象
File file = new File("F:/AAA/a.txt");
//添加文件操作
file.createNewFile();
File file2 = new File("F:/AAA/bbb");
file2.mkdir();//创建单层文件夹
File file3 = new File("F:/AAA/bbb/ccc");
file3.mkdirs();//创建多层文件夹
2.3 删除操作
//创建文件对象
File file = new File("F:/AAA/a.txt");
//删除操作
file.delete();//删除文件,同时可以删除空的文件夹
file3.deleteOnExit();//程序退出时删除文件
2.4 修改文件
//创建文件对象
File file = new File("F:/AAA/a.txt");
//创建文件对象
File file = new File("F:/AAA/a.txt");
//修改操作
file.setReadable(false);//修改能否打开文件的权限
file.setWritable(false);//修改能否修改文件中的内容的权限
file.setReadOnly();//修改文件为只读
file.renameTo(new File("D:/AAA/aaa.txt"));//给文件重命名
2.5 查询文件
//创建文件对象
File file = new File("F:/AAA/a.txt");
//查询操作
String name = file.getName();//获取文件名称
String parent = file.getParent();//获取父级的名称
String path = file.getPath();//获取路径
System.out.println(name + " "+ parent+" "+path);
boolean f1 = file.isFile();//是否为文件类型
boolean f2 = file.isDirectory();//是否为文件夹类型
System.out.println(f1 + " "+f2);
3、IO流
3.1 IO流概念
IO( I: Input 输入 O: Output 输出)流,是一种计算机用语。主要是用于处理数据的传输。
输入流:程序对文件中内容进行读取操作,就是读取文件的内容。
输出流:程序对文件的内容进行写入操作,就是往文件中写入内容。
3.2 IO流的分类
(1)根据流的方向:
---输入流: 程序可以从中读取数据的流。
---输出流: 程序能向其中写入数据的流。
(2)根据流的单位:
---字节流: 以字节为单位传输数据的流
---字符流: 以字符为单位传输数据的流
(3)根据功能
---节点流: 直接和文件进行交互
---处理流: 不是直接作用在文件上。
四个基本的流: 其他的流都是在这四个流的基础上进行扩展的
字节输入流
字节输出流
字符输入流
字符输出流
3.3 字符输出流——Writer
Writer字符输出流它是所有字符输出流的根类,主要实现类为FileWriter。
FileWriter使用步骤:
1)创建FileWriter对象,并指定要操作文件的路径。
2)使用write方法进行写入操作。
3)写入操作完成后,必须使用flush()方法刷新和close()关闭流资源。
注:每次使用write方法往文件中写入内容时,都会覆盖文件中原有的内容。如果想追加内容,就在创建对象时在构造方法中,传一个true,这样就是追加内容,不是覆盖了。
Writer writer =new FileWriter("F:/AAA/a.txt");
writer.write("今天真是个好天气");
writer.flush(); //刷新流
writer.close(); //关闭流资源
Writer writer1=new FileWriter("F:/AAA/a.txt",true);//可追加文字,不会覆盖
writer1.write("很适合出去玩耍呢!!");
writer1.flush(); //刷新流
writer1.close(); //关闭流资源
3.4 字符输入流——Reader
Reader字符输入流数所有字符输入流的根类,主要的实现类为FileReader。
FileReader主要方法,read()方法。读取下一个文件中的字符,返回的是字符对应的ASSIC码,如果没有下一个,返回的是-1。
read(char [ ] )这个方法,读取多个字符并存储在传入的数组中,返回的是读取了几个字符(int类型)。
Reader reader = new FileReader("F:/AAA/a.txt");
int count =0;
char [] dataArr = new char[10];
while ((count = reader.read(dataArr))!=-1){
System.out.println(new String(dataArr,0,count));
}
来利用字符流实现复制功能
@Test
public void test() throws Exception {
//创建输入流对象
FileReader fr = new FileReader("F:/AAA/a.txt");
//创建输出流对象
FileWriter fw =new FileWriter("F:/AAA/e.txt");
int count = 0;
char [] cs = new char[5];
while( (count=fr.read(cs)) !=-1 ){
fw.write(cs,0,count);
fw.flush(); //刷新
}
fw.close();
fr.close();
}
由此可见字符流只能对文件的文本进行操作,不能对图片、视频、压缩包等文件进行操作。
3.5 字节输出流——OutputStream
字节流在操作文件时,是将文件转换成以字节为单,所以它可以对任意类型的文件进行操作。OutputStream时都有字节输出流的父类,他是一个抽象类无法实例化对象,我们常用的实现类为FileOutputStream。
@Test
public void test2() throws IOException {
//创建字节流对象
OutputStream os=new FileOutputStream("F:/AAA/d.txt");
String str="大家好,我是张三!!";
//创建数组,将字符串转换成字节
byte[] bytes = str.getBytes();
os.write(bytes);
os.flush();//刷新
os.close();//关闭
}
3.6 字节输入流——InputStream
与字节输出流同理,字节输入流也可以对所有的文件进行操作,它作为所有字节输入流的父类,是一个抽象类所以无法创建对象,我们常用的字节输入流为:FileInputStream
@Test
public void test3() throws IOException {
//创建输入流对象
InputStream is = new FileInputStream("F:/AAA/d.txt");
//创建数组,用来存放读取的字节
byte [] bytes =new byte[3];
int count=0;
//读取的字节存入数组中
while( (count=is.read(bytes))!=-1 ){
//转换成字符串,并输出
String str=new String(bytes,0,count);
System.out.print(str);
}
is.close();
}
利用输入流实现文件的复制功能
@Test
public void testCopy() throws Exception{
//1.创建字节输入流 视频
InputStream is=new FileInputStream("D:/AAA/1.jpg");
//2.字节输出流
OutputStream fos=new FileOutputStream("C:/AAA/2.jpg");
byte[] bytes=new byte[10];
int c=0;
while( (c=is.read(bytes)) !=-1 ){
fos.write(bytes,0,c);
}
is.close();
fos.close();
}
3.6 缓存流
缓存流是在基础流[InputStream OutputStream Reader Writer]之上 添加了一个缓存池功能。即无论时在输入或是输出时,将数据存在缓存池中,并不是直接作用于文件上,这样对于频繁使用IO流的程序来说可以提高IO流的效率,减少IO流次数。
@Test
public void TestBuffer() throws Exception{
OutputStream out=new FileOutputStream("D:/AAA/g.txt");
BufferedOutputStream bos=new BufferedOutputStream(out);//缓存流要作用再基础流上
String str="abcdefhijglmn";
byte[] bytes = str.getBytes();
bos.write(bytes);
//bos.flush();//刷新缓存池---把池子中的内容输入到文件上
bos.close(); //关闭----先刷新缓冲池 再关闭流资源
}
如果在程序中没有刷新缓存池或是没有关闭流资源,在程序运行结束后,在文件中是看不到所写的内容的,因为你写的内容,暂时放入缓存池中 ,并没有直接放入文件中。 所以文件中没有你的内容。 因此,在程序运行结束时,必须关闭流资源。
3.7 对象流
在上面的IO流中都是对文件中的数据进行读写操作,而对象流,是对Java对象进行的读写操作。将Java对象进行读写操作意义在于,持久化信息。实例应用中:游戏的读档和存档
1. 序列化: 把内存中的java对象存储到磁盘[网盘]的过程。
---java对象所属的类必须实现序列化接口.implements Serializable
2. 反序列化: 把磁盘中的内容读取到java对象内存中的过程。
1、对象输出流——ObjectOutputStream
@Test //存档:----序列化:
public void testObjectStream() throws Exception{
OutputStream os=new FileOutputStream("F:/AAA/ccc/b.txt");
//对象输出流
ObjectOutputStream oos=new ObjectOutputStream(os);
//使用对象输出流调用输出方法 输出的类对象 该类必须实现Serializable 序列化接口
People people=new People("张三",23,"男","打游戏、打篮球、打乒乓球");
oos.writeObject(people);
oos.close();
}
2、对象输入流——ObjectInputStream
@Test //读档: ----反序列化:
public void testObjectStream2()throws Exception{
InputStream input=new FileInputStream("F:/AAA/ccc/b.txt");
ObjectInputStream ois=new ObjectInputStream(input);
Object o = ois.readObject();
System.out.print(o);
ois.close();
}
4、总结
字符流:我们是对文件中的字符串进行操作。字符流只能对文本文件进行读取操作。
字节流:字节流可以将文件内容转化为字节,所以字节流可以定义任意的文件类型进行操作。
缓存流:缓存流是在基础流的基础上添加了缓存池的功能,即读取的内容先存在缓存池中,当程序执行完毕是,再将内容写进文件中,减少了IO操作次数。
对象流:对象流是对Java对象进行读取操作,即序列化和反序列化。
注:再每种流使用完毕后都必须要进行关闭流资源操纵。