引言
IO流是Java处理输入输出的核心API。本文系统讲解Java IO流的使用方法。
一、IO流分类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 字节流 ├── InputStream(输入) │ ├── FileInputStream │ ├── BufferedInputStream │ └── ObjectInputStream └── OutputStream(输出) ├── FileOutputStream ├── BufferedOutputStream └── ObjectOutputStream
字符流 ├── Reader(输入) │ ├── FileReader │ ├── BufferedReader │ └── InputStreamReader └── Writer(输出) ├── FileWriter ├── BufferedWriter └── OutputStreamWriter
|
二、字节流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| try (FileInputStream fis = new FileInputStream("input.txt")) { int data; while ((data = fis.read()) != -1) { System.out.print((char) data); } } catch (IOException e) { e.printStackTrace(); }
try (FileOutputStream fos = new FileOutputStream("output.txt")) { String content = "Hello, World!"; fos.write(content.getBytes()); } catch (IOException e) { e.printStackTrace(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| try (BufferedInputStream bis = new BufferedInputStream( new FileInputStream("input.txt"))) { byte[] buffer = new byte[1024]; int len; while ((len = bis.read(buffer)) != -1) { System.out.println(new String(buffer, 0, len)); } }
try (BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("output.txt"))) { bos.write("Hello".getBytes()); bos.flush(); }
|
三、字符流
3.1 FileReader和FileWriter
1 2 3 4 5 6 7 8 9 10 11 12
| try (FileReader reader = new FileReader("input.txt")) { int data; while ((data = reader.read()) != -1) { System.out.print((char) data); } }
try (FileWriter writer = new FileWriter("output.txt")) { writer.write("Hello, World!"); }
|
3.2 BufferedReader和BufferedWriter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| try (BufferedReader br = new BufferedReader( new FileReader("input.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } }
try (BufferedWriter bw = new BufferedWriter( new FileWriter("output.txt"))) { bw.write("Line 1"); bw.newLine(); bw.write("Line 2"); }
|
四、转换流
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| try (InputStreamReader isr = new InputStreamReader( new FileInputStream("input.txt"), "UTF-8")) { int data; while ((data = isr.read()) != -1) { System.out.print((char) data); } }
try (OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream("output.txt"), "UTF-8")) { osw.write("Hello, 世界!"); }
|
五、对象流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; }
try (ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("person.dat"))) { Person person = new Person("Alice", 25); oos.writeObject(person); }
try (ObjectInputStream ois = new ObjectInputStream( new FileInputStream("person.dat"))) { Person person = (Person) ois.readObject(); System.out.println(person); }
|
六、文件操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import java.io.File;
File file = new File("test.txt"); if (!file.exists()) { file.createNewFile(); }
File dir = new File("mydir"); dir.mkdir(); dir.mkdirs();
file.delete();
System.out.println("文件名: " + file.getName()); System.out.println("绝对路径: " + file.getAbsolutePath()); System.out.println("文件大小: " + file.length()); System.out.println("是否是目录: " + file.isDirectory()); System.out.println("是否是文件: " + file.isFile());
File[] files = dir.listFiles(); for (File f : files) { System.out.println(f.getName()); }
|
七、NIO
7.1 Channel和Buffer
1 2 3 4 5 6 7 8 9 10 11 12 13
| try (FileChannel channel = FileChannel.open( Paths.get("input.txt"), StandardOpenOption.READ)) { ByteBuffer buffer = ByteBuffer.allocate(1024); while (channel.read(buffer) != -1) { buffer.flip(); while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } buffer.clear(); } }
|
7.2 Files工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| List<String> lines = Files.readAllLines(Paths.get("input.txt"));
Files.write(Paths.get("output.txt"), lines);
Files.copy(Paths.get("source.txt"), Paths.get("target.txt"));
Files.delete(Paths.get("file.txt"));
Files.walk(Paths.get("mydir")) .forEach(System.out::println);
|
八、实战示例
8.1 文件复制
1 2 3 4 5 6 7 8 9 10 11 12 13
| public void copyFile(String source, String target) { try (FileInputStream fis = new FileInputStream(source); FileOutputStream fos = new FileOutputStream(target)) { byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { fos.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } }
|
8.2 文本文件统计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public void analyzeFile(String filename) throws IOException { try (BufferedReader br = new BufferedReader( new FileReader(filename))) { int lines = 0; int words = 0; int chars = 0; String line; while ((line = br.readLine()) != null) { lines++; chars += line.length(); words += line.split("\\s+").length; } System.out.println("行数: " + lines); System.out.println("单词数: " + words); System.out.println("字符数: " + chars); } }
|
总结
Java IO核心:
- 字节流:处理二进制数据
- 字符流:处理文本数据
- 缓冲流:提高IO效率
- 对象流:序列化对象
- NIO:更高效的IO操作
参考资料