欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

常见IO流简介

程序员文章站 2024-03-12 12:26:14
...

常见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