【学习笔记】Java 流

本文详细介绍了Java中的IO流概念及分类,包括字节流与字符流的区别,输入输出流的具体实现,如FileInputStream、FileOutputStream、BufferedReader和BufferedWriter等,并提供了多个示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

流是个抽象的概念,是对输入输出设备的抽象,输入流可以看作一个输入通道,输出流可以看作一个输出通道。
在这里插入图片描述

分类

  • 字节流
    传输过程中,传输数据的最基本单位是字节的流。字节流的类通常以stream结尾。
  • 字符流
    传输过程中,传输数据的最基本单位是字符的流。字符流的类通常以reader和writer结尾。

输入字节流 InputStream

  • InputStream 是所有的输入字节流的父类,它是一个抽象类。
  • ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。
  • PipedInputStream 是从与其它线程共用的管道中读取数据。
  • ObjectInputStream 和所有FilterInputStream 的子类都是装饰流。BufferedInputStream 是FilterInputStream 的子类,BufferedInputStream 已经提前将数据封装到内存中,内存中操作数据要快,所以它的效率要要非缓冲的要高。

输出字节流 OutputStream

  • OutputStream 是所有的输出字节流的父类,它是一个抽象类。
  • ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。
  • PipedOutputStream 是向与其它线程共用的管道中写入数据。
  • ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。

字符输入流

  • Reader是字符输入流的抽象基类.
  • InputStreamReader 可以把InputStream中的字节数据流根据字符编码方式转成字符数据流。
  • FileReader 可以把FileInputStream中的字节数据转成根据字符编码方式转成字符数据流。
  • BufferedReader可以把字符输入流进行封装,将数据进行缓冲,提高读取效率。

字符输出流

  • Writer是字符输出流的抽象基类。
  • OutputStreamWriter可以使我们直接往流中写字符串数据,根据字符编码方式来把字符数据转成字节数据再写给输出流。
  • FileWriter与OutputStreamWriter功能类似。
  • BufferedWriter利用了缓冲区来提高写的效率。

只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。

  • 节点流
    直接与数据源相连,读入或读出。
    (1)父类:InputStream、OutputStream、Reader、Writer
    (2)文件:FileInputStream、FileOutputStrean、FileReader、FileWriter 文件进行处理的节点流
    (3)数组:ByteArrayInputStream:ByteArrayOutputStream、CharArrayReader、CharArrayWriter 对数组进行处理的节点流
    (4)字符串:StringReader、StringWriter 对字符串进行处理的节点流
    (5)管道:PipedInputStream、PipedOutputStream、PipedReader、PipedWriter 对管道进行处理的节点流
  • 处理流
    处理流和节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。
    (1)缓冲流:BufferedInputStrean、BufferedOutputStream、BufferedReader、BufferedWriter 增加缓冲功能,避免频繁读写硬盘。
    (2)转换流:InputStreamReader、OutputStreamReader实现字节流和字符流之间的转换。
    (3)数据流:DataInputStream、DataOutputStream 等。提供将基础数据类型写入到文件中,或者读取出来。

FileInputStream

需要一个文件对象用来实例化,这个文件可以是一个File对象,也可以是文件名路径字符串。

public void test() throws IOexception {
	FileInputStream fis = new FileInputStream("a.txt");
	byte[] buffer = new byte[1024];
	int len;
	while ((len = fis.read(buffer)) != -1) {
		System.out.println(new String(buffer, 0, len));
	}
	fis.close();
}

BufferedInputStream

封装别的流以提高效率。

public void test() throws IOexception {
	FileInputStream fis = new FileInputStream("a.txt");
	BufferedInputStream bis = new BufferedInputStream(fis);
	byte[] buffer = new byte[1024];
	int len;
	while ((len = bis.read(buffer)) != -1) {
		System.out.println(new String(buffer, 0, len));
	}
	bis.close();
	fis.close();
}

FileOutputStream

用于写文件的输出流,所以它需要一个文件作为实例化参数。

public void test() throws IOexception {
	FileOutputStream fos = new FileOutputStream("a.txt");
	fos.write("Hello".getBytes());
	fos.close();
}

BufferedOutputStream

需要一个输出流作为实例化参数。

public void test() throws IOexception {
	FileOutputStream fos = new FileOutputStream("a.txt");
	BufferedOutputStream bos = new BufferedOutputStream(fos);
	bos.write("Hello".getBytes());
	bos.close();
	fos.close();
}

InputStreamReader

需要一个字节输入流对象作为实例化参数。

public void test() throws IOexception {
	InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
	int ch;
	while((ch = isr.read()) != -1) {
		System.out.println((char)ch);
	}
	isr.close();
}

FileReader

需要一个文件对象作为实例化参数.

public void test() throws IOexception {
	FileReader reader = new FileReader("a.txt");
	char[] buffer = new char[1024];
	int len;
	while((len = reader.read(buffer)) != -1) {
		System.out.println(new String(buffer, 0, len));
	}
	reader.close();
}

BufferReader

需要一个字符输入流对象作为实例化参数。

public void test() throws IOexception {
	FileReader freader = new FileReader("a.txt");
	BufferedReader breader = new BufferedReader(freader);
	String line;
	while((line = breader.readline()) != null) {
		System.out.println(line);
	}
	breader.close();
	freader.close();
}

OutputStreamWriter

需要一个输入流对象作为实例化参数。

public void test() throws IOexception {
	OutputStream out = new FileOutputStream("a.txt");
	OutputStreamWriter osw = new OutputStreamWriter(out);
	osw.write("你好");
	osw.close();
}

FileWriter

需要一个文件对象来实例化.

public void test() throws IOexception {
	FileWriter writer = new FileWriter("a.txt");
	writer.write("你好");
	writer.close();
}

BufferWriter

需要一个字符输出流对象作为实例化参数。

public void test() throws IOexception {
	FileWriter writer = new FileWriter("a.txt");
	BufferWriter bwriter = new BufferWriter(writer);
	bwriter.write("你好");
	bwriter.close();
	writer.close();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值