按数据流的方向不同分: 输入流 输出流按处理数据单位不同分: 字节流 字符流
按照功能不同可以分为:节点流:InputStream OutputStream 直接跟数据源相连接 ,节点流为可以从一个特定的数据源(节点)读写数据(如:文件、内存)处理流:处理流是“连接”在已经存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能
1、 缓冲流---- BufferedInputStream 、BufferedOutputStream、BufferedReader、BufferedWriter2、 转换流----InputStreamReader、OutputStreamWriter ,经过将节点流进行转换,可以直接一个字符串直接写入文件或者读出文件
二、转换流实例
//转换流实例1
import java.io.*;public class TestTransForm2{
public static void main(String[] args){
try{
InputStreamReader isr = new InputStreamReader(System.in);BufferedReader br=new BufferedReader(isr);String s = null;s = br.readLine();while(s!=null){//这里如果方法名写错 ignore 容易写成ingore,给出的错误提示如图1所示
if(s.equals IgnoreCase("exit")) break;
System.out.println(s.toUpperCase());
s=br.readLine();
}br.close();
}catch(IOException e){
e.printStackTrace();
}
}
}图1 方法名称写错的错误提示
//转换流实例2
import java.io.*;public class TestTransForm1{
public static void main(String[] args){
try{
OutputStreamWriter osw= new OutputStreamWriter(new FileOutputStream("transform.txt"));osw.write("sdfsdfsdfsdfdsfdsfds");System.out.println(osw.getEncoding());osw.close();//设定文件末尾追加为True,同时指定文件存储编码为ISO8859_1osw=new OutputStreamWriter(new FileOutputStream("transform.txt",true),"ISO8859_1");osw.write("sfssfsdfsdfsdfsdfsfsd");System.out.println(osw.getEncoding());osw.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
//字节流实例1import java.io.*;public class TestFileInputStream{
public static void main(String[] args){
FileInputStream fis = null;int b=0;int num=0;try{
fis=new FileInputStream(new File("TestFileInputStream.java"));
}catch(FileNotFoundException e){
System.out.println("文件找不到,请检查文件名是否正确");System.exit(-1);
}try{
while((b=fis.read())!=-1){
System.out.print((char)b);num++;
}
fis.close();System.out.println("共读取了:"+num+"次数据");
}catch(IOException e){
e.printStackTrace();
}
}
}
//字节流实例2import java.io.*;public class TestFileOutputStream{
public static void main(String[] args){
FileInputStream in=null;FileOutputStream out=null;int b=0;try{
in=new FileInputStream(new File("TestFileInputStream.java"));out=new FileOutputStream(new File("newfile.txt"));while((b=in.read())!=-1){
out.write(b);
}
}catch(FileNotFoundException e1){
System.out.println("文件没有找到");System.exit(-1);
}catch(IOException e){
System.out.println("文件复制失败");
}System.out.println("文件复制完成");
}
四、数据流实例}
//数据流,字节数组流的实用实例import java.io.*;public class TestDataInputStream{
public static void main(String[] args){
ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream dos = new DataOutputStream(baos);try{
dos.writeDouble(Math.random());//dis.wirte();dos.writeBoolean(true);//baos.toByteArray() 返回一个数组;Creates a newly allocated byte array.ByteArrayInputStream bais= new ByteArrayInputStream(baos.toByteArray());DataInputStream dis =new DataInputStream(bais);//这个语句位置在这里输出9System.out.println(bais.available());System.out.println(dis.readDouble());System.out.println(dis.readBoolean());// 同样的语句放到这里却输出为0,这说明方法avaliable的作用是返回可读的字节数,其英文解释如下://Returns the number of remaining bytes that can be read (or skipped over) from this input stream.System.out.println(bais.available());dos.close();dis.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
//输出结果为 9 随机数 true 0
五、打印流实例
注意事项:
PrintWriter与PrintStream都属于输出流分别针对字符流与字节流PrintWriter与PrintStream都提供了重载的print println方法用于多种数据类型的输出PrintWriter与PrintSteam的输出操作都不会抛出异常,用户通过检测错误状态获取错误信息PrintWriter和PrintStream有自动flush功能
/ /PrintStream 实例1import java.io.*;public class TestPrintIO{
public static void main(String[] args){PrintStream ps=null;try{
FileOutputStream fos=new FileOutputStream("log.dat");ps=new PrintStream(fos);System.setOut(ps);for(int i=0;i<60000;i++){
System.out.print((char)i);
}
}catch(IOException e){
e.printStackTrace();
}}
}
/ /PrintStream 实例2import java.io.*;public class TestPrintIO{
public static void main(String[] args){
PrintStream ps=null;try{FileOutputStream fos=new FileOutputStream("log.dat");ps=new PrintStream(fos);}catch(IOException e){e.printStackTrace();}if(ps!=null){System.setOut(ps);}int ln=0;for(int i=0;i<60000;i++){//System.out.print(i+"");if(ln++=100){
System.out.println(i+"");
ln=0;
}}
}
}
//
实例2增加了ps非空判断的作用是什么?为什么要这么做呢,新增ln成员变量用以控制For循环内部输出符合条件的i的值
/ /PrintStream 实例2import java.io.*;public class TestPrintStream2{
public static void main(String[] args){
PrintStream ps=null;try{FileOutputStream fos=new FileOutputStream("log.dat");ps=new PrintStream(fos);}catch(IOException e){e.printStackTrace();}if(ps!=null){System.setOut(ps);}int ln=0;//i可以定义为其他类型,可以直接为char类型,可是char类型做预算时,会自动转成int类型for(char i=0;i<60000;i++){//System.out.print(i+"");if(ln++ == 10000){System.out.println((char)i);ln=0;}}
}
}