导读
在java程序中,对于数据的输入/输出操作以”流“的方式进行的。流是内存中一组有序数据序列。Java将数据从源读入到内存当中,形成了流,然后这些流可以写到目的地。
Java中流按功能分为:节点流(原始流)和处理流(包裹流)
处理流是在节点流的基础上提供了更加强大的读写功能,处理流不能独立存在,必须依附于结点流。
Java中流按处理数据的不同分为字节流和字符流
字节流:以字节为单位来处理数据的,字节流数据为8位,一般用于对二进制的数据的读写,例如声音,图像等。
字符流:以字符为单位来处理数据的,一般用于读写文本文件的。
字符流:字符流的基类是抽象类Reader和Writer。
字符处理流
package com.test.java;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
public class IoStreamChar {
public static void main(String[] args) {
File f1 = new File("E:\\test\\account.txt");
File f2 = new File("E:\\test\\aaa.txt");
try{
FileReader fi = new FileReader(f1);
FileWriter fo = new FileWriter(f2);
int m;
while((m=fi.read())!=-1)
fo.write((char)m);
fi.close();
fo.close();
}
catch(Exception e){
System.out.println("there is a error when reading or writing file.");
}
}
}
缓冲流:BufferedReader、BufferedWriter。BufferedReader和BufferedWriter是针对字符的缓冲输入输出流,不能独立读写数据必须包装字符流进行读写。可以通过内存缓冲区来提高输入输出速度。
public class SysIn2 {
public static void main(String[] args) {
try {
String encoding="GBK";
File file=new File("E:\\test\\aaa.txt");
if(file.isFile() && file.exists()){
InputStreamReader read = new InputStreamReader(new FileInputStream(file),encoding);
BufferedReader bReader = new BufferedReader(read);
String lineTxt = null;
String array = "";
while((lineTxt = bReader.readLine()) != null){
array += lineTxt;
}
read.close();
System.out.println(array);
} else {
System.out.println("can't find the file");
}
} catch (Exception e) {// readLine() method must handle java.io.IOException Exception
System.out.println("run error"+e.getMessage());
e.printStackTrace();
}
}
}
转换流:将字节流转换成字符流。InputStreamReader、InputStreamWriter。InputStreamReader是字节流通向字符流的桥梁,它使用指定的 charset 读取字节并将其解码为字符。
package com.test.java;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Transfermethod {
public static void main(String[] args) {
try{
File f = new File("E:\\test\\aaa.txt");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(f));
InputStreamReader isr = new InputStreamReader(new FileInputStream(f));
BufferedReader br= new BufferedReader(isr);
BufferedWriter bw = new BufferedWriter(osw);
bw.write("this is a test program");
bw.flush();
String str;
while((str= br.readLine())!=null){
System.out.println(str);
}
br.close();
bw.close();
}
catch(IOException e){
System.out.println(e.getMessage());
}
}
}
字节处理流
缓冲流: BufferedInputStream和BufferedOutputStream是缓冲字节流,它们通过减少读写I/O设备次数来加快输入输出速度:通过带缓冲区的输出流写数据时,数据先保存在缓冲区中,积累到一定程度才会真正写到输出流中。缓冲区通常用字节数组实现,实际上是指一块内存空间。flush()方法强制把缓冲区内的数据写到输出流中。应该关闭输入/输出流。
数据流:DataInputStream,DateOutputStream 可以按照与平台无关的方式从流中读取基本类型(int,char和long等)的数据。
FileInputStream和FileOutputStream 只能读写字节,如果我们要读写int、double或者字符串类型就要使用数据流进行包装。数据流不能独立读写。
package com.test.java;
import java.io.*;
public class Test {
public static void main(String[] args){
File f1 = new File("E:\\test\\account.txt");
File f2 = new File("E:\\test\\aaa.txt");
try{
FileInputStream fi = new FileInputStream(f1);
FileOutputStream fo = new FileOutputStream(f2);
int m;
while((m=fi.read())!=-1)
fo.write(m);
fi.close();
fo.close();
}
catch(Exception e){
System.out.println("there is a error when reading or writing file.");
}
}
}
特殊字节流
System类是Java语言中一个功能强大、非常有用的类,它提供了标准输入/输出及运行时的系统信息。从System类不能创建对象,也就是说,System类的所有属性和方法都是静态的,引用时要以System作为前缀。System.in其实也是一个字节输入流,继承自InputStream类。
System.in称为标准输入流,用于程序输入,通常读取用户从键盘输入的信息;
System.out称为标准输出流,用于程序输出,通常向用户显示信息;
System.err称为标准错误流,用于向用户显示出错信息。
package com.test.java;
import java.io.IOException;
public class SysIn {
public static void main(String[] args) {
System.out.println("please input a data:");
try{
int i = System.in.read();
System.out.println("the data is:"+(char)i);
}
catch(IOException e){
e.printStackTrace();
}
}
}