IO流概念
input、output。什么是input、output可以去回顾一下冯诺依曼结构。
- 其实就是内存和外存之间写入和写出就是一 个个“流”(说成数据流可能好理解一点)。
- 也可以扩展成主机与主机之间通讯,你给我传输数据,我给你传输数据,也可以理解为一个个“流”。
- 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。(因为我们是以“内存”的角度是看的,对与“内存而言”,就是输入。当然,如果是以“外存”的角度,就是输出啦。主要是理解“输入”、“输出”是一个相对的概念)
- 输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中。
- java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
流的分类
- 按操作数据单位不同分为:字节流(8bit)(图片、视频等等)、字符流(16bit)(操作文本文件.txt等等)
- 按数据的流向不同分为:输入流、输出流(输入输出是相对的,主要看以谁为主体)
- 按流的角色的不同分为:节点流、处理流
- 节点流。一个文件,现在要把文件内容传输到内存中。直接将文件和内存连接起来,建立传输。这种就叫做节点流。打个比方就是,有一个水池,一个浴缸,直接将水池的水引流到浴缸,这种就是节点流。
- 处理流。在节点流的基础之上再包一层(也可以是包多几层),加快传输速度就是处理流(外面的这几层都叫做处理流)。
java中的io类
-
抽象基类
为什么是抽象?因为实际情况太复杂了,情况很多,具体实现就交给子类去完成,基类定义一些规范就行了。 -
子类
-
后缀Stream→字节流,Reader/Writer→字符流
-
Output→输出流,Input→输入流
-
除开4个抽象基类,节点流都包含File,剩余都是处理流。
-
背景蓝色的都是重点
FileInputStream
//处理异常的方式是抛出
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileInputStreamTest<Text> {
public static void main(String[] args) throws IOException {
File file = new File("hello.txt");//这个路径是相对路径,是相对于我们的工程“javaSE”来说的
System.out.println(file.getAbsoluteFile());//C:\Users\xxx\Desktop\javaSE\hello.txt
File file1 = new File("io\\hello.txt");
System.out.println(file1.getAbsoluteFile());//C:\Users\xxx\Desktop\javaSE\io\hello.txt
/*
将hello.txt的内容读入到程序(内存)中,然后输出到控制台
*/
//1.实例化File类,指明要操作的对象
File file2 = new File("Hello\\src\\io\\hello.txt");
System.out.println(file2.getAbsoluteFile());//C:\Users\xxx\Desktop\javaSE\Hello\src\io\hello.txt
//2.提供具体的流
FileReader fr = new FileReader(file2);
//3.数据的读入
//read():返回读入的一个字符。如果达到文件末尾了,返回-1
int data = fr.read();
while(data != -1){
System.out.print((char)data);
data = fr.read();
}
//4.流的关闭操作
fr.close();
}
/*
@Text
public void test(){
File file = new File("hello.txt");//单元测试里面的路径是相较于当前module的
}
*/
}
//处理异常的方式是捕获
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileInputStreamTest {
public static void main(String[] args) {
File file = new File("hello.txt");//这个路径是相对路径,是相对于我们的工程“javaSE”来说的
System.out.println(file.getAbsoluteFile());//C:\Users\xxx\Desktop\javaSE\hello.txt
File file1 = new File("io\\hello.txt");
System.out.println(file1.getAbsoluteFile());//C:\Users\xxx\Desktop\javaSE\io\hello.txt
/*
将hello.txt的内容读入到程序(内存)中,然后输出到控制台
*/
FileReader fr = null;
try {
//1.实例化File类,指明要操作的对象
File file2 = new File("Hello\\src\\io\\hello.txt");
System.out.println(file2.getAbsoluteFile());//C:\Users\xxx\Desktop\javaSE\Hello\src\io\hello.txt
//2.提供具体的流
fr = new FileReader(file2);//文件路径一定要对,否则会报FileNotFoundException
//3.数据的读入
//read():返回读入的一个字符。如果达到文件末尾了,返回-1
/*方式一
int data = fr.read();
while(data != -1){
System.out.print((char)data);
data = fr.read();
}
*/
//方式二
int data;
while ((data = fr.read()) != -1){
System.out.print((char)data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {//为了保证资源一定可以关闭(有可能出现异常,如果直接抛出,就不会执行下面的代码,就不会关闭),使用finally
//4.流的关闭操作
try {
if(fr!=null){ fr.close(); }//因为在fr实例化的时候有可能异常,也就是文件找不到,所有要加if判断
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
@Text
public void test(){
File file = new File("hello.txt");//单元测试里面的路径是相较于当前module的
}
*/
}