IO流

1File类
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”)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值