JavaIO流
java中的变量、数组、对象、集合它们都是内存中的数据容器,它们记住的数据,在断电,或者程序终止时会丢失,故要使用到文件。
- 文件是非常重要的存储方式,在计算机硬盘中
- 即使断电,或者程序终止了,存储在硬盘文件中的数据也不会丢失
Flie
- File是java.io.包下的类,File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹)。
- 注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据。
IO流
- 用于读写数据的(可以读写文件,或者网络中的数据...)
1.File类
1.创建File类的对象
方法:
- public File(String pathname) :根据文件路径创建文件对象
- public File(String parent,String child):根据父路径和子路径名字创建文件对象
- public File(File parent,String child):根据父路径对应文件对象和子路径名字创建文件对象
注意:
- File 对象既可以代表文件、也可以代表文件夹
- File 封装的对象仅仅是一个路径名,这个路径可以是存在的,也允许时不存在的
绝对路径:带盘符的
File f3 = new File("C:\\Users\\17595\\Desktop\\java\\JavaProject\\JavaSE\\basic-grammar\\src\\yehuan.txt");
相对路径:不带盘符,默认直接到当前工程下的目录寻找文件。
new File("模块名 \\src\\yehuan.txt");
代码演示:
package com.IO.File;import java.io.File;public class FileTest1 {public static void main(String[] args) {//1.创建一个Flie对象,指代某个具体的文件//路径分隔符(File.separator 可以自适应系统的路径分隔符 --- 跨平台)//File f1 = new File("C:\\Users\\17595\\Desktop\\java\\resource\\ab.txt");//File f1 = new File("C:/Users/17595/Desktop/java/resource/ab.txt");File f1 = new File("C:"+File.separator+"Users"+File.separator+"17595"+File.separator+"Desktop"+File.separator+"java"+File.separator+"resource"+File.separator+"ab.txt");System.out.println(f1.length());//文件大小//注意:File对象可以指代一个不存在的文件路径File f2 = new File("C:/Users/17595/Desktop/java/resource/aaaa.txt");System.out.println(f2.length());//0System.out.println(f2.exists());//false(判断文件路径是否存在)//我现在要定位的文件是在模块中,应该怎么定位呢?//绝对路径:带盘符的// File f3 = new File("C:\\Users\\17595\\Desktop\\java\\JavaProject\\JavaSE\\basic-grammar\\src\\yehuan.txt");//相对路径(重点):不带盘符,默认是直接去工程下寻找文件的//new File("模块名 \\src\\yehuan.txt");File f3 = new File("basic-grammar\\src\\yehuan.txt");System.out.println(f3.length());}
}
2.常用方法
判断文件类型、获取文件信息:
- public boolean exists() : 判断当前文件对象,对应的文件路径是否存在,存在返回true,不存在返回false。
- public boolean isFile() : 判断当前文件对象指代的是否是文件,是文件返回true,反之。
- public boolean isDirectory() : 判断当前文件对象指代的是否为文件夹
- public String getName(): 获取文件的名称(包含后缀)
- public long length() : 获取文件大小,返回字节个数
- public long lastModified() : 获取文件的最后修改时间。
- public String getPath() : 获取创建文件对象时,使用的路径
- public String getAbsolutePath() : 获取绝对路径
package com.IO.File;import java.io.File;
import java.text.SimpleDateFormat;
import java.util.SimpleTimeZone;public class FlieTest02 {public static void main(String[] args) {//1. 创建文件对象,指代某个文件File f1 = new File("C:\\Users\\17595\\Desktop\\java\\resource\\ab.txt");//2.public boolean exists() : 判断当前文件对象,对应的文件路径是否存在,存在返回true,不存在返回false。System.out.println(f1.exists());//3.public boolean isFile() : 判断当前文件对象指代的是否是文件,是文件返回true,反之。System.out.println(f1.isFile());//4.public boolean isDirectory() : 判断当前文件对象指代的是否为文件夹System.out.println(f1.isDirectory());//5.public String getName(): 获取文件的名称(包含后缀)System.out.println(f1.getName());//6.public long length() : 获取文件大小,返回字节个数System.out.println(f1.length());//7.public long lastModified() : 获取文件的最后修改时间。long time = f1.lastModified();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(sdf.format(time));//8.public String getPath() : 获取创建文件对象时,使用的路径System.out.println(f1.getPath());//9.public String getAbsolutePath() : 获取绝对路径System.out.println(f1.getAbsolutePath());}
}
创建文件、删除文件:
- public boolean creatNewFile(): 创建一个新文件(文件内容为空),创建成功返回true,反之。
- public boolean mkdir() : 用于创建文件夹,注意:只能创建一级文件夹
- public boolean mkdir() : 用于创建文件夹,注意:可以创建多级文件夹
- public boolean delete() : 删除文件、或者空文件,注意:不能删除非空文件。
注意:delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站
package com.IO.File;import java.io.File;
import java.io.IOException;public class FileTest03 {public static void main(String[] args) throws Exception {//1.public boolean creatNewFile(): 创建一个新文件(文件内容为空),创建成功返回true,反之。File f1 = new File("C:\\Users\\17595\\Desktop\\\\java\\resource\\yehuan.txt");System.out.println(f1.createNewFile());//会出现异常,直接抛异常//2.public boolean mkdir() : 用于创建文件夹,注意:只能创建一级文件夹File f2 = new File("C:/Users/17595/Desktop/java/resource/abc");System.out.println(f2.mkdir());//3.public boolean mkdir() : 用于创建文件夹,注意:可以创建多级文件夹File f3 = new File("C:/Users/17595/Desktop/java/resource/aaa//bbb/ccc");System.out.println(f3.mkdirs());//4.public boolean delete() : 删除文件、或者空文件,注意:不能删除非空文件。System.out.println(f1.delete());}
}
遍历文件夹:
- public String[] list(): 获取当前目录下所有的“一级文件名称” 到一个字符串数组中去返回
- public File[] listFiles(): (重点) 获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回(重点)
使用listFiles方法时的注意事项:
- 当主调是文件,或者路径不存在时,返回null
- 当主调是空文件夹时,返回一个长度为0的数组
- 当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在Flie数组中返回
- 当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径的路径放在数组中返回,包含隐藏文件
- 当主调是一个文件夹,但是没有权限访问该文件时,返回null
package com.IO.File;import java.io.File;public class FileTest04 {public static void main(String[] args) {//1. public String[] list(): 获取当前目录下所有的“一级文件名称” 到一个字符串数组中去返回File f1 = new File("C:/Users/17595/Desktop/java/resource");String[] name = f1.list();for (String str : name) {System.out.println(str);}//2. public File[] listFiles(): (重点) 获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回(重点)File[] files = f1.listFiles();for (File file : files) {System.out.println(file.getAbsoluteFile());}}
}
案例:目标:改变某个文件夹下视频的序号,要求从19开始:
package com.IO.File;import java.io.File;//目标:改变某个文件夹下视频的序号,要求从19开始
public class Test {public static void main(String[] args) {File dir = new File("C:/Users/17595/Desktop/java/resource");//1.拿到下面全部的视频,一级文件对象File[] videos = dir.listFiles();//2.一个一个的找for (File video : videos) {//3.拿到它的名字,改成新名字String name = video.getName();String index = name.substring(0,name.indexOf("、"));String lastName = name.substring(name.indexOf("、"));String newName = (Integer.valueOf(index)+18)+lastName;//4.正式改名video.renameTo(new File(dir,newName));}}}
案例2:文件搜索的实现(利用递归)
package com.IO.File;import java.io.File;
import java.io.IOException;// 文件搜索的实现
public class Test2 {public static void main(String[] args) throws Exception {creashFile(new File("D:/"),"QQ.exe");}/*** 去目录下搜索某个文件* @param dir 目录* @param fileName 要搜索的文件名称*/public static void creashFile(File dir,String fileName) throws Exception {//1. 把非法的情况都拦截住if(dir==null || !dir.exists() || dir.isFile()){return; //代表无法搜索}//2.dir不是null,存在,一定是目录对象File[] files = dir.listFiles();//3.判断当前目录下是否存在一级文件对象,以及是否可以拿到一级文件对象if(files != null && files.length > 0){//4.遍历全部一级文件对象for (File f : files) {if(f.isFile()){if(f.getName().contains(fileName)){System.out.println("找到了:"+f.getAbsolutePath());//找到后直接启动(runtime类)Runtime rt = Runtime.getRuntime();rt.exec(f.getAbsolutePath());}}else {// 是文件夹,继续重复这个过程(递归)creashFile(f,fileName);}}}}
}
3.前置知识:字符集
标准的ASCII字符集
- ASCII:美国信息交换标准代码,包括了英文、符号等
- 标准ASCII使用1个字节存储一个字符,首位是0,总共可以表示128个字符,对美国人来说是完全够用了
GBK(汉字内码扩展规范,国标)
- 汉字编码字符集,包含了2万多个汉字等字符,GBK中一个中文字符编码成两个字节的形式存储
- 注意:GBK兼容了ASCII字符集
- GBK规定:汉字的第一个字节的第一位必须是1
Unicode字符集(统一码,也叫万国码)
- Unicode是国际组织指定的,可以容纳世界上所有的文字、符号的字符集(UTF-32)
UTF-8
- 是Unicode字符集的一种编码方案,采用可变长编码方案,共分四个长度区:1个字节、2个字节、3个字节、4个字节
- 英文字符、数字等只占1个字节(兼容标准ASCII编码),汉字字符占用3个字节
注意:
- 字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码
- 英文,数字一般不会乱码,因为很多字符集都兼容了ASCII编码
字符集的编码和解码操作
编码:把字符按照指定字符集编码成字节
解码:把字节按照指定字符集解码成字符
package com.IO.codeset;import java.io.UnsupportedEncodingException;
import java.util.Arrays;public class Test01 {public static void main(String[] args) throws Exception {//1.编码String data = "a我b";byte[] bytes = data.getBytes();//默认是按照平台字符集(UTF-8)进行的编码System.out.println(Arrays.toString(bytes));//按照指定字符集进行编码byte[] bytes2 = data.getBytes("GBK");System.out.println(Arrays.toString(bytes2));//2.解码String s1 = new String(bytes); //按照平台默认编码(UTF-8)解码System.out.println(s1);String s2 = new String(bytes2,"GBK");System.out.println(s2);}
}