JAVA,IOIOIOIOIOIOIOIOIOIOIOIOIOIO
IO流
1 File类
package cn.javasm.demo; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class TestDemo {public static void main(String[] args) throws IOException {//表示创建了一个指向D盘下的test的file对象// file对象在创建的时候不会去检查文件是否真实存在// 仅仅是将当前的路径标记为一个file对象File file = new File("D:\\sdfdf\\dfdf\\dfd"); // 创建目录 当且仅当目录不存在时才会创建 // boolean mkdir = file.mkdir();// 创建目录 可以创建多级目录 // boolean mkdir = file.mkdirs(); // System.out.println(mkdir);// 创建文件 当且仅当文件不存在时才会创建 // boolean newFile = file.createNewFile(); // System.out.println(newFile);// 删除文件/目录// 是从计算机中彻底删除// 如果是目录,并且这个目录非空,则删除失败 // boolean delete = file.delete(); // System.out.println(delete);// 获取目录下的所有的子目录和子文件 // File[] files = file.listFiles(); // for (File file1 : files) { // System.out.println(file1); // }// 判断file是否是文件 // System.out.println(file.isFile()); // // 判断file是否是目录 // System.out.println(file.isDirectory()); // del(file); // boolean b = file.canWrite(); // System.out.println(b); // // 判断文件或者目录是否存在 // boolean exists = file.exists(); // System.out.println(exists);// 获取绝对路径:从盘符开始的路径// 相对路径:相对于某个目录的路径 // String absolutePath = file.getAbsolutePath(); // System.out.println(absolutePath); // 获取剩余空间 单位字节long freeSpace = file.getFreeSpace();System.out.println(freeSpace);// 获取总空间long totalSpace = file.getTotalSpace();System.out.println(totalSpace);// 获取可用空间long usableSpace = file.getUsableSpace();System.out.println(usableSpace); // // 获取目录/文件 名称 // // separatorChar-- 目录分隔符 在Windows系统是 \\ 在Linux中用/表示// pathSeparatorChar -- 路径分隔符 在Windows系统是; 在Linux中是: // String name = file.getName(); // System.out.println(name); // // String parent = file.getParent(); // System.out.println(parent); // // // 判断是否是绝对路径 // System.out.println(file.isAbsolute()); // // 判断是否是隐藏文件 // System.out.println(file.isHidden()); // // 获取修改时间距离1970年1月1日的毫秒值 // System.out.println(file.lastModified()); // 获取目录或文件名称中带数字的内容 匿名内部类 // File[] files = file.listFiles(new FileFilter() { // // 把所有的子目录和子文件通过参数传递到这个方法中 // // 如果返回true,对应的内容会留在结果中 // // 如果返回false,对应的内容会被筛选掉 // @Override // public boolean accept(File file1) { // return file1.getName().matches(".*\\d.*"); // } // }); // File[] files = file.listFiles(f -> f.getName().matches(".*\\d.*")); // File[] files = file.listFiles(new FilenameFilter() { // // dir 上一级目录 // // name 当前的目录/文件名称 // @Override // public boolean accept(File dir, String name) { // return name.matches(".*\\d.*"); // } // }); // File[] files = file.listFiles((d, n) -> n.matches(".*\\d.*")); // for (File file1 : files) { // System.out.println(file1); // }// 移动并且重命名 // boolean b = file.renameTo(new File("D:\\test\\西游记.txt")); // System.out.println(b);// 设置文件只读 // file.setReadOnly();// 设置是否可写 // file.setWritable(true); // 距离计算机元年的毫秒值// 设置修改时间file.setLastModified(1000L);} // 课堂练习:删除一个目录public static void del(File file){if (file.isDirectory()){// 如果是目录,获取目录中的所有的子目录和子文件File[] files = file.listFiles();for (File file1 : files) {del(file1);}} // 删除目录/文件file.delete();} }
课堂练习:统计工作空间中共有多少个java和class文件
static int javaCount = 0;static int classCount = 0;public static void count(File file){if (file.isDirectory()){// 获取所有的子目录和子文件File[] files = file.listFiles();for (File file1 : files) {count(file1);}}else if (file.getName().endsWith(".java")){javaCount++;}else if (file.getName().endsWith(".class")){classCount++;}}
2 IO流
2.1 概述
IO流:传输数据的一套机制
I: input 输入流
O:output 输出流
在java中分为字符流和字节流
字符流:只能读写纯文本的内容
字节流:可以读写所有的文件
输入流 | 输出流 | |
---|---|---|
字符流 | Reader | Writer |
字节流 | InputStream | OutputStream |
以上的四个类都是抽象类
2.2 FileWriter类
FileWriter类是字符输出流
public static void main(String[] args) {FileWriter fileWriter = null;try {// 创建字符输出流// 创建一个新文件// 如果原文件不存在,则使用创建的这个新文件// 如果原文件已存在,怎使用新文件覆盖原文件// append:追加访问fileWriter = new FileWriter("a.txt",true);// 向文件中写出一个字符串fileWriter.write("你好中国");// 冲涮缓冲区fileWriter.flush();} catch (IOException e) {throw new RuntimeException(e);} finally {// 释放资源 释放资源的时候会自动冲涮一次缓冲区try {if (fileWriter != null){fileWriter.close();}} catch (IOException e) {throw new RuntimeException(e);}finally {// 标记成垃圾对象fileWriter = null;} } }
2.3 FileReader类
public static void main(String[] args) throws IOException {// 创建字符输入流// 会检查路径是否真实存在FileReader fileReader = new FileReader("a.txt");// 一次读取一个字符,如果读取结束,返回-1 // int read = fileReader.read(); // System.out.println((char)read); // int ch; // while ((ch = fileReader.read()) != -1){ // System.out.println((char)ch); // }// 创建缓冲数组char[] chs = new char[5];// 把数据读取到数组中,并且返回实际读取到的内容 // int len = fileReader.read(chs); // System.out.println(len); // System.out.println(chs);int len;while ((len = fileReader.read(chs)) != -1){System.out.print(new String(chs,0,len));} // 释放资源fileReader.close();}
课堂练习:拷贝一个文本文件
public static void main(String[] args) throws IOException {// 拷贝文件// 创建字符输入和输出流 Charset:可以指定编码格式FileReader fileReader = new FileReader("D:\\西游记.txt", Charset.forName("gbk"));FileWriter fileWriter = new FileWriter("D:\\test\\三国演义.txt",Charset.forName("gbk")); // 定义实际读取到的长度int len;// 定义缓冲数组char[] chs = new char[1024 * 8];while ((len = fileReader.read(chs)) != -1){// 写出到新的文件中fileWriter.write(chs,0,len);} // 关流 从里到外关fileWriter.close();fileReader.close();}
2.4 BufferedReader和BufferedWriter
高效的字符流,里面自带缓冲区
public static void main(String[] args) throws IOException {// 拷贝文件BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\15681.txt"));BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("D:\\石头记.txt")); String str = null;while ((str = bufferedReader.readLine()) != null){bufferedWriter.write(str);// 换行bufferedWriter.newLine();} // 释放资源bufferedWriter.close();bufferedReader.close();} private static void demo1() throws IOException {// FileReader fileReader = new FileReader("D:\\西游记.txt", Charset.forName("gbk")); // // 使用装饰设计模式创建字符输入流 // BufferedReader bufferedReader = new BufferedReader(fileReader); // // 一次读取一行字符串 读取到换行符结束 不包含换行符 读取不到返回null // String s = bufferedReader.readLine(); // System.out.println(s); // String str = null; // while ((str = bufferedReader.readLine()) != null){ // System.out.println(str); // } // // // 释放资源 // bufferedReader.close(); // 创建字符输出流BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("D:\\a.txt"));bufferedWriter.write("水浒传");// 换行bufferedWriter.newLine();// 释放资源bufferedWriter.close();}
java23种常用设计模式之一:装饰者设计模式
模式:针对某一类问题的统一的处理方法
设计模式:在软件开发中针对遇到的问题所提供的统一的解决方案
装饰设计模式:利用同类对象来构建本类对象,然后对所构建的对象进行功能的改善和增强。
课堂练习:统计工作空间中代码的行数
public static void count(File file) throws IOException {if (file.isDirectory()){// 查找子目录和子文件File[] files = file.listFiles();for (File file1 : files) {count(file1);}}else if (file.getName().endsWith(".java")){//判断是否是java文件BufferedReader bufferedReader = new BufferedReader(new FileReader(file));while (bufferedReader.readLine() != null){count++;}bufferedReader.close();}}
2.5 字节流
private static void demo2() throws IOException {// 创建字节输入流对象FileInputStream fileInputStream = new FileInputStream("D:\\西游记.txt");// 一次读取一个字节 // fileInputStream.read();// 创建字节缓冲数组byte[] bys = new byte[1024];int len;while ((len = fileInputStream.read(bys)) != -1){System.out.print(new String(bys,0,len,"gbk"));}// 释放资源fileInputStream.close();} private static void demo1() throws IOException {// 创建字节输出流对象FileOutputStream fileOutputStream = new FileOutputStream("D:\\aaa.txt"); // 写出数据fileOutputStream.write("周杰伦".getBytes("gbk")); // 释放资源fileOutputStream.close();}
拷贝文件
private static void demo3() throws IOException {FileInputStream fileInputStream = new FileInputStream("D:\\win2020-2024(一键激活)pro.zip");FileOutputStream fileOutputStream = new FileOutputStream("D:\\test\\1010.zip"); // int len; // byte[] bys = new byte[1024]; // while ((len = fileInputStream.read(bys)) != -1){ // fileOutputStream.write(bys,0,len); // }// 读取所有的字节 // byte[] bytes = fileInputStream.readAllBytes(); // fileOutputStream.write(bytes);// fileInputStream.available() 读取到的最大字节byte[] bys = new byte[fileInputStream.available()];fileInputStream.read(bys);fileOutputStream.write(bys);// 关闭资源fileOutputStream.close();fileInputStream.close();}