IO
转换流
1. InputStreamReader和2.OutputStreamWriter
- 将字节输入流转换为字符输入流
- 将字节输出流转换为字符输出流
应用场景:System.in(在System类下有一个静态的成员变量叫in)是字节流对象,代表键盘的输入,如果我们想按行接收用户的输入时,就i必须要用到 缓冲字符流BufferedReader特有的方readerLine(),但是创建BufferedReader的构造方法的参数必须是一个Reader对象,此时就要用到InputStreamReader,同样,System.out也是字节流对象, 按行显示时也要用OutputStreamWriter。
下面这个例子是自己实现一个简单的输入和显示过程:
import java.io.*;
public class ConvertStream {
public static void main(String[] args) {
BufferedReader br=null; //定义输入缓冲流
BufferedWriter bw=null;
try {
//InputStreamReader也是一种处理流,将字节输入流转化为字符输入流
br=new BufferedReader(new InputStreamReader(System.in));
//
bw=new BufferedWriter(new OutputStreamWriter(System.out));
String s=br.readLine();
bw.write(s);
bw.flush();
//System.out.println(s);
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
try {
if(br!=null)
br.close();
if(bw!=null)
bw.close();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
这样就实现了一个简单键盘读入并输出的功能。
字节数组流
ByteArrayInputStream和ByteArrayOutputStream
ByteArrayInputStream:是将字节数组的数据读入到流中。看例子:
import java.io.ByteArrayInputStream;
public class ByteArrayInputDome {
public static void main(String[] args) {
byte[] arr="abcdefgh".getBytes(); //返回一个字节数组
ByteArrayInputStream bis=null;
StringBuffer sb=new StringBuffer();
try{
//该构造方法的参数是一个字节数组,这个字节数组就是数据源
bis=new ByteArrayInputStream(arr);
int temp=0;
while ((temp=bis.read())!=-1){
sb.append((char) temp);
}
System.out.println(sb.toString());
}catch (Exception e){
e.printStackTrace();
}finally {
try{
bis.close(); //资源关闭
}catch (Exception e){
e.printStackTrace();
}
}
}
}
同样利用ByteArrayOutputStream可以将数据写入字节数组当中:
import java.io.ByteArrayOutputStream;
public class ByteArrayOutputDome {
public static void main(String[] args) {
ByteArrayOutputStream bos=null;
try{
bos=new ByteArrayOutputStream();
bos.write('a');
bos.write('b');
bos.write('c');
byte[] arr=bos.toByteArray();
for (byte i:arr) {
System.out.println((char) i);
}
}finally {
try{
if (bos!=null){
bos.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}