Java IO流

IO 流

  • File 类
  • 字节流
  • 字符流
  • 处理流
  • 缓冲流
  • 序列化和反序列化

File 类

​ Java 会用对象来表示文件,Java 提供了 java.io.File 类,使用该类的构造函数可以创建文件对象以表示一个物理资源,File 的常用方法如表:

方法描述
public File(String pathname)根据路径创建对象
public String getName()获取文件名
public String getParent()获取文件所在目录
pubilc File getParentFile()获取文件所在目录对应的 File 对象
public String getPath()获取文件路径
public boolean exists()判断文件是否存在
public boolean isDirectory()判断对象是否为目录
public boolean isFile()判断对象是否为文件
public long length()获取文件的大小
public boolean createNewFile()根据当前对象创建文件
public boolean delete()删除对象
public boolean mkdir()根据当前对象创建目录
public boolean renameTo(File dest)为已存在的对象重命名

File 常用方法使用:

public class TestFile {
	public static void main(String[] args) {
		File file = new File("E:/test.txt");
		boolean flag = file.exists();
		System.out.println("文件是否存在:"+flag);
		String fileName = file.getName();
		System.out.println("文件名:"+fileName);
		long length = file.length();
		System.out.println("文件的大小:"+length);
		String path = file.getPath();
		System.out.println("文件路径:"+path);
		String parent = file.getParent();
		System.out.println("文件所在的目录:"+parent);
		File parentFile = file.getParentFile();
		boolean flag2 = parentFile.isDirectory();
		System.out.println("文件的父级对象是否为目录:"+flag2);
		boolean flag3 = parentFile.isFile();
		System.out.println("文件的父级对象是否为文件:"+flag3);
		File file2 = new File("E:/test2.txt");
		System.out.println("新生文件是否存在:"+file2.exists());
		try {
			System.out.println("新生文件是否创建成功:"+file2.createNewFile());
		}catch(IOException e) {
			e.printStackTrace();
		}
		File file3 = new File("E:/test3.txt");
		System.out.println("新文件重命名是否成功:"+file2.renameTo(file3));
		System.out.println("新文件删除是否成功:"+file2.delete());
	}
}

运行结果:

在这里插入图片描述


字节流

​ 接下来我们学习如何读取 File 对象,就是本章重点内容——IO 流,即通过输入输出流完成对文件的读写。流是一种以先进先出的方式传输数据的序列,Java 中的流有很多种不同的分类:

  • 按照方向分,可以分为输入流和输出流
  • 按照单位分,可以分为字节流和字符流,字节流指每次处理数据是以字节为单位的,字符流是指每次处理数据是以字符为单位的
  • 按照功能分,可以分为节点流和处理流

字节流按照方向分又可以分为输入流(InputStream)和输出流(OutputStream),InputStream 是 java.io 包中的顶层父类,并且是一个抽象类,InputStream 实现了 Closeable 接口,该接口的作用是每次操作结束之后完成资源释放,InputStream 常用方法如表:

方法描述
public abstract int read() throws IOException以字节为单位读取数据
public int read(byte b[]) throws IOException将数据存入 byte 类型数组中,并返回数据长度
public int read(byte b[],int off,int len) throws IOException将数据存入 byte 类型数组的指定区间中,并返回数据长度
public int available() throws IOException返回当前数据流中未读取的数据个数
pubic void close() throws IOException关闭数据流

​ 在实际开发中不能直接实例化 InputStream 类的对象,应该实例化其实现了抽象方法的子类 FileInputStream

public class TestFileRead {
	public static void main(String[] args) {
		try {
			InputStream inputStream = new FileInputStream("E:/test.txt");
			int temp = 0;
			System.out.println("当前未读取的数据个数:"+inputStream.available());
			while((temp = inputStream.read()) != -1){
				System.out.println(temp+",当前未读取的数据个数:"+inputStream.available());
			} 
			inputStream.close();
			System.out.println("***********************");
			inputStream = new FileInputStream("E:/test.txt");
			byte[] bytes = new byte[6];
			int length = inputStream.read(bytes);
			System.out.println("数据流长度:"+length);
			System.out.println("遍历 byte 数组");
			for(byte b : bytes) {
				System.out.println(b);
			}
			inputStream.close();
			System.out.println("***********************");
			inputStream = new FileInputStream("E:/test.txt");
			bytes = new byte[10];
			length = inputStream.read(bytes, 2, 7);
			System.out.println("数据流长度:"+length);
			System.out.println("遍历 byte 数组");
			for(byte b : bytes) {
				System.out.println(b);
			}
			inputStream.close();
			System.out.println("**************************");
			
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

在这里插入图片描述

OutputStream 跟 InputStream 类似,也是一个抽象父类。OutputStream 除了实现 Closeable 接口之外,还实现了 Flushable 接口。Flushable 接口可以将缓冲区的数据同步到输出流中,保证数据的完整性,OutputStream 的常用方法如表:

方法描述
public abstract void write(int b) throws IOException以字节为单位写数据
public void write(byte b[]) throws IOException将 byte 类型数组中的数据写出
public void wirte(byte b[],int off, int len) throws IOException将 byte 类型数组中指定区间的数据写出
pulblic void flush() throws IOException可以强制将缓冲区的数据同步到输出流中
public void close() throws IOException关闭数据流

​ 我们在使用 OutputStream 进行写操作时,不能直接实例化 OutputStream 类的对象,应该实例化其实现了抽象方法的子类 FileOutputStream,我们学习对 OutputStream 各种常用方法的使用

  • write(int b)方法的使用
public class Test{
    public static void main(String[] args){
        try{
            OutputStream outputStream = new FileOutputStream("E:/test2.txt");
            outputStream.write(99);
            outputStream.flush();
            outputStream.close();
        }catch(IOException e){
            
        }
    }
}

代码会在 E 盘下创建 test2.txt 文件,并且行文件中写入 byte 类型的数据 99.而byte 类型的数据会转换成字符,99 对应的是 ‘c’ ,所以运行结果我们会在 E 盘下 test2.txt 文件中看到 c

OutputStream 的 write(byte b[]) 方法的使用

public class OutputTest {
	public static void main(String[] args) {
		try {
			OutputStream outputStream = new FileOutputStream("E:/test2.txt");
			byte[] bytes = new byte[] {105,111,99};
			outputStream.write(bytes);
			outputStream.flush();
			outputStream.close();
		}catch(IOException e) {
			
		}
	}
}

{105,111,99} 转换成字符串为 “ioc” ,所以我们可以在文件中看到 ioc

OutputStream 的 write(byte b[] int off, int len) 方法的使用

public class OutputTest {
	public static void main(String[] args) {
		try {
			OutputStream outputStream = new FileOutputStream("E:/test2.txt");
			byte[] bytes = new byte[] {105,111,99};
			outputStream.write(bytes, 1, 2);
			outputStream.flush();
			outputStream.close();
		}catch(IOException e) {
			
		}
	}
}

对数组 {105,111,99} 进行截取,从下标 1 开始取,长度为 2 ,所以出去的值是 “111,99”,转换为字符串为 “oc” ,随意我们可在文件中看到 oc


字符流

​ 字符流是有别于字节流的另一种数据流,两者的区别在于每次处理的数据单位不同一个是以字节为单位,一个是以字符为单位。字符流也分为输入流(Reader)和输出流(Writer) 。

​ Reader 是一个抽象类,实现类 Readable 和 Closeable 接口。Readable 接口的作用是可以将数据以字符的形式读入缓冲区,Reader 常用方法如表:

方法描述
public int read() throws IOException以字符为单位读数据
public int read(char cbuf[]) throws IOException将数据读入 char 类型数组,并返回数据长度
public abstract int read(char cbuf[], int off, int len) throws IOException将数据读入 char 类型数组的指定区间,并返回数据长度
public abstract void close() throws IOException关闭数据流
public long transferTo(Writer out)将数据直接读入字符输出流

我们在使用 Reader 进行读入操作时,不能直接实例化 Reader 对象,应该实例化其实现了抽象方法的子类 FileReader。FileReader 又继承了 InputStreamReader ,这个类才是 Reader 的直接子类,他的作用是将字节流转为字符流,属于处理流,我们在这儿直接使用 FileReader 进行实例操作,同时看看与字节流的区别(字符编码:utf-8,test.txt文件的内容为:你好)

public class TestReader {
	public static void main(String[] args) {
		try {
			System.out.println("用字符读数据");
			Reader reader = new FileReader("E:/test.txt");
			int temp = 0;
			while((temp = reader.read()) != -1) {
				System.out.println(temp);
			}
			reader.close();
			System.out.println("用字节读数据");
			InputStream inputStream = new FileInputStream("E:/test.txt");
			temp = 0;
			while((temp = inputStream.read()) != -1) {
				System.out.println(temp);
			}
			inputStream.close();
		}catch(IOException e) {
			
		}
	}
}

运行结果:

用字符读数据
20320
22909
用字节读数据
228
189
160
229
165
189

在 utf-8 中 1 个汉字对应三个字节,所以 “228,189,160” 三个字节组合起来表示 ”你“。

Reader 其他常用方法的使用:

public class TestReader2 {
	public static void main(String[] args) {
		try {
			Reader reader = new FileReader("E:/test.txt");
			char[] chars = new char[8];
			int length = reader.read(chars);
			System.out.println("数据流长度:"+length);
			System.out.println("遍历 char 数组:");
			for(char c : chars) {
				System.out.println(c);
			}
			reader.close();
			System.out.println("--------------------------");
			reader = new FileReader("E:/test.txt");
			chars = new char[8];
			length = reader.read(chars, 2, 6);
			System.out.println("数据流长度:"+length);
			System.out.println("遍历 char 数组");
			for(char c : chars) {
				System.out.println(c);
			}
			reader.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

在这里插入图片描述

字符输出流 Writer 实现了 Appendable 接口可以将 char 类型的数据读入数据缓冲区,Writer 的常用方法如表:

方法描述
public void write(int c) throws IOException以字符为单位写数据
pulbic void write(char cbuf[]) throws IOException将 char 类型数组中的数据写出
public abstract void write(char cbuf[], int off, int len) throws IOException将 char 类型数组中指定区间的数据写出
public void write(String str) throws IOException将 String 类型的数据写出
public void write(String str, int off, int len) throws IOException将 String 类型指定区间的数据写出
public abstract void flush() throws IOException可以强制将缓冲区的数据同步到输出流中
public abstract void close() throws IOException关闭数据流
我们在使用 Writer 进行写出操作时,不能直接实例化 Writer 对象,应该实例化其实现了抽象方法的子类 FileWriter ,FileWriter 有继承自 OutputStreamWriter,和 InputStreamReader 一样,OutputStreamWriter 也属于处理流,我们来学习 Writer 的常用方法如何使用:
  • write(int c) 方法
public class TestWriter {
	public static void main(String[] args) {
		try {
			Writer writer = new FileWriter("E:/test2.txt");
			writer.write(20320);
			writer.write(22909);
			writer.flush();
			writer.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

你好

  • write(char cbuf[]) 方法
public class TestWriter {
	public static void main(String[] args) {
		try {
			Writer writer = new FileWriter("E:/test2.txt");
			char[] chars = {'你','好','世','界'};
			writer.write(chars);
			writer.flush();
			writer.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

你好世界

  • write(char cbuf[], int off, int len)
public class TestWriter {
	public static void main(String[] args) {
		try {
			Writer writer = new FileWriter("E:/test2.txt");
			char[] chars = {'你','好','世','界'};
			writer.write(chars, 2, 2);
			writer.flush();
			writer.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

世界

  • write(String str) 方法
public class TestWriter {
	public static void main(String[] args) {
		try {
			Writer writer = new FileWriter("E:/test2.txt");
			String str = "Hello World,你好世界";
			writer.write(str);
			writer.flush();
			writer.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

Hello World,你好世界

  • write(String str, int off, int len)
public class TestWriter {
	public static void main(String[] args) {
		try {
			Writer writer = new FileWriter("E:/test2.txt");
			String str = "Hello World,你好世界";
			writer.write(str, 10 ,6);
			writer.flush();
			writer.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

d,你好世界


处理流

​ 字节流是基础管道,字符流是在字节流的基础上转换来的,Java 提供了完成转换的类,按照输入和输出两个方向分为输入转换流(InputStreamReader) 和输出转换流(OutputStreamWriter) 。FileReader 继承自 InputStreamReader ,即输入转换流。通过这个类将字节流转为字符流,字节是基本单位,所以是基础管道。同理,FileWriter 继承自 OutputStreamWriter。

处理流将字节流转换为字符流的过程:

在这里插入图片描述

InputStreamReader 的使用(test.txt文件中的内容为:Hello World):

class InputStreamReaderDemo {
	public static void main(String[] args) {
		try {
			InputStream inputStream = new FileInputStream("E:/test.txt");
			InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
			Reader reader = inputStreamReader;
			char[] chars = new char[1024];
			int length = reader.read(chars);
			reader.close();
			String result = new String(chars,0,length);
			System.out.println(result);
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

Hello World

OutputStreamWriter 的使用:

public class OutputStreamWriterDemo {
	public static void main(String[] args) {
		String str = "你好 世界";
		try {
			OutputStream outputStream = new FileOutputStream("E:/test2.txt");
			OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
			Writer writer = outputStreamWriter;
			writer.write(str);
			writer.flush();
			writer.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

创建文件,内容为:你好 世界


缓冲流

实际上在真实的运行环境中,无论是使用哪种流读取数据都需要频繁地访问硬盘,这样对硬盘的损伤比较大,而且效率不高。为了解决这一个问题,减少访问硬盘时的资源开销,我们引入了缓冲流。缓冲流自带缓冲区,可以一次性从硬盘读取部分数据存入缓冲区,在写入程序内存中。

在这里插入图片描述

​ 缓冲流也属于处理流,即不能直接关联文件进行操作,只能对已存在的节点流进行包装,如何区分节点流和处理流呢?如果该流可以直接关联了文件,即提供了一个参数为 File 对象或文件路径的构造函数 ,该流就是节点流。如果该流不能直接关联文件,即没有提供参数为 File 对象或文件路径的构造函数,而必须依赖其他流来实例化的就是处理流。缓冲流又可以分为字节缓冲流和字符缓冲流,再细分又可分为字节输入缓冲流和字节输出缓冲流,以及字符输入缓冲流和字符输出缓冲流。

  • 缓冲流
    • 字节缓冲流
      • 字节输入缓冲流(BufferedInputStream)
      • 字节输出缓冲流(BufferedOutputStream)
    • 字符缓冲流
      • 字符输入缓冲流(BufferedReader)
      • 字符输出缓冲流(BufferedWriter)

输入缓冲流

字节输入缓冲流

字节输入出缓冲流 BufferedInputStream 的常用方法与 InputStream 类似,并且我们说过缓冲流是处理流,必须依赖于已存在的流才能创建实例化对象,接下来使用 BufferedInputStream 来读取 test.txt.

test.txt 的内容为:

Java 是一门面向对象编程语言,不仅吸收了 C++ 语言的各种优点,
还摒弃了 c++ 里面难以理解的多继承,指正等概念,因此 Java 语言具有功能强大和简单易用两个特性
Java 语言作为静态面向对象编程语言的代表,极好的实现了面向对象理论,
允许程序员以优雅的思维方式进行复杂的编程。
Java 具有简单性、面向对象、分布式、健壮性、安全性,平台独立与可移植性。
多线程、动态性等特点
Java 可以编写桌面应用程序、Web应用程序
分布式系统和镶入式系统应用程序等

  • BufferedInputStream 的 read() 方法的使用:
public class Test{
    public static void main(String[] args){
        try{
        	 InputStream inputStream = new FileInputStream("E:/test.txt");
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
            int temp = 0;
            while((temp = bufferedInputStream.read()) != -1){
                System.out.println(temp);
            }
            bufferedInputStream.close();
            inputStream.close();
        }catch(IOException e){
            
        }
    }
}

运行结果:

一堆数字。。。。

  • BufferedInputStream 的 read(byte b[]) 方法
public class Test{
    public static void main(String[] args){
        try{
            InputStream inputStream = new FileInputStream("E:/test.txt");
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
            byte bytes = new byte[1024];
            int length = bufferedInputStream.read(bytes);
            for(byte b : bytes){
                System.out.println(b);
            }
            bufferedInputStream.close();
            inputStream.close();
        } catch(IOException e){
            
        }
    }
}

运行结果:

一堆数字

  • BufferedInputStream 的 read(byte b[], int off, int len) 方法
public class Test{
    public static void main(String[] args){
        try{
            InputStream inputStream = new FileInputStream("E:/test.txt");
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
            byte bytes = new byte[1024];
            int length = bufferedInputStream.read(bytes,10,10);
            for(byte b : bytes){
                System.out.println(b);
            }
            bufferedInputStream.close();
            inputStream.close();
        } catch(IOException e){
            
        }
    }
}

运行结果:

中间有是个非零的数字,其余都为 0

字符输入缓冲流

同样是读取 test.txt ,接下来我们看看字符输入缓冲流 BufferedReader。

BufferedReader 的 readLine() 方法可以直接读取一整行数据

public class Test{
    
    public static void main(String[] args){
        try{
            Reader reader = new FileReader("E:/test.txt");
            BufferedReader bufferedReader = new BufferedReader(reader);
            String str = "";
            while((str = bufferedReder.readLine()) != null){
                System.out.println(str);
            }
            bufferedReader.close();
            reader.close();
        }catch(IOException e){
            
        }
    }
}

运行结果:

Java 是一门面向对象编程语言,不仅吸收了 C++ 语言的各种优点,
还摒弃了 c++ 里面难以理解的多继承,指正等概念,因此 Java 语言具有功能强大和简单易用两个特性
Java 语言作为静态面向对象编程语言的代表,极好的实现了面向对象理论,
允许程序员以优雅的思维方式进行复杂的编程。
Java 具有简单性、面向对象、分布式、健壮性、安全性,平台独立与可移植性。
多线程、动态性等特点
Java 可以编写桌面应用程序、Web应用程序
分布式系统和镶入式系统应用程序等

  • BufferedReader 的 read() 方法
public class Test{
    public static void main(String[] args){
        try{
            Reader reader = new FileReader("E:/test.txt");
            BufferedReader bufferedReader = new BufferedReader(reader);
            int temp = 0;
            while((temp = bufferedReader.read()) != -1){
                System.out.println(temp);
            }
            bufferedReader.close();
            reader.close();
        }catch(IOException e){
            
        }
    }
}

运行结果:

一堆数字

  • BufferedReader 的 read(char cbuf[]) 方法
public class Test{
    public static void main(String[] args){
        try{
            Reader reader = new FileReader("E:/test.txt");
            BufferedReader bufferedReader = new BufferedReader(reader);
            char chars = new char[1024];
            int length = bufferedReader.read(chars);
            System.out.println(length);
            for(char c : chars){
                System.out.println(c);
            }
            bufferedReader.close();
            reader.close()
        }cathc(IOException e){
            
        }
    }
}

运行结果:

230

J

a

v

a

  • BufferedReader 的 read(char cbuf[], int off, int len) 方法
public class Test{
    public static void main(String[] args){
        try{
            Reader reader = new FileReader("E:/test.txt");
            BufferedReader bufferedReader = new BufferedReader(reader);
            char chars = new char[1024];
            int length = bufferedReader.read(chars,2,2);
            System.out.println(length);
            for(char c : chars){
                System.out.println(c);
            }
            bufferedReader.close();
            reader.close()
        }cathc(IOException e){
            
        }
    }
}

运行结果:

2

J

a

输出缓冲流

字节输出缓冲流

字节输出缓冲流(BufferedOutputStream),这次我们通过 Java 程序向文件 test2.txt中写入数据。需要注意的是,输出缓冲流在关闭之前需要先调用 flush() 方法,目的是将缓冲区的数据全部写入到目标文件中,再关闭流。

  • BufferedOutputStream 的 write(int b) 方法
public class BufferedOutput {
	public static void main(String[] args) {
		try {
			OutputStream outputStream = new FileOutputStream("E:/test2.txt");
			BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
			String str = "JDK (Java Development Kit) 称为 Java 开发包或 Java 开发工具,\r\n是一个"
					+ "编写 Java 的 Applet 小程序和应用程序的程序开发环境";
			byte[] bytes = str.getBytes();
			for(byte b : bytes) {
				bufferedOutputStream.write(b);
			}
			bufferedOutputStream.flush();
			bufferedOutputStream.close();
			outputStream.close();
		} catch(IOException e) {
			
		}
	}
}

运行结果:

JDK (Java Development Kit) 称为 Java 开发包或 Java 开发工具,
是一个编写 Java 的 Applet 小程序和应用程序的程序开发环境

  • BufferedOutputStream 的 write(byte b[]) 方法
public class BufferedOutput {
	public static void main(String[] args) {
		try {
			OutputStream outputStream = new FileOutputStream("E:/test2.txt");
			BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
			String str = "JDK (Java Development Kit) 称为 Java 开发包或 Java 开发工具,\r\n是一个"
					+ "编写 Java 的 Applet 小程序和应用程序的程序开发环境";
			byte[] bytes = str.getBytes();
			bufferedOutputStream.write(bytes);
			bufferedOutputStream.flush();
			bufferedOutputStream.close();
			outputStream.close();
		} catch(IOException e) {
			
		}
	}
}

运行结果:

JDK (Java Development Kit) 称为 Java 开发包或 Java 开发工具,
是一个编写 Java 的 Applet 小程序和应用程序的程序开发环境

  • BufferedOutputStream 的 write(byte b[],int off, int len) 方法
public class BufferedOutput {
	public static void main(String[] args) {
		try {
			OutputStream outputStream = new FileOutputStream("E:/test2.txt");
			BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
			String str = "JDK (Java Development Kit) 称为 Java 开发包或 Java 开发工具,\r\n是一个"
					+ "编写 Java 的 Applet 小程序和应用程序的程序开发环境";
			byte[] bytes = str.getBytes();
			bufferedOutputStream.write(bytes,10,10);
			bufferedOutputStream.flush();
			bufferedOutputStream.close();
			outputStream.close();
		} catch(IOException e) {
			
		}
	}
}

运行结果:

Developmen

字符输出缓冲流

字符缓冲流 BufferedWriter 提供了一个可以直接将字符串输出的方法 write(String str) 方法

public class BufferedWriterDemo {
	public static void main(String[] args) {
		try {
			Writer writer = new FileWriter("E:/test2.txt");
			BufferedWriter bufferedWriter = new BufferedWriter(writer);
			String str = "JDK (Java Development Kit) 称为 Java 开发包或 Java 开发工具,\r\n是一个"
					+ "编写 Java 的 Applet 小程序和应用程序的程序开发环境";
			bufferedWriter.write(str);
			bufferedWriter.flush();
			bufferedWriter.close();
			writer.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

JDK (Java Development Kit) 称为 Java 开发包或 Java 开发工具,
是一个编写 Java 的 Applet 小程序和应用程序的程序开发环境

BufferedWriter 的 write(String s,int off, int len) 方法

public class BufferedWriterDemo {
	public static void main(String[] args) {
		try {
			Writer writer = new FileWriter("E:/test2.txt");
			BufferedWriter bufferedWriter = new BufferedWriter(writer);
			String str = "JDK (Java Development Kit) 称为 Java 开发包或 Java 开发工具,\r\n是一个"
					+ "编写 Java 的 Applet 小程序和应用程序的程序开发环境";
			bufferedWriter.write(str, 3, 10);
			bufferedWriter.flush();
			bufferedWriter.close();
			writer.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

(Java Deve

BufferedWriter 的 writer(char cbuf[]) 方法

public class BufferedWriterDemo2 {
	public static void main(String[] args) {
		try {
			Writer writer = new FileWriter("E:/test3.txt");
			BufferedWriter bufferedWriter = new BufferedWriter(writer);
			char[] chars = {'I',' ','L','o','v','e',' ','J','a','v','a'};
			bufferedWriter.write(chars);
			bufferedWriter.flush();
			bufferedWriter.close();
			writer.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

I Love Java

BufferedWriter 的 write(char cbuf[],int off,int len) 方法

public class BufferedWriterDemo2 {
	public static void main(String[] args) {
		try {
			Writer writer = new FileWriter("E:/test3.txt");
			BufferedWriter bufferedWriter = new BufferedWriter(writer);
			char[] chars = {'I',' ','L','o','v','e',' ','J','a','v','a'};
			bufferedWriter.write(chars, 3, 6);
			bufferedWriter.flush();
			bufferedWriter.close();
			writer.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:

ove Ja

BufferedWriter 的 writer(int c) 方法

public class BufferedWriterDemo2 {
	public static void main(String[] args) {
		try {
			Writer writer = new FileWriter("E:/test3.txt");
			BufferedWriter bufferedWriter = new BufferedWriter(writer);
			bufferedWriter.write(22909);
			bufferedWriter.flush();
			bufferedWriter.close();
			writer.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:


序列化和反序列化

前面我们介绍的所有流都是将文件读取到内存中,比 byte、数组、char、String 类型展示,同理我们也可以将内存中的数字或者字符串数据输出到文件中。那么如果我们需要将内存中的对象输出到文件中,或者从文件中读取数据并还原成内存中的对象,应该如何处理?

序列化和反序列化:序列化和反序列化。序列化就是指将内存中的对象输出到硬盘文件中进行保存,反序列化就是相反的操作,从文件中读取数据并还原成内存中的对象

序列化

序列化,首先给需要序列化的对象的类实现 java.io.Serializable 接口

class User implements Serializable{
	private int id;
	private String name;
	private int age;
	private char gender;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public char getGender() {
		return gender;
	}
	public void setGender(char gender) {
		this.gender = gender;
	}
	public User(int id,String name,int age,char gender) {
		this.id = id;
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
}

接下来就可以将 User 的实例化对象进行序列化处理,通过数据流写入到文件中,这里需要用到 ObjectOutputStream,该类是专门将对象进行输出处理的

public class TestSerializable {
	public static void main(String[] args) {
		User user = new User(1,"张三",22,'男');
		try {
			OutputStream outputStream = new FileOutputStream("E:/test3.txt");
			ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
			objectOutputStream.writeObject(user);
			objectOutputStream.flush();
			objectOutputStream.close();
			outputStream.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}

运行结果:(有可能再文件中看到很多数字,也有可能乱码,这是编码问题,不影响)

 sr com.al.objectIO.User6cY商紋l I ageC genderI idL namet Ljava/lang/String;xp u7 t 寮犱笁

反序列化

接下来就是反序列化操作,即从文件中读取数据并还原成内存中的对象,这里需要用到 ObjectInutStream 类

public class TestSerializable2 {
	public static void main(String[] args) {
		try {
			InputStream inputStream = new FileInputStream("E:/test3.txt");
			ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
			User user = (User) objectInputStream.readObject();
			objectInputStream.close();
			inputStream.close();
			System.out.println(user.getId());
			System.out.println(user.getName());
			System.out.println(user.getGender());
			System.out.println(user.getAge());
		} catch (IOException e) {
			// TODO: handle exception
		} catch (ClassNotFoundException e) {
			
		}
	}
}

运行结果:

1

张三

22

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值