1、File类
File类是用于对文件的抽象表示
File类的对象既可以用于表示文件,也可以用于标识文件夹
Java中路径的分类:
绝对路径:在文件管理器中可以直接访问到该文件的路径,如在windows中可以理解为带盘符的完整路径
相对路径:相对当前项目的根目录的路径
Java代码中路径的分隔符可以用\或者/
File类的构造方法:
public File(String filePath);
public File(String parent,String child);
public File(File parent,String child);
File类的常用方法:
获取文件对象信息的方法:
public String getAbsolutePath();//获取绝对路径
public String getName();//获取当前File对象的名字
public String getPath();//获取创建File对象时,传递的路径
public long length();//获取表示文件的File对象占用的字节数,如果File表示的是一个文件夹的对象。,返回值不确定
创建、判断、删除方法:
public boolean createNewFile();//创建一个新的文件,只创建文件,不创建文件夹
public boolean mkdir();//创建一个新的文件夹,返回是否创建成功
public boolean isFile();//返回是否是文件
public boolean isDirectory();//返回是否是文件夹
public boolean exists();//判断文件或文件夹是否存在
public boolean delete();//删除文件或者空的文件夹(如果文件夹不为空,会失败)
List和ListFiles方法
public String [] list();//返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
public File[] listFiles();//返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
文件过滤器
要使用文件过滤器,首先创建自己的文件过滤器类,该类需要实现FileFilter接口,并实现其中的accept接口,可以自定义代码,返回true,代表保存该文件,返回false,代表过滤掉该文件。然后在使用List或ListFiles方法时,将该类的对象作为实参传递即可,代码示例:
文件过滤器类
public class MyFileFilter implements FileFilter{
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
if(pathname.getName().endsWith(".PNG")){
return true;
}
return false;
}
}
public class FileFilterDemo {
public static void main(String[] args) {
//1.创建一个File对象
File fileDir = new File("C:\\Users\\test");
//列出file下所有file对象
MyFileFilter ff = new MyFileFilter();
File[] files = fileDir.listFiles(ff);
for (File file : files) {
}
}
}
2、IO流
根据流的流向分类:
InPut:输入流,读取时使用
OutPut:输出流,写入时使用
根据流操作的数据分类
字符流:操作字符(只能用于操作文本文件)
字节流:操作字节(操作一切文件)
四大流:上面两种分类的组合
字符输入流:
共同父类为Reader类,如FileReader、BuffredReader
FileReader的方法列表如下:BuffredReader的方法基本同FileReader
字符输出流:共同的父类Writer,如FileWriter BufferedWriter
FileWriter的方法列表如下:BufferedWriter方法基本相同
字节输入流:共同父类 InputStream 如:FileInputStream,BufferedInputStream
FileInputStream方法列表如下:
字节输出流:共同父类 OutputStream 如:FileOutputStream,BufferedOutputStream
FileOutputStream方法列表如下:
FileInputStream与FileOutputStream标准的读写文件示例代码:
a、一次读取一个字节,并写入一个字节
FileInputStream fis = new FileInputStream("C:\\orgImage.png");
FileOutputStream fos = new FileOutputStream("copy.png");
int b;
while((b=fis.read())!=-1){
fos.write(b);
}
fos.close();
fis.close();
b、一次读取一个字节数组,一次写入一个字节数组
FileInputStream fis = new FileInputStream("C:\\orgImage.png");
FileOutputStream fos = new FileOutputStream("copy.png");
byte [] bt = new byte[1024];
int b;
while((b=fis.read(bt))!=-1){
fos.write(bt,0,b);
}
fos.close();
fis.close();
FileOutputStream的构造方法中,参数append(boolean)表示是否续写,如果传递true,就会在文件末尾继续续写。
此外,如果要在文件中进行换行操作,需要使用\r\n(windows),\n(linux),\r(MAC)
BufferedOutputStream(缓冲输出流)、BufferedInputStream(缓冲输入流),其构造方法的参数分别为:public BufferedOutputStream(OutputStream out)和
public BufferedInputStream(InputStream in),这两个类的读写效率要高于FileOutputStream和FileInputStream,其方法基本与后者一致,不再BB。
3、编码表
编码表:字符和计算机二进制的对应关系表。
1、ascii: 一个字节中的7位就可以表示。对应的码值都是正数。00000000-0xxxxxxx(其他码表都要兼容它) 0000 0000
2、iso-8859-1:拉丁码表 latin,用了一个字节用的8位。1-xxxxxxx 负数。
3、GB2312:简体中文码表。包含6000-7000中文和符号。用两个字节表示。中文的两个字节都是开头为1 ,即两个字节都是负数。
GBK:目前最常用的中文码表,2万的中文和符号。用两个字节表示,其中的一部分文字,第一个字节开头是1,第二字节开头是0
GB18030:最新的中文码表,目前还没有正式使用。
4、unicode:国际标准码表:无论是什么文字,都用两个字节存储。
Java中的char类型用的就是这个码表。char c = ‘a’;占两个字节。
Java中的字符串是按照系统默认码表来解析的。简体中文版 字符串默认的码表是GBK。
5、UTF-8:基于unicode,一个字节就可以存储的数据,不用两个字节存储,而且这个码表更加的标准化,在每一个字节头加入了编码信息(后期到api中查找)。
能识别中文的码表:GBK、UTF-8;正因为识别中文码表不唯一,涉及到了编码解码问题。
常见的编码 GBK UTF-8 ISO-8859-1
1.GBK:中文2字节
2.UTF-8:中文3字节
文字—>(数字) :编码: 就是看能看懂内容,转换成看不懂的内容。a 0110 0001
(数字)—>文字 : 解码: 就是把看不懂的内容,转换成看懂的内容。0110 0001 –
4、转换流
InputStreamReader类与OutputStreamWriter类
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,再使用字节流将这些字节写出去。
示例(读取2.txt(GBK)的内容并写入到test.txt(UAT-8)):
FileInputStream fis = new FileInputStream("2.txt");
FileOutputStream fos = new FileOutputStream("test.txt");
InputStreamReader isw = new InputStreamReader(fis);
OutputStreamWriter osr = new OutputStreamWriter(fos,"UTF-8");
char [] c = new char[1024];
int len;
while((len = isw.read(c))!=-1) {
osr.write(c,0,len);
}
osr.close();
isw.close();
fos.close();
fis.close();
5、序列化流和反序列化流
ObjectOutputStream(对象序列化流) 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。
*只能将支持 java.io.Serializable 接口的对象写入流中,如果要序列化自己的类,自己的类必须要实现Serializable接口
通过序列化将类数据写入到文件,并且通过反序列化将数据读取的代码如下:
FileOutputStream fos = new FileOutputStream("test.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(new Person("test",18));
oos.close();
FileInputStream fis = new FileInputStream("test.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Person p = (Person)ois.readObject();
System.out.println(p.getAge());
System.out.println(p.getName());
ois.close();
其中Person类的代码如下:
public class Person implements Serializable {
private static final long serialVersionUID = -4739903142435890605L;
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
序列化的两个注意事项:
一个对象如果要被序列化,必须实现Serializable接口,否则会抛出NotSerializableException异常
如果在序列化对象后,对对象对应的类进行了更改,那么反序列化会报错InvalidClassException,这是因为该类的版本号和从流中读取到的版本号在更改后不一致,要解决这个问题,可以手动指定类的版本号,如上述Person类中的
private static final long serialVersionUID = -4739903142435890605L;
如果某些属性不想被序列化,可以用关键字transient修饰。
6、打印流
打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式.
打印流根据流的分类:
字节打印流 PrintStream
字符打印流 PrintWriter
方法:
void print(String str): 输出任意类型的数据,
void println(String str): 输出任意类型的数据,自动写入换行操作
给test.txt写入五行helloworld的代码如下:
//创建流
// PrintWriter out = new PrintWriter(new FileWriter("test.txt"));//可用
PrintWriter out = new PrintWriter("test.txt");
//2,写数据
for (int i=0; i<5; i++) {
out.println("helloWorld");
}
//3,关闭流
out.close();
7、IO流常用JAR包
commons-io.jar
其中的FileUtils类,包含了一些方便的方法:
readFileToString(File file):读取文件内容,并返回一个String;
writeStringToFile(File file,String content):将内容content写入到file中;
copyFile(File srcFile, File destFile): 文件复制
copyDirectoryToDirectory(File srcDir,File destDir);文件夹复制
8、使用Properties类读取properties文件中的键值对
java.util.properties类中封装了一些对properties文件的操作,该类可主要用于读取propertie文件并且获取其中的键值对。具体步骤如下:
a、获取Properties类的对象
Properties pr = new Properties();
b、使用pr对象加载对应的properties文件
pr.load(new FileInputStream(“文件路径/文件名”));(此处的文件路径一般指绝对路径,文件名一般指位于项目根目录下的文件名)
此处如果propertie文件位于项目的src目录下,可以通过借助Class类中的InputStream getResourceAsStream(String name) ;方法,使用当前类对象来获取对应的properties文件,进而加载成输入流。如:
TestClass.class.getResourceAsStream(“jdbc_config.properties”);//
this.getClass.getResourceAsStream(“jdbc_config.properties”);
这个方法里面的name实际为properties文件相对于src目录的相对路径,如调用类与properties在一个包中,可以使用上面两种方式来获取,即直接输入文件名。但是如果二者不在同一个包中,那么需要声明该文件相对于src的具体路径,如
this.getClass.getResourceAsStream("/config/msg/jdbc_config.properties");
c.文件加载完成后可以使用该类中的方法获取想要的数据,如,获取某个键值的数值:String keyValue = pr.getProperty(“key”);
*要注意的是,无论使用哪种方式来加载文件,只要properties文件中含有中文,即使该文件编码格式为utf-8,通过pr对象获取出来的属性值默认编码仍然为"ISO-8859-1",如果需要正确显示该中文,需要借助String的构造方法来重新指定编码,格式如下:
new String(pr.getProperty(“key”).getBytes(“ISO-8859-1”),“UTF-8”)