ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

File、IO流

File、IO流

File用于操作文件,IO流用于读写数据

1.File

文件对象常用方法

package com.popo.filedemo; import java.io.File; import java.io.IOException; public class FileDemo1 { public static void main(String[] args) throws Exception { // 文件对象常用方法 File f1 = new File("D:\\test.txt"); System.out.println(f1.exists()); System.out.println(f1.isFile()); System.out.println(f1.isDirectory()); System.out.println(f1.getName()); System.out.println(f1.length()); // 字节个数 System.out.println(f1.lastModified()); System.out.println(f1.getPath()); // 相对路径,以javase2026为根目录 System.out.println(f1.getAbsolutePath()); // 绝对路径 File f2 = new File("D:\\test_dir"); System.out.println(f2.createNewFile()); // 创建文件,返回布尔值 System.out.println(f2.mkdir()); // 创建一级文件夹 System.out.println(f2.mkdirs()); // 创建多级文件夹 System.out.println(f2.delete()); // 删除文件或空文件夹 // 遍历文件夹 File f3 = new File("D:\\"); String[] files = f3.list(); // 保存目录中的一级文件和文件夹名称到数组中 if (files != null) { for (String file : files) { System.out.println(file); } } File[] filesList = f3.listFiles(); // 保存目录中的一级文件和文件夹对象到数组中 if (filesList != null) { for (File file : filesList) { System.out.println(file.getName()); } } } }

搜索指定文件夹下的文件

package com.popo.filedemo; import java.io.File; public class FileDemo2 { public static void main(String[] args) { String path = "D:\\Common_software"; String fileName = "QQ.exe"; File dir = new File(path); searchFile(dir, fileName); } public static void searchFile(File dir, String fileName) { // 搜索指定文件夹下的文件 File[] files = dir.listFiles(); if (files != null && files.length > 0) { for (File file : files) { if (file.isDirectory()) { searchFile(file, fileName); } else { if (file.getName().contains(fileName)) { System.out.println("找到文件:" + file.getAbsolutePath()); } } } } } }

字符串的编码和解码

package com.popo.filedemo; import java.io.UnsupportedEncodingException; import java.util.Arrays; public class FileDemo3 { public static void main(String[] args) throws UnsupportedEncodingException { // 字符串的编码和解码 String str = "Hello, 世界"; byte[] bytes = str.getBytes(); // 字符串编码 System.out.println(bytes.length); // 7 + 2 * 3 System.out.println(Arrays.toString(bytes)); String newStr = new String(bytes); // 字符串解码 System.out.println(newStr); String str2 = "Hello, 世界"; byte[] bytes2 = str2.getBytes("GBK"); // 字符串编码 System.out.println(bytes2.length); // 7 + 2 * 2 System.out.println(Arrays.toString(bytes2)); String newStr2 = new String(bytes2, "GBK"); // 字符串解码 System.out.println(newStr2); } }

2.IO流

IO流分为字节流和字符流

字节流适合做数据的转移,因为中英文混在一起,按字节读取会出现乱码

字符流适合读取文本

字节流

字节输入流

package com.popo.iodemo; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; public class FileInputStreamDemo1 { public static void main(String[] args) throws Exception { // 创建字节输入流对象 InputStream is = new FileInputStream("pro_day03_file_io\\src\\com\\popo\\iodemo\\test1.txt"); // 1.逐个字节读出 // int b = is.read(); // while (b != -1) { // System.out.print((char) b); // b = is.read(); // } // 2.字节数组读出 byte[] bytes = new byte[3]; int len; while ((len = is.read(bytes)) != -1) { System.out.print(new String(bytes, 0, len)); // aaa666bbc } // 3.读出全部字节 // byte[] allBytes = is.readAllBytes(); // System.out.println(new String(allBytes)); } }

字节输出流

package com.popo.iodemo; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; public class FileOutputStreamDemo2 { public static void main(String[] args) throws Exception { // 创建字节输出流对象,追加内容 OutputStream os = new FileOutputStream("pro_day03_file_io/src/com/popo/iodemo/test2.txt", true); // 1.逐个字节写入 os.write(97); os.write('a'); os.write("\r\n".getBytes()); // 2.字节数组写入 byte[] bytes = "我爱Java666".getBytes(); os.write(bytes); os.write("\r\n".getBytes()); // 3.字节数组的一部分写入 os.write(bytes, 0, 3); os.write("\r\n".getBytes()); // 4.关闭流 os.close(); } }

文件复制

package com.popo.iodemo; import java.io.*; public class CopyDemo3 { public static void main(String[] args) { // 文件复制 copyFile("pro_day03_file_io/src/com/popo/iodemo/test2.txt", "pro_day03_file_io/src/com/popo/iodemo/test3.txt"); } public static void copyFile(String srcPath, String destPath) { // 使用try-with-resources语句自动关闭资源 try (InputStream is = new FileInputStream(srcPath); OutputStream os = new FileOutputStream(destPath);) { byte[] bytes = new byte[1024]; int len; while ((len = is.read(bytes)) != -1) { os.write(bytes, 0, len); } } catch (IOException e) { e.printStackTrace(); } } }

字符流

文件字符输入流

package com.popo.iodemo; import java.io.FileReader; import java.io.Reader; public class FileReaderDemo4 { public static void main(String[] args) { // 文件字符输入流 try (Reader fr = new FileReader("pro_day03_file_io/src/com/popo/iodemo/test4.txt")) { int ch = fr.read(); System.out.println((char)ch); char[] buffer = new char[3]; int len; while ((len = fr.read(buffer)) != -1) { System.out.print(new String(buffer, 0, len)); } }catch (Exception e) { e.printStackTrace(); } } }

文件字符输出流

package com.popo.iodemo; import java.io.FileWriter; public class FileWriterDemo5 { public static void main(String[] args) { // 文件字符输出流 try (FileWriter fw = new FileWriter("pro_day03_file_io/src/com/popo/iodemo/test5.txt", true)) { // 1.写字符串 fw.write("hello 世界\r\n"); // 2.写字符串的一部分 fw.write("hello 世界", 6, 2); // 3.写一个字符 fw.write('a'); // 4.写一个字符数组 fw.write("hello 世界".toCharArray()); // 5.写字符数组的一部分 fw.write("hello 世界".toCharArray(), 0, 2); // 6.刷新缓冲区,关闭流时会自动刷新 fw.flush(); }catch (Exception e) { e.printStackTrace(); } } }

缓冲字节流

package com.popo.iodemo; import java.io.*; public class BufferedInputAndOutputStreamDemo6 { public static void main(String[] args) { // 文件复制 copyFile("pro_day03_file_io/src/com/popo/iodemo/test2.txt", "pro_day03_file_io/src/com/popo/iodemo/test3.txt"); } public static void copyFile(String srcPath, String destPath) { // 把低级的字节输入输出流包装成缓冲字节输入输出流,默认的缓冲区大小为8KB // 先用底层流读出8KB的数据,再从缓冲区逐次读出1KB try (InputStream is = new FileInputStream(srcPath); BufferedInputStream bis = new BufferedInputStream(is); OutputStream os = new FileOutputStream(destPath); BufferedOutputStream bos = new BufferedOutputStream(os)) { byte[] bytes = new byte[1024]; int len; while ((len = bis.read(bytes)) != -1) { bos.write(bytes, 0, len); } } catch (IOException e) { e.printStackTrace(); } } }

缓冲字符流

缓冲字符输入流

package com.popo.iodemo; import java.io.BufferedReader; import java.io.FileReader; import java.io.Reader; public class BufferedReaderDemo7 { public static void main(String[] args) { // 把低级的字符输入流包装成高级的缓冲字符输入流,缓冲区大小为8KB try (Reader fr = new FileReader("pro_day03_file_io/src/com/popo/iodemo/test7.txt"); BufferedReader br = new BufferedReader(fr); ) { String line; // 特有方法,按行读取字符串 while ((line = br.readLine()) != null) { System.out.println(line); } }catch (Exception e) { e.printStackTrace(); } } }

缓冲字符输出流

package com.popo.iodemo; import java.io.BufferedWriter; import java.io.FileWriter; public class BufferedWriterDemo8 { public static void main(String[] args) { // 把低级的字符输出流包装成高级的缓冲字符输出流,缓冲区大小为8KB try (FileWriter fw = new FileWriter("pro_day03_file_io/src/com/popo/iodemo/test5.txt", true); BufferedWriter bw = new BufferedWriter(fw); ) { bw.write("hello 世界"); // 特有方法,写入一个行分隔符 bw.newLine(); bw.write("hello 世界", 6, 2); bw.write('a'); bw.write("hello 世界".toCharArray()); bw.write("hello 世界".toCharArray(), 0, 2); }catch (Exception e) { e.printStackTrace(); } } }

字符输入转换流

package com.popo.iodemo; import java.io.*; public class InputStreamReaderDemo9 { public static void main(String[] args) { // 解决文件编码问题 // 字符输入转换流:把字节输入流转换为字符输入流,按原始字节读取,转换为指定字符编码的字符流 try (InputStream fis = new FileInputStream("pro_day03_file_io/src/com/popo/iodemo/test9.txt"); InputStreamReader isr = new InputStreamReader(fis, "GBK"); BufferedReader br = new BufferedReader(isr); ) { String line; // 特有方法,按行读取字符串 while ((line = br.readLine()) != null) { System.out.println(line); } }catch (Exception e) { e.printStackTrace(); } } }

打印流

package com.popo.iodemo; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.PrintStream; import java.io.PrintWriter; public class PrintStreamAndPrintWriterDemo10 { public static void main(String[] args) { // 打印流:写什么就打印什么,97不会变成a try (PrintStream ps = new PrintStream("pro_day03_file_io/src/com/popo/iodemo/ps10.txt"); PrintWriter pw = new PrintWriter("pro_day03_file_io/src/com/popo/iodemo/pw10.txt"); ) { ps.println(97); ps.println(true); ps.println("你好"); }catch (Exception e) { e.printStackTrace(); } } }

数据流

package com.popo.iodemo; import java.io.*; public class DataOutputStreamAndDataInputStreamDemo11 { public static void main(String[] args) { // 用于通信 // 数据输出流和数据输入流:写入和读取数据类型 try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("pro_day03_file_io/src/com/popo/iodemo/test11.txt")); DataInputStream dis = new DataInputStream(new FileInputStream("pro_day03_file_io/src/com/popo/iodemo/test11.txt")) ) { dos.writeInt(100); dos.writeDouble(12.34); dos.writeUTF("hello"); // 读出和写入的顺序、类型必须一致 System.out.println(dis.readInt()); System.out.println(dis.readDouble()); System.out.println(dis.readUTF()); }catch (Exception e) { e.printStackTrace(); } } }

IO框架

将jar包复制到lib目录下后,右键将其“add to library”

FileUtils和IOUtils的常用方法

package com.popo.iodemo; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import java.io.*; public class CommonsIODemo12 { public static void main(String[] args) { try { // FileUtils的常用方法 // 1.复制文件 FileUtils.copyFile(new File("pro_day03_file_io/src/com/popo/iodemo/ci12.txt"), new File("pro_day03_file_io/src/com/popo/iodemo/co12.txt")); // 2.复制文件夹 FileUtils.copyDirectory(new File("pro_day03_file_io/src/com/popo/iodemo/ci12"), new File("pro_day03_file_io/src/com/popo/iodemo/co12")); // 3.删除文件夹 FileUtils.deleteDirectory(new File("pro_day03_file_io/src/com/popo/iodemo/co12")); // 4.读取文件到字符串 String content = FileUtils.readFileToString(new File("pro_day03_file_io/src/com/popo/iodemo/ci12.txt"), "utf-8"); System.out.println(content); // 5.字符串写入文件 FileUtils.writeStringToFile(new File("pro_day03_file_io/src/com/popo/iodemo/ci12.txt"), content, "utf-8", true); // IOUtils的常用方法 // 1.复制文件 IOUtils.copy(new FileInputStream("pro_day03_file_io/src/com/popo/iodemo/ci12.txt"), new FileOutputStream("pro_day03_file_io/src/com/popo/iodemo/co12.txt")); IOUtils.copy(new FileReader("pro_day03_file_io/src/com/popo/iodemo/ci12.txt"), new FileWriter("pro_day03_file_io/src/com/popo/iodemo/co12.txt")); // 2.写数据 IOUtils.write(content, new FileOutputStream("pro_day03_file_io/src/com/popo/iodemo/co12.txt"), "utf-8"); } catch (IOException e) { e.printStackTrace(); } } }
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进