IO
1.File
File类描述的是一个存在或者不存在的文件或文件夹
1.1构造
构 造 方 法 | 说 明 |
File(String pathname) | 指定文件(或目录)名创建File类对象 |
File(String parent, String child) | 指定父级目录和子级文件创建File类对象 |
File(File parent, String child) | 指定父级目录和子级文件创建File类对象 |
1.2 路径
相对路径是指相对于某位置的路径,是指相对于当前目录
绝对路径
- 对于UNIX平台,绝对路径名的前缀是"/"。相对路径名没有前缀。分隔符 :
- 对于Windows平台,绝对路径名的前缀由驱动器号和一个":"组成,例"c:\\..."。相对路径没有盘符前缀。分隔符 ;
1.3 常用方法
方 法 原 型 | 说 明 |
boolean exists() | 判断文件是否存在,存在返回true,否则返回false |
boolean isFile() | 判断是否为文件,是文件返回true,否则返回false |
boolean isDirectory() | 判断是否为目录,是目录返回true,否则返回false |
String getName() | 获得文件的名称 |
String getAbsolutePath() | 获得文件的绝对路径 |
long length() | 获得文件的长度(字节数) |
boolean createNewFile()throws IOException | 创建新文件,创建成功返回true,否则返回false,有可能抛出IOException异常,必须捕捉 |
boolean delete() | 删除文件,删除成功返回true,否则返回false |
File[] listFiles() | 返回文件夹内的子文件与子文件夹的数组 |
String[] list() | 返回文件夹内所有名字 |
boolean mkdir() | 创建单级目录 |
boolean mkdirs() | 创建多级目录 |
2.IO流
操作文件内容
IO流的分类
- 流按操作数据类型的不同分为两种:字节流与字符流
- 流按流向分为:输入流,输出流(输入到程序,或是从程序输出)
2.1 字节流
2.1.1 字节输入流(InputStream)
FileInputStream类:文件输入流,继承于InputStream类,是进行文件读操作的最基本类;它的作用是将文件中的数据输入到内存中,我们可以利用它来读文件;由于它属于字节流,因此在读取Unicode字符(如中文)的文件时可能会出现乱码问题
构造方法 | 说明 |
FileInputStream(File file) throws FileNotFoundException | 使用File对象创建文件输入流对象,失败抛出异常 |
FileInputStream(String name) throws FileNotFoundException | 使用文件名或路径创建文件输入流对象,打卡失败抛出异常 |
常用方法 | 说明 |
int read() throws IOException | 读取文件数据,一次一个字节,读取的数据作为返回值返回;读到末尾返回-1 |
int read(byte[] b) throws IOException | 读取文件数据,读到byte数组中,并返回字节数,未读到返回-1 |
int read(byte[] b,int offset,int len) | 每次读一定长度 |
void close() throws IOException | 关闭流对象 |
2.1.2 字节输出流(OutputStream)
OutputStream的实现类FileOutputStream ,主要用于将数据写入文件
构造方法 | 说明 |
FileOutputStream(File file) throws FileNotFoundException | 使用File对象创建文件输出流对象,打开失败则抛出 |
FileOutputStream(File file,boolean append) throws FileNotFoundException | append指定是否追加文件内容 |
FileOutputStream(String name) throws FileNotFoundException | 直接使用文件名或路径 |
FileOutputStream(String name,boolean append) throws FileNotFoundException | 同上是否能追加 |
常用方法 | 说明 |
void write(int b) throws IOException | 一次写入一个字节 |
void write(byte[] b) throws IOException | 一次写入一个数组 |
void write(byte[] b,int off, int len) throws IOException | 一次写入一部分 |
void close() throws IOException | 关闭流对象 |
2.1.3 字节流复制文件
先开一个输入流,将文件加载到流中,再开一个输出流,将流中数据写到文件中。就实现了文件的拷贝
BufferedInputStream和BufferedOutputStream类可以通过减少读写次数来提高输入和输出的速度。它们内部有一个缓冲区,用来提高处理效率,默认的字节是8192。
首先缓冲区输入流会将读取到的数据读入缓冲区,当缓冲区满时,或者调用flush方法,缓冲输出流会将数据写出。
// 创建高效输入流对象
BufferedInputStream bufferedInputStream = newnew FileInputStream(sourceFile));
// 创建高效输出流对象
BufferedOutputStream bufferedOutputStream = newnew FileOutputStream(targetFile));
2.2 字符流
字符流就是:字节流 + 编码表,为了更便于操作文字数据
- lASCII:美国标准信息交换码。用一个字节的7位可以表示
- ISO8859-1:拉丁码表。欧洲码表,用一个字节的8位表示。又称Latin-1
- GB2312:英文占一个字节,中文占两个字节.中国的中文编码表
- GBK:中国的中文编码表升级,融合了更多的中文文字符号
- Unicode:国际标准码规范,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode。
- UTF-8:最多用三个字节来表示一个字符
2.2.1 字符输入流(Reader)
构造方法 | 说明 |
FileReader(File file) throws FileNotFoundException | 使用File对象创建文件读取流对象,打开失败抛出异常 |
FileReader(String name) throws FileNotFoundException | 使用文件名创建 |
常用方法 | 说明 |
int read() throws IOException | 读取文件中的数据,读取一个字符,读取的数据作为返回值返回,读到文件末尾则返回-1 |
int read(char[] c) throws IOException | 读取文件中的数据到char数组中,返回字节数,未读到返回-1 |
int read(char[] cbuf, int off, int len) | 将字符读入数组的一部分 |
String readLine() | 读一行文字 |
void close() throws IOException | 关闭流对象 |
2.2.2 字符输出流 (Writer)
构造方法 | 说明 |
FileWriter(File file) throws IOException | File对象创建文件写入流对象,打开失败抛出 |
FileWriter(File file,boolean append) throws IOException | 是否追加 |
FileWriter(String name) throws IOException | 同上 |
FileWriter(String name,boolean append) throws IOException | 同上 |
常用方法 | 说明 |
void write(String str) throws IOException | 将一行字符串写入到缓冲写入流中 |
void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
void flush() | 刷新流 |
void newLine() | 写一行行分隔符 |
void close() | 关闭流,先刷新 |
2.2.3 字符流复制文件
字节流可以拷贝视频和音频等文件
字符流只能拷贝以字符为单位的文本文件
高效复制:
BufferedReader bufferedReader = newnew FileReader(sourceFile));
BufferedWriter bufferedWriter = newnew FileWriter(targetFile));
2.3 数据流
- DataInputStream:从底层输入流中读取基本 Java 数据类型
- DataOutputStream:将基本类型的值或字符串转换为字节,并且将字节输出到数据流
对于数据流而言,需要遵循前提: 先写再读
DataOutputStream数据输出流
方法 | 说明 |
DataOutputStream(OutputStream out) | 字节输出流创建数据输出流对象 |
final void writeT(T value) throws IOException | 写入一个T型数据 |
DataInputStream数据输入流
方法 | 说明 |
DataInputStream(InputStream in) | 字节输入流创建数据输入流对象 |
final int read(byte[] b) throws IOException | 读取一定字节到缓冲数组 |
final boolean readBoolean() throws IOException | 读取一个boolean型数据 |
final T readT() throws IOException | 读取一个T型数据 |
2.4 序列化流
序列化就是将临时存储的对象数据转换成字节流的形式能够运行和存储
- ObjectOutput,对象的序列化: 将内存中的对象直接写入到文件设备中
- ObjectInput,对象的反序列化: 将文件设备中持久化的数据转换为内存对象
Java的对象序列化(Object Serialization)将那些实现了 Serializable接口的对象转换成一个字节序列,并可以在以后将这个字节序列完全恢复为原来的对象。
使用具体实现类:
- ObjectOutputStream:被写入的对象必须实现一个接口:Serializable
- ObjectInputStream:读取序列化对象的数据。该方法抛出异常:ClassNotFountException。
ObjectOutput objectOutput = newnew FileOutputStream(file));
objectOutput.writeObject(user);
ObjectInput objectInput = newnew FileInputStream(file));
User user = (User)objectInput.readObject();
2.5 转换流
InputStreamReader类包含了一个底层输入流,可以从中读取原始字节。它根据指定的编码方式,将这些字节转换为Unicode字符。
OutputStreamWriter从运行的程序中接收Unicode字符,然后使用指定的编码方式将这些字符转换为字节,再将这些字节写入底层输出流中
2.6 Properties
Properties只加载key=value这样的键值对,与文件名无关,注释使用#
方法 | 说明 |
Properties() | 创建对象 |
void load(Reader reader) | 字符流加载文件 |
void load(InputStream in) | 字节流加载文件 |
String getProperty(String key) | 通过键获得值 |
Object setProperty(String key,String value) | 存入键值对 |
void store(OutputStream out,String comments) | 写入输出流 |
如果自己都不相信自己了,那该如何呢?