Java 输入/输出流(Input/Output,简称I/O)是Java语言用于读写数据的API,它提供了一系列类和接口,用于读取和写入各种类型的数据信息。
-
I/O流按数据单元(粒度大小)可分为字节流(以字节为处理单元)和字符流(以字符为处理单元)。
-
I/O流按数据流向分可分为输入流(只能从中读取数据,不能向其写入数据)和输出流(只能向其写入数据,不能从中读取数据)。输入流使用InpurtStream和Reader作为基类;输出流使用OutputStream和Writer作为基类。
转换流
在字节流和字符流之间可用转换流进行转换。
字节流更通用,但当处理文本数据时字节流比较繁琐;使用字符流操作文本数据则更便捷一些。因此,由于使用场景不同有时候就需要转换流来进行转换。
Java中类库中有两个转换流:输入转换流InputStreamReader和输出转换流OutputStreamWriter。
java.io.InputStreamReader //输入转换流
java.io.OutputStreamWriter //输出转换流
它们都是把字节流转换为字符流,当需要处理文本信息的场景可简化操作流程。
这两个转换流各有四个构造器,下面列出的是InputStreamReader的,OutputStreamWriter也类似。
public InputStreamReader(InputStream in) {}public InputStreamReader(InputStream in, String charsetName) throws UnsupportedEncodingException {}public InputStreamReader(InputStream in, Charset cs) {}public InputStreamReader(InputStream in, CharsetDecoder dec) {}
下面我们来看一个转换流的演示例程,例程中方法writerFile(String path)的源码:
/***把文本信息保存到文件***/public static void writerFile(String path) {try(FileOutputStream out = new FileOutputStream(path);Writer wOut = new OutputStreamWriter(out,Charset.defaultCharset())) {for (String string : poem) {wOut.write(string); //写到文件}} catch (IOException e) {e.printStackTrace();}}
其中,这行代码进行转换流处理(这里可省略分号;):
Writer wOut = new OutputStreamWriter(out,Charset.defaultCharset())
下面是完整的源程序。先把信息写入文件中,再通过方法read(String path)把文件信息读入,然后再打印到屏幕上。
package IOStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.Charset;
public class ChangeIOStream {static String poem[] = { "《凉州词》王翰","葡萄美酒夜光杯,","欲饮琵琶马上催。","醉卧沙场君莫笑,","古来征战几人回。"};/***把文本信息保存到文件***/public static void writerFile(String path) {try(FileOutputStream out = new FileOutputStream(path);Writer wOut = new OutputStreamWriter(out,Charset.defaultCharset())) {for (String string : poem) {wOut.write(string); //写到文件}} catch (IOException e) {e.printStackTrace();}}public static void read(String path) {char[] cs = new char[1024];int len = -1;try(FileInputStream in = new FileInputStream(path);Reader reader = new InputStreamReader(in,Charset.defaultCharset())) {while((len=reader.read(cs))!=-1) {System.out.println(new String(cs,0,len));}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {String path = "D:/temp/ChangeTest.txt";ChangeIOStream.writerFile(path);ChangeIOStream.read(path);}
}
例程测试结果图: