一:转换流
InputStreamReader:将字节输入流转换为字符输入流,构造方法参数为InputStream子类。
InputStreamReader isr = new InputStreamReader (new FileInputStream(文件路径));
OutputStreamWriter: 将字节输出流转换为字符输出流,构造方法参数为OutputStream子类。
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(文件路径));
应用举例:将对文件的字节输入输出流转换为对文件的字符输入输出流。
<span style="font-weight: normal;">public static void main(String[] args) {
OutputStreamWriter isw = null;
InputStreamReader isd = null;
try {
char[] a = { 'A', 'B' };
// 创建从程序输出到文件的字节输出流,并转换为字符输出流
isw = new OutputStreamWriter(new FileOutputStream("E://Text.txt"));
isw.write(a);// 将字符数组写入文件
} catch (IOException e) {// 异常捕获
e.printStackTrace();
} finally {
try {
if (isw != null)
isw.close();// 关闭字符输出流
} catch (IOException e) {
e.printStackTrace();
}
}
try {
// 创建从文件读取数据的字节输入流,并转换为字符输入流
isd = new InputStreamReader(new FileInputStream("E://Text.txt"));
char[] b = new char[2];
isd.read(b);// 从文件读取字符数组
for (char c : b) {
System.out.println(c);
}
} catch (IOException e) {// 异常捕获
e.printStackTrace();
} finally {
try {
if (isd != null)
isd.close();// 关闭字符输入流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}</span>
二:缓冲流
缓冲流要套接在相应的节点流之上,提高了读写的效率。此处理流的构造方法都得传相对应的基类类型
BufferedReader:提供了readLine方法用于高效读取一行字符串
BufferedWriter:提供了newLine用于用于高效写入一行字符串(一个行分隔符也就是换行)
BufferedInputStream 没多大用处
BufferedOutputStream 没多大用处
应用举例:用缓冲流构建Scanner类似的从键盘输入数据的方法
/**
* 从键盘一行读取数据,并以字符串的形式返回。
* @return
*/
public static String getDataByKeyboard() {
try {
//创建BufferedReader缓冲流,缓冲流传递的参数为Reader的子类实例。
BufferedReader bis = new BufferedReader(new InputStreamReader(
System.in));
//bis.close();不需要关闭。因为System.in是系统建立及关闭
return bis.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
三:数据流
数据流主要为实现可以存取Java基本数据类型如long,boolean等。(注意:因为数据流是字节流,所以
DataInputStream需要和InputStream子类套接
DataOutputStream需要和OutputStream套接)
应用举例:用数据流存取Java基本数据类型
public static void DataText() throws IOException{
//构建字节数组输出流
ByteArrayOutputStream bos=new ByteArrayOutputStream();
//构建数据输出流
DataOutputStream dos=new DataOutputStream(bos);
dos.write(1);
dos.writeBoolean(true);
dos.writeUTF("你好");//字符串形式输入
//获取字节数组
byte []a=bos.toByteArray();
//构建字节数组输入流
ByteArrayInputStream bis=new ByteArrayInputStream(a);
//构建数据输入流
DataInputStream dis=new DataInputStream(bis);
//注意读取顺序必须和写入顺序一致。
int num=dis.read();
boolean b=dis.readBoolean();
String s=dis.readUTF();
System.out.println("num :"+num);
System.out.println("b :"+b);
System.out.println("s :"+s);
}
四:对象流
等同于c#序列化,用直接将Object写入或读出
(注意:
1:对象流是字节流。
2:对象流操作的对象必须是可序列化的。
在Java中需要序列化的类必须实现Serializable接口
transient关键字为不序列化此成员变量
)
应用举例:用对象流存取学生对象到文件
public static void ObjectInputText() {
//创建学生对象
Student student = new Student("小明", 25, true);
Student s = null;
ObjectOutput oos = null;
ObjectInputStream ois = null;
try {
//创建对象输出流
oos = new ObjectOutputStream(new FileOutputStream("E://Text.txt"));
oos.writeObject(student);//将对象写入文件
//创建对象输入流
ois = new ObjectInputStream(new FileInputStream("E://Text.txt"));
s = (Student) ois.readObject();//从文件读取对象,并将值赋给s
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (oos != null)
oos.close();//关闭对象输出流
if (ois != null)
ois.close();//关闭对象输入流
} catch (IOException e) {
e.printStackTrace();
}
}
}