常见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);//自己写的封装的流的关闭 }
四.详解
- 字符流本质是字节流的拓展封装
- 缓冲流是字节流和字符流的包装,使用缓冲流效率更好
- 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