Java I/O
一、IO的定义
- I:Input
- O:Output
- 对数据流的输入、输出:
输入的概念是往内存中读入硬盘上的数据,这叫读 read
输出的概念是从内存中往硬盘上写数据,这叫做写 write - 通过IO可以完成硬盘文件的读和写
二、流的分类
1、按照流的方向分类
- 往内存中去:叫做输入(Input)。或者叫做读(Read)。
- 从内存中出来:叫做输出(Output)。或者叫做写(Write)。
输入流指的是:往内存中存入数据,叫做输入,也叫作读,Inputxxx
输出流指的是:从内存中往外取数据,叫做输出,也叫作写,Outputxxx
2、按照读取数据方式分类
字节流
:每次读取一个字节,8bit – 1Byte字符流
:每次读取一个字符。读取的时候一次读取一个字符
字节流可以读取任何形式的数据:包括文本、音频、图像、视频等等。
字符流只能读取纯文本形式的数据,也就是txt格式的数据。
字节流没有缓冲区,是直接输出的。
字符流则是先输出到缓冲区
字节流未调用close()方法时便已经输出,而字符流只有先调用close()方法关闭缓冲区才能输出,若字符流想不关闭便输出则需手动调用flush()方法
3、如何区别字节流和字符流
- 字节流:以Stream结尾的都是字节流
如:FileInputStream FileOutputStream BufferedInputStream BufferedOutputStream - 字符流:以Reader或者是Writer结尾的都是字符流
Reader Writer InputStreamReader OutputStreamWriter
三、IO包
- 字节流:
- java.io.InputStream 字节输入流
- java.io.OutputStream 字节输出流
- 字符流:
- java.io.Reader 字符输入流
- java.io.Writer 字符输出流
四种方法都是抽象类。(abstract class)
所有的流都实现了:
java.io.Closeable接口,都是可关闭的,都有 close() 方法。
流是一个管道,这个是内存和硬盘之间的通道,用完之后一定要关闭,不然会耗费(占用)很多资源。养成好习惯,用完流一定要关闭。
所有的输出流都实现了:
java.io.Flushable接口,都是可刷新的,都有 flush() 方法。
养成一个好习惯,输出流在最终输出之后,一定要记得flush()刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据强行输出完(清空管道)刷新的作用就是清空管道。
如果没有flush()可能会导致丢失数据。
在java中只要“类名”以 Stream 结尾的都是字节流。以“ Reader/Writer ”结尾的都是字符流。
四、Java中重要的16个流
- 文件专属:
- java.io.FileInputStream
- java.io.FileOutputStream
- java.io.FileReader
- java.io.FileWriter
- 转换流:(将字节流转换成字符流)
- java.io.InputStreamReader
- java.io.OutputStreamWriter
- 缓冲流专属:
- java.io.BufferedReader
- java.io.BufferedWriter
- java.io.BufferedInputStream
- java.io.BufferedOutputStream
- 数据流专属:
- java.io.DataInputStream
- java.io.DataOutputStream
- 标准输出流:
- java.io.PrintWriter
- java.io.PrintStream
- 对象专属流:
- java.io.ObjectInputStream
- java.io.ObjectOutputStream
- File文件类
- java.io.File
五、InputStream
InputStream是一个抽象类,无法创建对象,所以,我们要使用它的子类。
子类用得最多的是FileInputStream
1.先要有输入源。有了输入源才能往内存中读入数据。
2.FileInputStream的输入源是什么东西?File文件,所以先要有文件
InputStream is = new FileInputStream(String或者File);
String类型的参数表示:文件的路径
File类型的参数表示:一个文件对象
3.FileInputStream就是一个输入的管道,通过这个管道中的read方法将硬盘上的数据
读入到内存中
流的步骤:
1.确定源
2.打开流
3.操作
4.关闭流
六、IO流的应用
将C盘的a.txt文件移动到D盘
:
package com.myJava.IO;
import java.io.*;
public class MyCopy {
public static void main(String[] args) {
//将变量定义在外部方便后面关闭资源
InputStream fis=null;
OutputStream fos=null;
try {
fis = new FileInputStream("C:\\io\\a.txt");
fos = new FileOutputStream("D:\\a.txt"); //如果D盘没有这个文件夹会自动创建
//循环读取
int n;
while ((n=fis.read())!=-1) { //文件读取完毕,read返回-1
fos.write((char)n); //读取一个字节就往D盘新建的a.txt文件中写入
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
finally { //关闭资源
if (fis !=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos !=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}