什么是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写入或流出