IO流

本文介绍了Java中文件操作的基本方法,包括File类的使用、文件遍历与筛选,以及RandomAccessFile类的读写操作。同时,还详细讲解了基本的IO流操作,如字节流的输入输出、缓冲流的应用、文件复制案例等,并探讨了对象序列化与反序列化的实现。

一、File-文件操作:

1.作用:File用于表示文件或目录,不能对文件的内容进行访问;

2.知识点结构图:


3.部分难点示例:

  a.listFiles()方法:

File dir = new File(".");
File[] subs = dir.listFiles();
for (File file : subs) {
	System.out.println(file.getName());
}
  b.FileFilter()方法:

File dir = new File(".");
File[] subs = dir.listFiles(new FileFilter() {
	@Override
	public boolean accept(File file) {
		return file.getName().endsWith(".txt");
	}
});
for (File file : subs) {
	System.out.println(file);
}

二、RandomAccessFile:

1.作用:Java提供了一个可以对文件随机访问的操作,包括读和写操作,该类名为RandomAccessFile。该类的读写是基于指针的操作;

2.知识点结构图:

三、基本IO操作:

1.总结分类:

  a.输入:读取数据;

  b.输出:写出数据;

  c.节点流(低级流):可以从或向一个特定的方向(节点)读写数据;

  d.处理流(高级流/过滤流):是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写;

  e.InputStream:是所有字节输入流的父类,其定义了基本的读取read方法;

  f.OutputStream:是所有字节输出流的父类,其定义了基本的写出write方法;

  g.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接;

2.文件流:

  a.FileOutputStream:是文件的字节输出流,使用该流可以以字节为单位将数据写入文件;

  b.FileInputStream:是文件的字节输入流,使用该流可以以字节为单位从文件中读取数据;

  c.默认情况下,FOS写入操作会将文件中原有数据全部清除;

  d.实现文件的复制操作案例:

FileInputStream fis = new FileInputStream("yx.txt");
FileOutputStream fos = new FileOutputStream("yx_copy.txt");
		
int len = -1;
byte[] buf = new byte[32];
while((len = fis.read(buf))!=-1) {
	fos.write(buf, 0, len);
}
fis.close();
fos.close();

3.缓冲流:

  a.BufferedOutputStream:缓冲输出流内部维护一个缓冲区,当缓冲区满时,一次性全部写出;

  b.BufferedInputStream:是缓冲字节输入流,内部维护一个缓冲区(字节数组);

  c.void flush():清空缓冲区,将缓冲区中的数据强制写出;

  d.实现基于缓存区的文件复制案例:

FileInputStream fis = new FileInputStream("fos.dat");
BufferedInputStream bis = new BufferedInputStream(fis);
		
FileOutputStream fos = new FileOutputStream("fos_copy.dat");
BufferedOutputStream bos = new BufferedOutputStream(fos);
		
int d = -1;
while((d = bis.read())!= -1) {
	bos.write(d);
}
System.out.println("复制完毕");
bis.close();
bos.close();
4.对象流:

  a.对象序列化概念:有时要把对象保存在硬盘上,又有时我们需要将对象传输到另一台计算机上等等这样的操作;

  b.ObjectOutputStream:是用来对对像进行序列化的输出流;

  c.实现对象序列化的方法为:void writeObject(Object obj)。该方法可以将给定的对象转换为一个字节序列后写出;

  d.ObjectInputStream:是用来对对象进行反序列化的输入流;

  e.实现对象反序列化的方法为:Object readObject()。该方法可以从流中读取字节并转换为对应的对象;

  f.Serializable接口:实现该接口不需要重写任何方法。其只是作为可序列化的标志;

  g.serialVersionUID:通常实现该接口的类需要提供一个常量serialVersionUID,表明该类版本;

  h.transient关键字:有时在对一个对象进行序列化时可以忽略某些不必要的属性,从而对序列化后得到的字节序列“瘦身”。被修饰的属性在序列化时其值被忽略;

补充:

  a.序列化流程图:


  b.案例实现序列化:

FileOutputStream fos = new FileOutputStream("emp.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Emp emp = new Emp("张山", 18, "男", 3000);
oos.writeObject(emp);
System.out.println("序列化完成");
oos.close();

  c.案例实现反序列化:

FileInputStream fis = new FileInputStream("emp.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
		
Emp emp = (Emp) ois.readObject();
System.out.println("反序列化完成");
System.out.println(emp);
ois.close();
5.基本IO操作知识结构图:



09-04
IO指的是输入(input)和输出(Output),是一种抽象概念,是对数据传输的总称,即数据在设备间的传输称为,其本质是数据传输。IO用来处理设备间数据传输问题,常见应用有文件复制、文件上传、文件下载等[^1]。 IO可以从多个维度进行分类: - 按方向分类:可分为输入和输出。 - 按传输单位分类:有字节和字符。 - 按功能分类:可分为节点和处理等。 在Java中,常见的IO包括以下几类: ### 字符 - `FileReader`/`FileWriter`:用于读写文件的字符。 - `BufferedReader`/`BufferedWriter`:提供缓冲功能,提高读写效率。 - `PipedReader`/`PipedWriter`:用于线程间通信的管道。 - `InputStreamReader`/`OutputStreamWriter`:用于字节和字符之间的转换。 - `PrintWriter`:方便进行格式化输出的字符输出。 ### 字节 - `InputStream`/`OutputStream`:字节的抽象基类。 - `FileInputStream`/`FileOutputStream`:用于读写文件的字节。 - `FilterInputStream`/`FilterOutputStream`:过滤的抽象基类。 - `BufferedInputStream`/`BufferedOutputStream`:提供缓冲功能的字节。 - `DataInputStream`/`DataOutputStream`:用于读写基本数据类型的字节。 - `ObjectInputStream`/`ObjectOutputStream`:用于对象的序列化和反序列化。 - `PrintStream`:方便进行格式化输出的字节输出。 以下是一些Java中使用IO的代码示例: #### 字节读取文件 ```java import java.io.FileInputStream; import java.io.IOException; public class ByteStreamReadExample { public static void main(String[] args) { try { // 创建一个读取文件的对象 FileInputStream fIpS = new FileInputStream("D:\\IdeaProjects\\untitled1\\untit__IO\\src\\Day_2\\fIpS_1.txt"); // 调用该对象的读取方法 // 字节读数据的标准代码 int read; while ((read = fIpS.read()) != -1) { System.out.print((char) read); } // 关闭此文件输入并释放与相关联的任何系统资源 fIpS.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` #### 字节写入文件 ```java import java.io.FileOutputStream; import java.io.IOException; public class OutputDemo2 { public static void main(String[] args) { try { // 1. 创建字节输出的对象 // 注意点:如果文件不存在,会帮我们自动创建出来. // 如果文件存在,会把文件清空. FileOutputStream fos = new FileOutputStream("C:\\itheima\\a.txt"); // 2. 写数据 传递一个整数时,那么实际上写到文件中的,是这个整数在码表中对应的那个字符. fos.write(98); // 3. 释放资源 fos.close(); // 告诉操作系统,我现在已经不再用这个文件了. } catch (IOException e) { e.printStackTrace(); } } } ``` #### 字符写入文件 ```java import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class CharacterStreamWriteExample { public static void main(String[] args) { try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:/news11.txt")))) { bw.write("hi,韩顺平教育"); } catch (IOException e) { e.printStackTrace(); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值