常见IO流简介


常见IO流简介

一:IO流结构图

在这里插入图片描述

二.IO流类

流(对象)是在内存与存储设备之间传输数据的通道

1.方向: a. 输出流:用以将<内存>中的内容写入到<存储设备>当中。 b. 输入流:用以将<存储设备>中的内容读入到<内存>当中。 2. 单位: a. 字节流:以字节为单位,可以读写所有数据。 b. 字符流:以字符为单位,可以读写文本数据。 3. 功能: a. 节点流:实际传输数据。 b. 过滤流:强加节点流功能。

常见的字节流:
  • 文件流:FileOutputStream 和 FileInputStream
  • 缓冲流:BufferedOutputStream 和 BufferedInputStream
  • 对象流:ObjectOutputStream 和 ObjectInputStream
常见的字符流:
  • 字节转字符流:InputStreamReader 和 OutputStreamWriter

  • 缓冲字符流:PrintWriter 和 BufferedReader

三.八个IO流类

1.FileInputStream和FileOutputStream (文件字节输入流和文件字节输出流)
  • 属性:字节流

  • 主要方法:分别为read() 读一个字节 和 read(byte[]) 读一个字节数组

    ? writer() 写一个字节 和 writer(byte[]) 写一个字节数组

  • 用途:用于字节文件(图像,影音等)的文件传输

  • 代码提示:

    //图像复制:
    String path="D:"+File.separator +"test.png";
    String resultPath="D:"+File.separator +"test1.png";
    File file=new File(path);
    //File resultfile=new File(path);
    FileInputStream fin = null;
    FileOutputStream fout = null;
    try{
       fin =new FileInputStream(file);
       fout = new FileOutputStream(resultpath,true);
       int result=0;
       while((result=fin.read()!=-1){
       fout.write(result);
       }
    }catch (IOException e) {
    	e.printStackTrace();
    } finally {
       if (in != null) {
    	try {
    		in.close();
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
       }
       if (out != null) {
    	 try {
    		out.close();
    	} catch (IOException e) {
    	e.printStackTrace();
    	}
        }
    }         
    

    tip:

    • 一个文件只能打开一个方向的流通道
    • 输出流会自己新建文件,但不会新建目录
2.FileReader和FileWriter(文件字符输入流和文件字符输出流)
  • 属性:字符流

  • 主要方法: read() 读一个字符 和read(char[])

    ? writer() 写一个字符 和writer(char[])

  • 用途:文本文件的传输

  • 代码提示: 如上图

3.BufferedInputStream和BufferedOutputStream(缓冲字节输入流和缓冲字节输出流)
  • 属性:缓冲流 字节流

  • 用途:字节流的用法,但速度更快

  • 代码提示:

4.BufferedReader和BufferedWriter(缓冲字符输入流和缓冲字符输出流)
  • 属性: 缓冲流 字符流

  • 主要方法:多了一个readLine()和newLine()等

  • 用途:字符流的用途,速度更快

  • 代码提示:

    String path = "D:" + File.separator + "test.txt";
    String resultpath = "D:" + File.separator + "test1.txt";
    BufferedReader br = null;
    BufferedWriter bw = null;
    char[] a = new char[100];
    try {
    	br = new BufferedReader(new FileReader(path));
    	bw = new BufferedWriter(new FileWriter(resultPath, true));
    	// --------------------------第一种
    	/*br.read(a);
    	String st = new String(a);
    	System.out.println(st);
    	bw.write(st);*/
    	// -------------更简洁的另一种,但没有中间变量st
    	int temp = 0;
    	while ((temp = br.read()) != -1) {
    		bw.write(temp);
    	}
    	// -----------------------
    
    } catch (IOException e) {
    	e.printStackTrace();
    } finally {
    	CloseIO.charClose(br, bw);//自己写的封装的流的关闭
    }
    

四.详解

  1. 字符流本质是字节流的拓展封装
  2. 缓冲流是字节流和字符流的包装,使用缓冲流效率更好
  3. InputStreamReader是从字节流到字符流的桥接器
InputStreamReader rd = new InputStreamReader(System.in);	
BufferedReader br = new BufferedReader(rd);
String readLine = br.readLine();
//-----------------------------第二种
InputStream is = client.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String rl = br.readLine();

4.网络编程中,Java用的是对象流Socket