1、File类的一个对象,代表文件或者一个文件目录(俗称文件夹)
- File file = new File(“a.txt”);
2、路径分割符:
- Windows下的分隔符:\和Linux下/可以使用File.separatorChar替代
3、关于File创建实例的3钟方式:
- File(String filePath);
- File(String parentPath,String childPath);
- File(File parentFile,String childPath);
4、File的方法:
- LastModified():获取最后一次修改的时间,毫秒值
- list():获取指定目录下所有文件或者文件目录的名称数组(获取的是文件名)
- listFiles():获取指定目录下所有的文件或者文件目录的File数组(获取的是绝对路径)
- renameTo(File file):这个方法表示将文件剪切,并且可以修改名称为file。
- isDirectory():判断是否是目录
- isFile():判断这个是否是文件
- exists():判断是否存在
- createNewFile():创建一个新的文件
- delete():删除一个文件
- mkdir():创建文件目录,如果此文件存在不创建,只创建单个文件
- mkdirs():创建文件目录,如果此文件目录存在不创建,如果不存在就创建该目录。
- length():获取文件的大小,以字节的方式返回长度。
代码:文件方法的使用
5、IO流以操作数据单位不同分为:
- 字节流(除文本之外可以进行读取写入,文本不能再控制台输出读取。)
- 字符流(只有文本可以进行读取写入)
6、流的分类
7、流的体系结构
8、字符的读取写入:
- FileReader(File file):表示创建一个文件的读取对象。可以通过read()读取数据。
- FileWriter:输出操作,对应的File可以不存在,如果不存在,在输出的过程中,会自动创建此文件,如果存在,就是对该文件进行操作。
FileWriter(File file) : 表示对原有file的覆盖操作,
FileWriter(File file,true): 表示对原有file的追加内容
代码:字符流读取和写入代码
9、字节流:
- FileInputStream:输入流,从文件中读取数据到控制台
read()
:读取单个字节,当没有读取到数据时,返回-1
read(byte[] data)
:读取多个字节存储到data数组中,当读取到数组时,返回数据的长度,当没有读取到数据时,返回-1.
read(byte[] data,int off,int len)
:表示读取len个字节存储到data中,数据从data的off位置开始存储,
代码:read方法使用代码 - FileOutputStream:输出流,从控制台输出数据到文件。
代码:字节流的使用
10、转换流:提供字符流和字节流之间的转换
- InputStreamReader:将一个字节的输入流转换为字符的输入流
- OutputStreamWriter:讲一个字符的输出流转换为字节的输出流。
代码:转换流代码
11、标准的输入、输出流
- System.in:标准的输入流,默认从键盘输入
- System.out:标准的输出流,默认从控制台输出
- System类的setIn(InputStream is ) / setOut(PrintStream ps) 方式重新指定输入和输出流
- 打印流:将原本输出到控制台的信息,重新定义位置到其它地方。
- PrintStream
- PrintWriter
代码:打印流和输入流的代码
12、数据流(数据流写入文件,只能使用数据流读取文件。)
- DataInputStream 和 DataOutputStream
- 作用:用于读取或写出基本数据类型的变量或字符串。
代码:数据流读取和写入
13、对象流:用于存储和读取基本数据类型数据或对象的处理流,它的强大之处在于可以将java中的对象写入到数据源中,也能把对象从数据源中还原回来。实现对象流的对象条件要满足序列化。
13.1、对象流的序列化:
对象序列化机制:允许吧内存中的java对象转换成平台无关的二进制流,从而输到另一个网络节点。当其他程序获取了这种二进制流,就可以恢复成原来的java对象。
序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原。
13.2、序列化需要
- 1、继承Serializable,
- 2、同时要定义一个默认的属性:public static final long serialVersionUID = 12456; 数字可以自己随便定义。
- 3、除了当前的类需要实现Serializable接口外,还必须保证其内部所有属性也必须是可序列化的。(默认情况下,基本数据类型可序列化)
- 4、序列化需要注意的事项:
4.1:序列化和反序列化 对象版本要一致(属性名,属性个数等等都要一致)
4.2:要序列化多个对象用一个ObjectOutputStream对象writeObject多次即可
或者把多个对象放入list等集合对象中再writeObject一次即可readObject反序列化得到的对象也是集合对象
4.3:一定要在多个ObjectOutputStream对象中写多个对象情况怎么反序列化?文件追加模式时会默认加4个字节的换行符 字符,这样反序列化会失败,因此在序列化时,添加的第二个对象开始就需要去除这4个字节。
long pos = 0;
pos = os1.getChannel().position() - 4;
os1.getChannel().truncate(pos);
oos2.writeObject(users2);
代码:序列化注意事项代码
13.3、对象流的方法:
- ObjectInputStream:
- ObjectOutputStream:
代码:对象流使用
14、随机存取文件流:
RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口
RandomAccessFile既可以作为一个输入流,又可以作为一个输出流。
14.1、public RandomAccessFile(File,String mode);
mode表示访问模式:
- r:只读方式打开
- rw:打开以便读取和写入
- rwd:打开以便读取和写入,同步文件内容的更新(发送异常也会保存发生异常前的信息)
- rws:大爱以便读取和写入;同步文件内容和元数据的更新。
14.2、方法:
- seek(n):把指针放到index=n的位置
代码:随机存取文件流