文件是保存数据的地方,而文件在程序中又按流的形式操作。
常用文件操作
1.创建文件
new File 创建的只是文件对象,必须执行了createNewFIle方法后,才能在磁盘创建该文件。
2.获取文件相关信息
先创建文件对象
File file = new File("e:\\news.txt");
3.对目录的操作
可以把目录也当作文件来操作
-----------------------------------
IO流原理
字节流适合操作二进制文件,不会造成损失,字符流适合操作文本文件
对任何的流,在操作后都要执行close方法关闭。
体系类图
字节输入流InputStream:
这是一个抽象类,是所有字节输入流的超类
FileInputStream文件输入流:
构造器和常用方法:
FileInputStream(String filePath),指定文件名称
FileInputStream(File file),指定文件
read()使用时通常搭配while循环,来读取文件,读取的字节可以通过强制类型转换后输出
read()每次只能读取一个字节,效率低下,可以每次读取一个字节数组
read(byte[] b)
首先要定义一个字节数组,比如
byte[] buf = new byte[8]; //一次读取8个字节
如果读取完毕,该方法返回-1,读取正常,返回实际读取的字节数
读取的字节数组可以转换成字符串后输出,new String(buf,0 ,readLength);
------------------------------------
文件输出流FileOutputStream
FileOutputStream可以对写入文件,若要写入的文件不存在,则会创建该文件。
先创建FileOutputStream对象
String filePath = "文件路径";
FileOutputStream fileOutputStream = null;
fileOutputStream = new FileOutputStream(filePath);
可以使用write方法来写入(int b 和 char b一样,因为存在转换关系)
从字节数组的第off个元素开始,写入len个元素。
new FileOutputStream(filePath)对同一个文件的多次写入,会覆盖上一次的写入,若不想覆盖,可以使用追加append模式,即在构造器定义是,加上true;
//new FileOutputStream(filePath,true) //true表示打开追加模式
----------------------------
文件的拷贝(即read和write)
1.先创建输入流读取文件到程序
2.创建输出流把读取的数据写入新文件
不可以使用write(buf),这样有可能造成文件损失!
---------------------------
文件字符流FileReader 和 FileWriter
调用read方法时,注意参数不再是字节数组,而是字符数组了
------------------------------------
节点流和处理流
节点流就是从特定的数据源进行读写的流,如FileReader
处理流(修饰器设计模式)是对一系列的数据源都能操作的流,它封装了一个节点流属性(如Reader,Writer),可以传入任意子类的节点流,来使用对应的方法。
本质仍是对应的节点流
-----------------------------------------
处理流BufferedReader和BufferWriter都属于字符流,关闭处理流只需关闭外层流即可
BufferReader使用:
BufferWriter使用:
newLine()方法可以往文件写入换行符,达到换行的效果,如果需要追加写入,则在构造器中可以置为true。
Buffered拷贝,先读取后写入,注意不要操作二进制文件,因为这是字符流,会导致文件损坏!
--------------------------------
可以使用BufferedInputStream BufferedOutputStream字节处理流来操作文本文件和二进制文件
当使用BufferedInputStream / BufferedOutputStream时,继承了父类的in / out属性,只需传入InputStream / OutputStream的子类即可,比如传入文件流
--------------------------------
对象处理流,专用于处理对象
ObjectInputStream 和 ObjectOutputStream
优先实现Serializable接口,因为这样更加简便,实现Externalizable接口,必须要再去重写里面的2个抽象方法。
比如序列化一个Dog对象(name,age),此时Dog类必须实现序列化接口,并保存到dat文件中
依然是先定义路径,创建对象流对象
通过write方法序列化数据到对应路径的文件中
既然有序列化,那如何能反序列化,恢复数据呢,就可以用ObjectInputStream来读取对应的文件
注意反序列化的顺序需要和序列化的顺序一致!
可以通过readObject方法来反序列化对象,此时会自动发生转型
-------------------------------
标准输入输出流
就比如Scanner(System.in)从键盘输入数据,System.out.print()标准输出到显示器
--------------------------
转换流InputStreamReader 和 OutputStreamWriter
该转化流就是将一种字节流转换成字符流,可以解决因编码方式不同而导致的中文乱码问题,即指定编码方式
InputStreamReader
OutputStreamWriter可以按照指定的编码方式对文件进行写入
-----------------------------------
字节打印流PrintStream
该流只有输出流PrintWriter,没有输入流,可以打印在显示器,文件里面等等
在默认下打印流会打印在显示器上
PrintWriter可以传入Writer,文件,OutputStream来控制打印位置
print方法底层是write方法,所以直接通过将输出的东西转换成字节后(getBytes方法)来使用write效果也是一样
如果想修改打印的位置,可以使用
System.setOut(new PrintStream (文件路径));
------------------------------
Properties类的父类是HashTable,专门用于读写配置文件的集合类,要求配置文件的格式必须是 键=值 键值对不需要空格,不需要引号分号
如果要读取配置文件,还要修改其中的键值对,只要使用setProperty方法即可,如果该文件没有key就是创建新的键值对,如果有,就是修改键值对。