什么是IO流?
I:Input
O:Output
通过IO可以完成硬盘文件的读和写。
流是一连串连续动态的数据集合。可以理解为是我们在内存和硬盘之间进行文件读写的一个管道。抽象的一个概念。我们可以看成是一个管道,我们输入的数据要从管道的一端留到另一端去,在计算机里就是从内存读取数据到程序
什么时候使用IO流?
当内存需要从硬盘读取文件的时候
谁来操作的输入输出?
计算机
输入和输出分别指的是谁?
- 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
- 输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中
Java中流在哪个包下?
java.io.*;
有哪些流(分类)?
InputStream
OutputStream
Read
Write
- 按照流的方向(以内存作为参照物):
- Input/Read:往内存中去,输入
- Output/Write::从内存中出来,输出
- 按读取数据方式不同:
- Stream字节流
一次读取1个字节byte,等同于一次读取8个二进制,什么类型的文件都可以读取。包括:文本文件、图片、声音文件、视频
假设文件file1.txt,采用字节流的话是:
a中国bc张三fe:
第一次读:一个字节,正好读到'a'
第二次读:一个字节,正好读到'中'字符的一半
第三次读:一个字节,正好读到'中'字符的另一半
- Reader/write字符流
一次读取一个字符,这种流是为了方便读取普通文本文件而存在的,这种流不能读取:图片、声音、视频等文件。只能读取纯文本文件,连word都无法读取
假设文件file1.txt,采用字节流的话是:
第一次读:'a'字符('a'字符在windows系统中占用1个字节)
第二次读:'中'字符('中'字符在windows系统中占用2个字节)
在java中只要“类名”以stream结尾的都是字节流。以“reader/writer”结尾的都是字符流(以谁结尾就是什么流)
方法
close():关闭
内存和硬盘之间的通道,用完之后一定要关闭,不然会耗费(占用)很多资源
flush():刷新
把管道清空,如果管道中剩余一些内容没有输出完毕,则会强制把剩余部分输出完。
注意:如果没有flush()可能会导致丢失数据
具体的流类及使用
InputStream
基本方法
PutputStream
基本方法
Reader
两个字节两个字节读
基本方法
Writer
基本方法
节点流类型
线程和线程之间的通信
import java.io.*; public class TestFileInputStream { public static void main(String[] args){ int b =0; FileInputStream in =null; try{ //已经连接管道 in = new FileInputStream("C:\\Users\\denglimei\\Desktop\\快捷键.txt"); } catch (FileNotFoundException e) { System.out.println("找不到指定文件"); System.exit(-1); } try { long num =0; //读一个字节放到b这个变量里面,!=-1表示还没有都到结尾, while ((b = in.read())!=-1) { //强制转换为char类型打印出来 System.out.print((char)b); //计数 num++; } in.close(); System.out.println(); System.out.println("共读取了"+num+"个字符"); } catch (Exception e) { System.out.println("文件读取错误"); System.exit(-1); } } }
import java .io.*; public class TestFileOutputStream { public static void main(String[] args){ int b =0; FileInputStream in =null; FileOutputStream out =null; try { in = new FileInputStream("C:\\Users\\denglimei\\Desktop\\快捷键.txt"); out = new FileOutputStream("C:\\Users\\denglimei\\Desktop"); while((b=in.read())!=-1){ out.write(b); } in.close(); //每读取一个文件就关闭 out.close(); } catch (FileNotFoundException e) { System.out.println("找不到指定文件"); System.exit(-1); } catch (IOException e) { System.out.println("文件复制错误"); System.exit(-1); } System.out.println("文件已复制"); } }
import java.io.*; public class TestFileReader { public static void main(String[] args){ FileReader fr =null; int c =0; try { fr = new FileReader("C:\\Users\\denglimei\\Desktop\\快捷键.txt"); int ln =0; while((c=fr.read()) !=-1){ System.out.print((char)c); } fr.close(); } catch (FileNotFoundException e) { System.out.println("找不到指定文件"); }catch(IOException e){ System.out.println("文件读取错误"); } } }
import java.io.*; public class TestFileWriter { public static void main(String[] args){ FileWriter fw = null; try { fw = new FileWriter("C:\\Users\\denglimei\\Desktop\\快捷键.txt"); for (int c =0; c<=50000; c++) { fw.write(c); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("文件写入错误"); System.exit(-1); } } }
缓冲流
转换流(TransformIO)
数据流(DataStream)
输出流(Print)
Object流
直接将Object写入或流出