1,按流向分:
输入流;输出流
2,按处理的单位:
字节流(8 位的字节);字符流(16 位的字节)
3,按流的角色:
节点流:可以从一个特定的 IO 设备读/写数据的流
处理流:对一个已存在的流进行连接和封装,通过封装后的流来实现数据读/写操作。
2),处理流:使用处理流来包装节点流,程序通过处理流来执行输入和输出。识别处理流也非常的简单:只要流的构造器参数不是一个物理节点,而是一个已经存在的流,那么这种流就是处理流。下面来实现一种比较常用的处理流的用法:Java使用system.in代表标准输入,即键盘输入,但是这个标准输入流是InputStream类的一个实例,使用的时候不是很方便,而且我们也知道键盘输入的内容都是文本内容,所以我们可以使用InputStreamReader将其转换成字符输入流,普通的reader读取输入内容还是不太方便,我们可以将reader包装成BufferReader,利用BufferReader的readline方法就可以一次读取一行内容了。
以下几块代码用来演示具体的常用的几种流:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Linkin { public static void main(String[] args) throws IOException { FileInputStream fis = null; FileOutputStream fos = null; try { // 创建字节输入流 fis = new FileInputStream("src/Linkin.java"); // 创建字节输出流 fos = new FileOutputStream("src/newFile.java"); byte[] bbuf = new byte[32]; int hasRead = 0; // 循环从输入流中取出数据 while ((hasRead = fis.read(bbuf)) > 0) { // 每读取一次,即写入文件输出流,读了多少,就写多少。 fos.write(bbuf, 0, hasRead); } } catch (IOException ioe) { ioe.printStackTrace(); } finally { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } } }
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class Linkin { public static void main(String[] args) throws IOException { FileReader fr = null; FileWriter fw = null; try { // 创建字符输入流 fr = new FileReader("src/Linkin.java"); // 创建一个长度为32的“竹筒” char[] cbuf = new char[32]; // 用于保存实际读取的字符数 int hasRead = 0; // 使用循环来重复“取水”过程 while ((hasRead = fr.read(cbuf)) > 0) { // 取出“竹筒”中水滴(字符),将字符数组转换成字符串输入! System.out.print(new String(cbuf, 0, hasRead)); } fw = new FileWriter("poem.txt"); fw.write("锦瑟 - 李商隐\r\n"); fw.write("锦瑟无端五十弦,一弦一柱思华年。\r\n"); fw.write("庄生晓梦迷蝴蝶,望帝春心托杜鹃。\r\n"); fw.write("沧海月明珠有泪,蓝田日暖玉生烟。\r\n"); fw.write("此情可待成追忆,只是当时已惘然。\r\n"); } catch (IOException ioe) { ioe.printStackTrace(); } finally { if (fr != null) { fr.close(); } if (fw != null) { fw.close(); } } } }
import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; public class Linkin { public static void main(String[] args) throws IOException { FileOutputStream fos = null; PrintStream ps = null; try { fos = new FileOutputStream("test.txt"); ps = new PrintStream(fos); // 使用PrintStream执行输出 ps.println("普通字符串"); // 直接使用PrintStream输出对象 ps.println(new Linkin()); } catch (IOException ioe) { ioe.printStackTrace(); } finally { if (ps != null) { ps.close(); } } } }
import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; public class Linkin { public static void main(String[] args) throws IOException { StringReader sr = null; StringWriter sw = null; String src = "从明天起,做一个幸福的人\n" + "喂马,劈柴,周游世界\n" + "从明天起,关心粮食和蔬菜\n" + "我有一所房子,面朝大海,春暖花开\n" + "从明天起,和每一个亲人通信\n" + "告诉他们我的幸福\n"; char[] buffer = new char[32]; int hasRead = 0; try { sr = new StringReader(src); // 采用循环读取的访问读取字符串 while ((hasRead = sr.read(buffer)) > 0) { System.out.print(new String(buffer, 0, hasRead)); } } catch (IOException ioe) { ioe.printStackTrace(); } try { // 创建StringWriter时,实际上以一个StringBuffer作为输出节点 // 下面指定的20就是StringBuffer的初始长度 sw = new StringWriter(); // 调用StringWriter的方法执行输出 sw.write("有一个美丽的新世界,\n"); sw.write("她在远方等我,\n"); sw.write("哪里有天真的孩子,\n"); sw.write("还有姑娘的酒窝\n"); System.out.println("----下面是sw的字符串节点里的内容----"); // 使用toString()方法返回StringWriter的字符串节点的内容 System.out.println(sw.toString()); } catch (Exception ioe) { ioe.printStackTrace(); } finally { if (sr != null) { sr.close(); } if (sw != null) { sw.close(); } } } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Linkin { public static void main(String[] args) throws IOException { InputStreamReader reader = null; BufferedReader br = null; try { // 将Sytem.in对象转换成Reader对象 reader = new InputStreamReader(System.in); //将普通Reader包装成BufferedReader br = new BufferedReader(reader); String buffer = null; //采用循环方式来一行一行的读取 while ((buffer = br.readLine()) != null) { //如果读取的字符串为"exit",程序退出 if (buffer.equals("exit")) { System.exit(1); } //打印读取的内容 System.out.println("输入内容为:" + buffer); } } catch (Exception ioe) { ioe.printStackTrace(); } finally { if (br != null) { br.close(); } } } }