Java流

来源:互联网 发布:仿站长之家网站源码 编辑:程序博客网 时间:2024/05/16 14:34

流有哪些分类?

可以从不同的角度对流进行分类:

1. 处理的数据单位不同,可分为:字符流,字节流

2.数据流方向不同,可分为:输入流,输出流

3.功能不同,可分为:节点流,处理流

1. 和 2. 都比较好理解,对于根据功能分类的,可以这么理解:

节点流:节点流从一个特定的数据源读写数据。即节点流是直接操作文件,网络等的流,例如FileInputStream和FileOutputStream,他们直接从文件中读取或往文件中写入字节流。

处理流:“连接”在已存在的流(节点流或处理流)之上通过对数据的处理为程序提供更为强大的读写功能。过滤流是使用一个已经存在的输入流或输出流连接创建的,过滤流就是对节点流进行一系列的包装。例如BufferedInputStream和BufferedOutputStream,使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率,以及DataInputStream和DataOutputStream,使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。他们都属于过滤流。

流结构介绍

Java所有的流类位于java.io包中,都分别继承字以下四种抽象流类型。

 字节流字符流输入流InputStreamReader输出流OutputStreamWriter

1.继承自InputStream/OutputStream的流都是用于向程序中输入/输出数据,且数据的单位都是字节(byte=8bit),如图,深色的为节点流,浅色的为处理流。

 

2.继承自Reader/Writer的流都是用于向程序中输入/输出数据,且数据的单位都是字符(2byte=16bit),如图,深色的为节点流,浅色的为处理流。


示例:

String filepath = "D:\\test.txt";//InputStream OutputStream 是字节输入符出流/*********************InputStream 读******************************/try {File file = new File(filepath);InputStream inputStream = new FileInputStream(file);byte[] b = new byte[1024];while(inputStream.read(b)!=-1){System.out.println(new String(b));}inputStream.close();} catch (Exception e) {e.printStackTrace();}try {File file = new File(filepath);InputStream inputStream = new FileInputStream(file);DataInputStream dataInputStream = new DataInputStream(inputStream);byte[] b = new byte[1024];while(dataInputStream.read(b)!=-1){System.out.println(new String(b));}dataInputStream.close();inputStream.close();} catch (Exception e) {e.printStackTrace();}try {InputStream inputStream = new FileInputStream(new File(filepath));BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);byte[] b = new byte[1024];if (bufferedInputStream.read(b)!=-1) {System.out.println(new String(b));}bufferedInputStream.close();inputStream.close();} catch (Exception e) {e.printStackTrace();}/*********************OutputStream 写******************************/try {OutputStream outputStream = new FileOutputStream(new File(filepath));outputStream.write(new String("Hello World").getBytes());outputStream.close();} catch (Exception e) {e.printStackTrace();}try {OutputStream outputStream = new FileOutputStream(new File(filepath), true);//在文件尾追加//outputStream.write(new String("other").getBytes());outputStream.write(new String("\r\nother").getBytes());// \r\n表示换行outputStream.close();} catch (Exception e) {e.printStackTrace();}try {OutputStream outputStream = new FileOutputStream(new File(filepath));BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);bufferedOutputStream.write(new String("other").getBytes());bufferedOutputStream.close();outputStream.close();} catch (Exception e) {e.printStackTrace();}/*********************InputStream OutputStream 读写(复制文件)******************************/try {InputStream inputStream = new FileInputStream(new File(filepath));OutputStream outputStream = new FileOutputStream(new File("D:\\test2.txt"));byte[] b = new byte[1024];while(inputStream.read(b)!=-1){outputStream.write(b);}inputStream.close();outputStream.close();} catch (Exception e) {e.printStackTrace();}//Reader Writer 是字符输入输出流/******************Reader 读*************************/try {Reader reader = new FileReader(new File(filepath));char[] b = new char[1024];if(reader.read(b)!=-1){System.out.println(new String(b));}reader.close();} catch (Exception e) {e.printStackTrace();}try {Reader reader = new FileReader(new File(filepath));BufferedReader bufferedReader = new BufferedReader(reader);String line;while ((line=bufferedReader.readLine())!=null) {//BufferedReader按行读取System.out.println(line);}bufferedReader.close();reader.close();} catch (Exception e) {e.printStackTrace();}/******************Writer 读*************************/try {Writer writer = new FileWriter(new File(filepath));//Writer writer = new FileWriter(new File(filepath), true);//在文件尾追加writer.write("我是中国人");writer.close();} catch (Exception e) {e.printStackTrace();}try {Writer writer = new FileWriter(new File(filepath));BufferedWriter bufferedWriter = new BufferedWriter(writer);bufferedWriter.write("这是第一行");bufferedWriter.newLine();//BufferedWriter 写入行bufferedWriter.write("这是第二行");//对于输出地缓冲流,写出的数据,会先写入到内存中,再使用flush方法将内存中的数据刷到硬盘。所以,在使用字符缓冲流的时候,一定要先flush,然后再close,避免数据丢失bufferedWriter.flush();bufferedWriter.close();writer.close();} catch (Exception e) {e.printStackTrace();}




0 0