📌 File类
○ 知识概要:
• 一个File类的对象可以表示一个具体的文件或目录 .
• File对象可以对文件或目录的属性进行操作,如:文件名、最后修改日期、文件大小等.
• File对象无法操作文件的具体数据,即不能直接对文件进行读/写操作
○ File的构造方法:
File( String pathname) 指明详细的文件或目录的路径
//指明详细的路径以及文件名 File file =new File("E:/demo1.txt"); //指明详细的路径以及目录名 File directory =new File("E:/temp"); //注意使用/或\\来区分路径等级
○ File类的常用方法:
注意:delete删除一个文件夹时,文件夹中必须是空的
○ 使用File类创建文件及目录:
① 创建文件
//指明详细的路径以及文件名 File file =new File("E:/demo3.txt"); if (!file.exists()){//判断指向文件是否存在 file.createNewFile();//通过createNewFile()方法创建文件 } file.delete();//删除文件
② 创建文件夹(单级文件夹和多级文件夹)
mkdir( ) 创建单级文件夹 mkdirs( )创建多级文件夹
//指明详细的路径以及目录名 File directory =new File("E:/demo"); directory.mkdir();//mkdir用来创建单级文件夹 File directorise =new File("E:/demo/demo1/demo2"); directorise.mkdirs();//mkdirs用来创建多级文件夹
○ 如何得到一个目录中的所有文件:
思路:对目录进行遍历, 遇到文件直接输出, 遇到子目录再对子目录遍历, 直到遇见文件
import java.io.File; import java.io.IOException; public class Review1 { public static void main(String[] args) throws IOException { //指明详细的路径以及目录名 File directory =new File("E:/IO"); search(directory); } //创建一个方法用来遍历目录里的文件 public static void search(File file){ File[] files =file.listFiles();获取到当前给定目录的子级文件/文件夹 for (File f:files){ if (f.isFile()){//若是文件,直接输出 System.out.println(f); }else { search(f);//若是目录,继续向下查找,直到遇到文件 } } } }
📌 输入(I)与输出(O)
• 输入和输出是一个相对概念,输入和输出是相对于我们的程序 。
○ 输入---Input
- 把电脑硬盘上的数据读到程序中,称为输入,即input,进行数据的read操作.
○ 输出---Output
- 从程序往外部设备写数据,称为输出,即output,进行数据的write操作.
● 如图起连接作用的通道也就是我们通常所说的流 .
📌 字节流与字符流
✰ 体系图
知识概要:
字节流:读取时以字节为单位,可以读取任意文件.
字符流:读取时以字符为单位,只能读取文本文件.
字节流中常用类:
- 字节输入流 InputStream
- 字节输出流 OutputStream
字符流中常用类:
- 字符输入流 Reader
- 字符输出流 Writer
✰ 常用类的基本方法
📌 InputStream和OutputStream的子类都是字节流, 可以读写二进制文件,主要处理音频、图片、歌曲、字节流处理单元为1个字节。
○ InputStream的基本方法:
- 读取一个字节并以整数的形式返回(0~255),如果返回-1已到输入流的末尾。
- int read() throws IOException
- 读取一系列字节并存储到一个数组buffer, 返回实际读取的字节数,如果读取前已到输入流的末尾返回-1
- int read(byte[] buffer) throws IOException
- 关闭流释放内存资源
- void close() throws IOException
○ OutputStream的基本方法:
- 向输出流中写入一个字节数据,该字节数据为参数b的低8位
- void write(int b) throws IOException
- 将一个字节类型的数组中的从指定位置(off)开始的 len个字节写入到输出流
- void write(byte[] b, int off, int len) throws IOException
- 关闭流释放内存资源
- void close() throws IOException
📌 Reader和Writer的子类都是字符流, 主要处理字符或字符串, 字符流处理单元为1个字符。
○ Reader 的基本方法:
- 读取一个字符并以整数的形式返回, 如果返回-1已到输入流的末尾。
- int read() throws IOException
- 读取一系列字符并存储到一个数组buffer, 返回实际读取的字符数, 如果读取前已到输入流的末尾返回-1。
- int read( char[] cbuf) throws IOException
- 关闭 void close() throws IOException
○ Writer 的基本方法:
- 向输出流中写入一个字符数据,该字节数据为参数b的16位
- void write(int c) throws IOException
- 将一个字符类型的数组中的从指定位置(off set)开始的 length个字符写入到输出流
- void write( char[] cbuf, int off set, int length) throws IOException
- 关闭 void close() throws IOException
✰ 字节流读写文件
① 首先们在D盘中创建一个ddd.docx文件(9.86KB),再在E盘中创建一个eee.docx文件(空)
② 代码实现 :
public static void main(String[] args) throws IOException { FileInputStream inputStream1 =new FileInputStream("D:/ddd.docx");//输入流 FileOutputStream outputStream1 =new FileOutputStream("E:/eee.docx");//输出流 int a =0 ; while((a=inputStream1.read())!=-1){//只要a!=-1说明还未读完 outputStream1.write(a);//写内容(以字节为单位) } //关闭通道,否则文件一直处于打开(占用)状态 inputStream1.close(); outputStream1.close(); }
③ 运行程序,可以发现我们成功将ddd.docx文件内容写到了eee.docx文件中 ( 0字节➝9.86KB )
每次读写完后记得关闭通道,否则则文件一直处于打开(占用)状态.
○ 高效文件读写 :
创建一个byte数组,一次读byte数组长度个字节,便于提高读写效率。
public static void main(String[] args) throws IOException { FileInputStream inputStream =new FileInputStream("D:/demo1.txt"); FileOutputStream outputStream=new FileOutputStream("E:/IO.txt"); byte[] bytes =new byte[10]; //read(bytes) 一次读byte数组长度个字节,文件内容读取完后返回-1 //size:每次实际往数组中装入的元素的个数 int size =0; while((size=inputStream.read(bytes))!=-1){ //一次向外写出一个byte数组长度个字节内容,从指定位置开始写,写size个 outputStream.write(bytes,0,size); } inputStream.close(); outputStream.close(); }
✰ 字符流读写文件
字符流只能读取文本文件
① 我们先创建一个char1.txt文本, 并写入内容进行读写测试
② 通过代码实现将char1.txt文本的内容读写到char2.txt文本
public static void main(String[] args) throws IOException { FileReader reader =new FileReader("E:/char1.txt"); FileWriter writer =new FileWriter("E:/char2.txt"); int b = 0; while((b=reader.read())!=-1) { System.out.println(b);//打印字符编码 writer.write(b); } reader.close(); writer.close(); }
字符流读取时以字符为单位,会将读到字节结合编码表转换为一个字符编码
③ 我们可以将每次读取到的字符对应的编码打印出来
④ 成功读写内容到char2.txt文本
📌 上述写法的弊端:
每次运行程序会将之前所读写的内容覆盖带掉,不能做到在原内容的基础上续写
解决方法:在字符输出流的对象路径后加上true, 表示可续写.
○ 此时当我们多次运行程序时, 发现之前的所读写的内容依然存在
📌 那么我们怎样进行换行操作?
public static void main(String[] args) throws IOException { FileReader reader =new FileReader("E:/char1.txt"); //保留原来的内容,在原内容基础上向后追加(续写) FileWriter writer =new FileWriter("E:/char2.txt",true); BufferedReader bufferedReader =new BufferedReader(reader); BufferedWriter bufferedWriter =new BufferedWriter(writer); String line = null ; while((line=bufferedReader.readLine())!=null){//只要每次读取不为空,则读取一行 bufferedWriter.write(line);//写一行 bufferedWriter.newLine();//插入换行符 } bufferedReader.close(); bufferedWriter.flush(); bufferedWriter.close();//记得在读写完毕后关闭通道 }
○ 注意:
由于读取一行的方法readLine( )在BufferedReader中,换行方法newLine( )在BufferedWriter类中, 所以需要用到缓冲字符输入输出流。
○ 此时当我们多次运行程序时, 会将每次读取到的内容进行换行读写, 便于记录数据。
JavaSE—IO流 ( 八千字带你快速深入理解IO流体系 )(二):https://developer.aliyun.com/article/1555389