相关文章:
- 《IO流 (一) ----- 基本概念和File类》
- 《IO流 (二) ----- 文件流》
- 《IO流 (三) ----- 字符流和字符缓冲流》
- 《IO流 (四) ----- 转换流和标准字节输出流》
- 《IO流 (五) ----- 对象数据的序列化和反序列化》
本篇涉及内容
- IO流的基本概念
- IO流四大家族介绍
- java.io包下主要的几个流
- File类详解
IO流基本概念
一、什么是IO流?
IO流即输入输出流,通过IO流可以完成硬盘文件的读写。

二、IO流的分类
-
按照流的方向进行分类——输入流、输出流
以内存作为参照物,往内存中入叫作输入(Input)、读(Read),从内存中出叫作输出(Output)、写(Write). -
按照读取数据方式的不同进行分类——字节流、字符流
(1) 字节流,一次读取1个字节byte(8个二进制位)。这种流什么类型的文件都可以读取,包括:图片、音频、视频、文本文件等等…
(2) 字符流,一次读取一个字符char,这种流是方便读取普通文本而存在的,只能读取普通文本文件,word文件都不能读取。
例如:在.txt纯文本文件内有"莫莫ab"这段文本
- 使用字节流读取:
第一次读取:1个字节,第一个“莫”的一半字节(中文字符在windows系统中占2个字节)
第二次读取:1个字节,第一个“莫”的另一半字节
第三次读取:1个字节,第二个“莫”的一半字节
第四次读取:1个字节,第二个“莫”的另一半字节
第五次读取:1个字节,“a”(字母在windows系统中占1个字节)
第六次读取:1个字节,“b” - 使用字符流读取:
第一次读取:1个字符,“莫”
第二次读取:1个字符,”莫“
第三次读取:1个字符,“a”
第四次读取:1个字符,“b”
注意:
- char基本数据类型在java中占用2个字节,但是一个字母在windows系统中占用1个字节、一个中文字符在windows系统中占用2个字节,使用字节流读取.txt文件中的数据时,是根据在windows系统中.txt文件中数据内存来读取的, 从里面每次读取1个字节到内存中,所以一次只能读取一个字母或者半个中文字符。
- 普通文本文件不一定只是.txt文件,能用记事本编辑的文件都属于普通文本文件。
- 使用字节流读取:
IO流的四大家族
- java.io.InputStream 字节输入流
- java.io.OutputStream 字节输出流
- java.io.Reader 字符输入流
- java.io.Writer 字符输出流
共同点:
- 以上四个类都是抽象类 ,实现了java.io.Closeable接口,都是可关闭的,都有
close()
方法。流是内存和硬盘之间通道,使用完后一定要关闭,避免造成资源耗费。 - 所有的输出流实现了java.io.Flushable接口,都是可刷新的,都有
flush()
方法。在输出流最终输出完后,一定记得flush()刷新一下,作用是将连接内存和硬盘之间的通道中的数据强行输出完,如果没有flush()可能会丢失数据。
注意:以上四个类都是抽象类,在java中只要类名以"Stream"结尾的都是字节流,以"Reader/Writer"结尾的都是字符流。
java.io包下主要的几个流
-
文件流:
java.io.FileInputStream
java.io.FileOutputStream
java.io.FileReader
java.io.FileWriter -
转换流:(将字节流转换为字符流)
java.io.InputStreamReader
java.io.OutputStreamWriter -
缓冲流:
java.io.BufferedReader
java.io.BufferedWriter
java.io.BufferedInputStream
java.io.BufferedOutputStream -
数据流:
java.io.DataInputStream
java.io.DataOutputStream -
标准输出流:
java.io.PrintWriter
java.io.PrintStream -
对象流:
java.io.ObjectInputStream
java.io.ObjectOutputStream
File类
一、摘要
该类是文件和目录路径名的抽象表示形式
二、文件的绝对路径和相对路径
- 绝对路径:
C:\Users\yukea\Desktop\JavaProject\Test\FileInputStreamTest.txt"
- 相对路径:
Test\FileInputStreamTest.txt
(IDEA默认的当前路径是project的根下)
三、File类的构造方法
构造方法 | 描述 |
---|---|
File(File parent, String child) | 通过已实例化的父路径File对象和子路径名实例化一个新的File对象 |
File(String pathname) | 通过给定的路径名实例化一个File对象 |
File(String parent, String child) | 通过给定父路径名和子路径名实例化一个File对象 |
File(URI uri) | 通过将给定文件URI转换为抽象路径名来创建新的File实例 |
父路径:相对于子路径的上一级路径
子路径:相对于父路径的下一级路径
四、File类的常用方法
-
新建文件或文件夹需要用到的方法
返回值 方法名及形参 描述 boolean exists() 判断文件或者文件夹是否存在 boolean createNewFile() 在一个已经存在路径文件夹下创建一个新文件,创建成功返回true boolean mkdir() 在一个已经存在路径文件夹下创建一个新文件夹,创建成功返回true boolean mkdirs() 创建多级文件夹目录,创建成功返回true File dir = new File("Test/一级文件夹"); File file = new File(dir, "moMo.txt"); File dirs = new File("Test/一级文件夹/二级文件夹/moMo"); if(!dir.exists() || !file.exists() || !dirs.exists()) { // 在Test文件夹下创建一个一级文件夹 dir.mkdir(); // 在一级文件夹下创建一个二级文件夹再在二级文件夹下创建moMo文件夹 dirs.mkdirs(); // 在一级文件夹下创建一个moMo.txt文件 file.createNewFile(); }
-
删除文件或文件夹
返回值 方法名及形参 描述 boolean delete() 删除文件或文件夹 注意:delete的File对象如果是文件夹则该文件夹必须为空,否则会删除失败。
-
获取文件名和路径
返回值 方法名及形参 描述 String getName() 获取文件或文件夹的名称 String getPath() 获取创建File对象时传入的路径 String getAbsolutePath() 获取文件或文件夹的绝对路径 File getAbsoluteFile() 返回文件或文件夹的绝对路径形式的File对象 String getParentPath() 获取文件或文件夹的上一级路径 File getParentFile() 返回文件或文件夹的上一级路径的File对象 -
判断文件属性
返回值 方法名及形参 描述 boolean isFile() 判断是不是文件类型 boolean isDirectory() 判断是不是文件夹类型 boolean exists() 判断文件或文件夹是否存在 boolean canRead() 判断文件是否可读取 boolean canWrite() 判断文件是否可写入 boolean canExecute() 判断文件是否为可执行文件 -
设置文件属性
返回值 方法名及形参 描述 boolean setReadable(boolean readable) 设置文件可读性 boolean setWritable(boolean writable) 设置文件可写入性 boolean setExecutable(boolean executable) 设置文件可执行性 -
获取文件属性
返回值 方法名及形参 描述 long length() 获取文件字节大小(b) long lastModified() 获取文件最后修改时间(1970-01-01 00:00:00 的偏移量) File[] listFiles() 获取文件夹中的所有文件和子文件夹的File对象,存放到File数组中 String[] list() 获取文件夹中的所有文件和子文件夹的名称,并存放到字符串数组中 -
测试
File file = new File("Test/copyFile/copiedFile2.MOV"); System.out.println("是否是文件:" + file.isFile()); System.out.println("是否是文件夹:" + file.isDirectory()); System.out.println("是否可读取:" + file.canRead()); System.out.println("是否可写入:" + file.canWrite()); System.out.println("是否可执行:" + file.canExecute()); System.out.println("该文件大小:" + (double)((file.length() / (1024 * 1024))) + "MB"); System.out.println("该文件最后修改时间:" + new Date(file.lastModified())); System.out.println("该文件的同目录下所有文件名称:" + Arrays.toString(file.getParentFile().list()));
是否是文件:true 是否是文件夹:false 是否可读取:true 是否可写入:true 是否可执行:false 该文件大小:20.0MB 该文件最后修改时间:Fri Jul 10 18:00:59 CST 2020 该文件的同目录下所有文件名称:[.DS_Store, Test, copiedFile2.MOV]