目录
一、文件
1、包含数据本身内容+metadata(文件的头信息:文件名、修改时间、文件大小等)
2、文件系统结构
3、文件路径
- 绝对路径:从根节点到叶子节点的整个路径(windows从磁盘开始)
- 相对路径:从任意一个结点出发,到目的节点,经过的路径
4、文件划分
- 文本文件:被字符集编码的文本
- 二进制文件:按照标准格式保存的非字符集编码的文本
需要保证保存文件和打开文件的编码格式一致,否则就会乱码。
java中文本是string,可以使用getbytes("编码格式")返回byte[];
java中的二进制数据byte[],也可以转换为文本,使用new String(bytes)或new String(bytes,"编码格式").
二、Java中操作文件(File)
构造方法
方法 | 说明 |
File(String pathname) | 根据文件路径创建一个新的File,可以是相对路径也可以是绝对路径 |
常用方法
返回值类型 | 方法 | 说明 |
boolean | createNewFile() | 创建一个文件(路径中不存在才可以创建) |
boolean | delete() | 删除文件或目录(目录下为空才可以删除,不为空的目录,需要一个一个子目录遍历进行删除) |
boolean | exists() | 判断目录或文件是否存在 |
String | getName() | 获取文件或目录的名称 |
String | getParent() | 获取文件的父目录路径 |
String | getPath() | 获取文件或目录的路径 |
boolean | isFile() | 是否是文件 |
boolean | isDirectory() | 是否是目录 |
long | length() | 返回文件的大小(字节数) |
long | lastModified() | 返回文件上一次修改的时间 |
File[] | listFiles() | 返回目录的下一个子目录或者子文件 |
boolean | mkdir() | 创建一级目录 |
boolean | mkdirs() | 创建多级目录 |
boolean | renameTo() | 进行文件改名/移动(剪切,粘贴操作) |
【应用如下】
public static void main(String[] args) throws IOException {
//文件路径相关函数
File file1=new File("E:\\javacode\\20110312\\20110312.iml");
System.out.println("文件名:"+file1.getName());
System.out.println("文件路径:"+file1.getPath());
System.out.println("文件的父目录:"+file1.getParent());
System.out.println("文件的绝对路径:"+file1.getAbsolutePath());
System.out.println("===============================");
//创建文练习
File file2=new File("E:\\练习\\创建的文件.txt");
System.out.println("是否存在:"+ file2.exists());
System.out.println("是否创建成功:"+file2.createNewFile());
System.out.println("是否是文件目录:"+file2.isDirectory());
System.out.println("是否是文件:"+file2.isFile());
System.out.println("再次创建是否成功:"+file2.createNewFile());
System.out.println("==================================");
//删除文件练习
File file3=new File("E:\\练习\\要删除的文件.txt");
System.out.println("要删除的文件是否存在:"+file3.exists());
System.out.println("创建需要删除的文件:"+file3.createNewFile());
System.out.println("要删除的文件是否存在:"+file3.exists());
System.out.println("删除要删除的文件:"+file3.delete());
System.out.println("要删除的文件是否存在:"+file3.exists());
}
三、文件内容读写(IO流)
io流
将数据从一个设备传输到另一个设备,就是io操作。
从不同的层面可以进行不同的划分:
(1)来源:文件io、网络io
(2)方向:输入流(读取数据)、输出流(写数据)
【System.in标准输入流;System.out标准输出流;System.error错误输出流】
1、InputStream
最顶级的输入流,所有真实使用的io流,都是它的子类。
返回类型 | 方法 | 说明 |
int | read() | 读取一个字节的数据,未读取到返回-1 |
int | read(byte[] b) | 最多读取b.length字节的数据到b中,返回实际读到的数量。未读取到返回-1 |
int | read(byte[] b,int off,int len) | 从off位置开始,最多读取len个字节,返回实际读到的数量,未读到返回-1 |
void | close() | 关闭字节流 |
只是一个抽象类,要使用需要具体的实现类。
FileputStream
签名 | 说明 |
FileInputStream(File file) | 利用 File 构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
利用Scanner进行字符读取:读写操作,都是阻塞式(我们学习的都是BIO:阻塞式IO)
【输入流可以嵌套其他输入流】
构造方法 | 说明 |
Scanner(InputStream source) | 构造一个Scanner,产生从指定输入流产生的值 |
Scanner(InputStream source,String charset) | 使用charset进行输入的扫描) |
比较常见的字符输入流:
BufferedReader→带Reader的都是字符输入流。
返回值 | 方法 | 说明 |
int | read() | 读取一个字符 |
int | read(char[] cbuf,int off,int len) | 从off位置开始读取len长度,读取到字符数组中 |
String | readLine() | 读取一行 |
2、OutputStream
输出流的顶级抽象类,所有使用的输出类都是它的子类。
返回值 | 方法 | 说明 |
void | write(int b) | 写一个字节 |
void | write(byte[] bytes) | 将bytes数组的数据写到输出流 |
void | write(byte[] b,int off,int len) | 从off位置开始,写len长度的数据到输出流 |
void | close() | 关闭字节流 |
void | flush() | 刷新缓存区,将数据刷新到硬盘 |
flush()函数:
I/O的速度是很慢的,大多的OutputStream为了减少设备操作的次数,写数据时会将数据暂时写入缓存区,直到缓存区慢之后才会真正写入到设备中,但可能会造成我们写的数据会遗留一部分在缓存区。需要在最后调用falsh,刷新到设备中。
FileOutputStream
通过继承outStream的三个write方法,就可以写字节数据。
常见的输出流:
BufferedWriter:带Writer都是字符输出流
【要输入到字节流中,需要先使用字符字节转换流OutputStreamWriter
PrintWriter:和BufferedWriter类似。