Java基础中级进阶篇二之IO流(IO流、嵌套类、多线程)
1.IO流1.1 File类定义:是用来操作文件或目录属性而不可以操作文件内容的类。作用:操作文件及目录的属性不可操作文件内容创建文件及目录删除文件及目录使用File类中的构造方法import java.io.File; public class FileCreateDemo { public static void main(String[] args) { // 第一种构造方法:直接传入完整路径 File f1 = new File("D:/myDir/hello.txt"); System.out.println("方式一:" + f1.getAbsolutePath()); // 第二种构造方法:父路径 + 子路径(字符串形式) File f2 = new File("D:/myDir", "hello.txt"); System.out.println("方式二:" + f2.getAbsolutePath()); // 第三种构造方法:父File对象 + 子路径 File parent = new File("D:/myDir"); File f3 = new File(parent, "hello.txt"); System.out.println("方式三:" + f3.getAbsolutePath()); } } 输出结果: 方式一:D:\myDir\hello.txt 方式二:D:\myDir\hello.txt 方式三:D:\myDir\hello.txt1.1.1 FIle类中操作文件的常用方法方法说明 boolean canRead()检查能否读取指定文件boolean canWrite()检查能否写入指定文件boolean equals(Object obj)将指定对象与调用函数的对象进行比较boolean exists()测试文件是否存在boolean isFile()测试此对象表示的文件是否是普通文件boolean createNewFile()创建空文件boolean delete()删除此对象指定的文件String getName()返回此对象表示的文件的名称String getAbsolutePath()返回此对象表示的文件的绝对路径名boolean isDirectory()测试此File对象表示的文件是否是目录boolean mkdir()创建由该File对象表示的目录boolean mkdirs()创建包含父目录的目录String getParent()返回此File对象的路径名的上一级,如果路径名没有上一级,则返回nullFile[] listFiles ()获取此File目录对象下所有的文件及目录1.2 IO流定义:IO流是一组有序的用于程序输入和输出操作的数据序列特点:具有方向性,用于程序输入和输出操作分类:IO包中的类层结构输入输出机制1.2.1 按流向分类输出流输入流1.2.2 按数据单元分类字节流字符流1.2.2.1 字节流定义::是以8位字节为数据单元的IO流特点:以8位字节为数据单元,操作文件的输入和输出分类:InputStream类(字节输入流类)OutputStream(字节输出流类inputStream类类层结构常用方法方法说明int read()读取单个字节到程序,以int型返回所读取的字节数据,返回值为-1表示读取到了文件的末尾int read(byte[] b)读取多个字节到程序,并存储在字节数组中,返回实际读取的字节数,返回值为-1表示读取到了文件的末尾void close()关闭输入流FileInputStream类:是继承自InputStream抽象类的、以字节为数据单元读取文件内容的类import java.io.FileInputStream; import java.io.IOException; public class FileInputStreamDemo { public static void main(String[] args) { FileInputStream fis = null; try { // 1. 创建FileInputStream对象 fis = new FileInputStream("D:/hello.txt"); // 2. 通过read方法读取文件内容 int b; String result = ""; while ((b = fis.read()) != -1) { result += (char) b; } System.out.println("文件内容:" + result); } catch (IOException e) { e.printStackTrace(); } finally { // 3. 通过close方法关闭流 if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } }OutputStream类类层结构:常用方法:方法说明void write(int b)将指定的字节输出到输出流中void write(byte[] b)将字节数组输出到输出流中void close()关闭输出流FileOutputStream类:是继承自OutputStream抽象类的、以字节为数据单元写入文件内容的类import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStreamDemo { public static void main(String[] args) { FileOutputStream fos = null; try { // 1. 创建FileOutputStream对象 fos = new FileOutputStream("D:/hello.txt"); // 2. 通过write方法写入文件内容 fos.write("Hello Java".getBytes()); System.out.println("文件写入成功!"); } catch (IOException e) { e.printStackTrace(); } finally { // 3. 通过close方法关闭流 if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } }1.2.2.2 字符流定义:字符流是以16位字符为数据单元的IO流特点:以16位字节为数据单元,操作文件的输入和输出分类:Reader类,Writer类Reader类类层结构:常用方法:方法说明int read()读取单个字符,当返回值为-1时表示读取到了文件的末尾int read(char[] c)读取多个字符,保存到字符数组c中,返回实际读取的字符数,当返回值为-1时表示读取到了文件的末尾void close()关闭输入流为何使用FileRader:是继承自Reader抽象类的、以字符为数据单元读取文件内容的类import java.io.FileReader; import java.io.IOException; public class FileReaderDemo { public static void main(String[] args) { // 传统 try-catch-finally 写法 FileReader fr = null; try { // 1. 创建FileReader对象 fr = new FileReader("D:/木兰诗.txt"); // 2. 通过read方法读取文件内容 int c; StringBuilder result = new StringBuilder(); while ((c = fr.read()) != -1) { result.append((char) c); } System.out.println(result.toString()); } catch (IOException e) { e.printStackTrace(); } finally { // 3. 通过close方法关闭流 if (fr != null) { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } } } }import java.io.FileReader; import java.io.IOException; public class FileReaderDemo { public static void main(String[] args) { // 使用 try-with-resources,自动关闭流 JDK7+版本写法, //不过现在大部分的写法都还是使用传统写法 //这个写法可以自动关闭流,是因为IO类实现了Closeable接口,而这个接口的父类是AutoCloseable try (FileReader fr = new FileReader("D:/木兰诗.txt")) { int c; StringBuilder result = new StringBuilder(); while ((c = fr.read()) != -1) { result.append((char) c); } System.out.println(result.toString()); } catch (IOException e) { e.printStackTrace(); } } }Writer类类层结构:常用方法:方法说明void write(String str)将str字符串里包含的字符输出到指定的输出流中void close()关闭输出流void flush()清空流FileWirter类(当需要用程序向磁盘文件写入中文内容时使用):继承自Writer抽象类的、以字符为数据单元写入文件内容的类// 如何使用FileWriter类向磁盘文件中写入中文内容? import java.io.FileWriter; import java.io.IOException; public class FileWriterDemo { public static void main(String[] args) { FileWriter fw = null; try { // 1. 创建FileWriter对象 fw = new FileWriter("D:/木兰诗.txt"); // 2. 通过write方法写入文件内容 fw.write("唧唧复唧唧,木兰当户织。"); } catch (IOException e) { e.printStackTrace(); } finally { // 3. 通过close方法关闭流 if (fw != null) { try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } } }1.2.3 按角色分类1.2.3.1 节点流作用:节点流是可以直接对特定的IO设备读取或写入数据的IO流1.2.3.2 处理流作用:处理流是用来包装节点流的、处理输入/输出功能的IO流,为节点流增强功能分类:处理流 (Process Stream) │ ├── 打印处理流 (Print Stream) │ ├── PrintStream │ └── PrintWriter │ ├── 转换处理流 (Conversion Stream) │ ├── InputStreamReader │ └── OutputStreamWriter │ ├── 缓冲处理流 (Buffered Stream) │ ├── BufferedInputStream │ ├── BufferedOutputStream │ ├── BufferedReader │ └── BufferedWriter │ └── 数据处理流 (Data Stream) ├── DataInputStream └── DataOutputStream缓冲处理流定义:缓冲流是以提高读写性能为目的的,具备缓冲区的处理流目的或作用:提高节点流的读写性能,具备缓冲区,用缓冲区来完成数据的IO操作。分类:BufferedInputStream字节缓冲输入流BufferedOutputStream字节缓冲输出流BufferedReader字符缓冲输入流BufferedWriter字符缓冲输出流BufferedInputStream字节缓冲输入流常用方法:方法说明BufferedInputStream(InputS