一、io流的概述与流的分流
概述
io是技术,用于处理设备间的数据传输。内存、硬盘、网络通讯。
数据的输入输出以“流(stream)”的方式进行。
不同的数据要用不同的流,java.io包下就提供了不同的“流”类和接口,用以获取不同的数据,提供了标准的方法输入或输出数据。
io流原理
输入(读入)、输出(写出)都是基于内存角度
io流的分类
二、io流的体系结构
三、节点流
FileReader
1. read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1
2. 异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理
3. 读入的文件一定要存在,否则就会报FileNotFoundException。
//【写出的文件一定要存在吗?】
//垃圾回收机制只回收JVM堆内存里的对象空间。 //对其他物理连接,比如数据库连接、【输入流输出流】、Socket连接无能为力, // 要手动关闭,不关闭会导致内存泄漏
FileReader读入数据的操作
//Reader的read三个方法: //read()每次读一个 //read(char cbuf[]) //read(char cbuf[], int off, int len)放指定几个,用的比较少
FileReader用read(char[] cbuf)读入数据
FileWriter
FileWriter写出数据的操作
使用FileReader和FileWriter实现文本文件的复制
package com.atguigu.java;
import org.junit.Test;
import java.io.*;
/**
*
* 一、流的分类:
* 1.操作数据单位:字节流、字符流
* 2.数据的流向:输入流、输出流
* 3.流的角色:节点流、处理流
*
* 二、流的体系结构
* 抽象基类 节点流(或文件流) 缓冲流(处理流的一种)//【给前面对应的四个流包装】//【缓冲流用于提高读写效率】
* InputStream FileInputStream (read(byte[] buffer)) BufferedInputStream (read(byte[] buffer)) //【作用在FileInputStream上】
* OutputStream FileOutputStream (write(byte[] buffer,0,len) BufferedOutputStream (write(byte[] buffer,0,len) / flush() //【作用在FileOutputStream上】
* Reader FileReader (read(char[] cbuf)) BufferedReader (read(char[] cbuf) / readLine()) //【作用在Reader上】
* Writer FileWriter (write(char[] cbuf,0,len) BufferedWriter (write(char[] cbuf,0,len) / flush() //【作用在Writer上】
* //【为什么是0,len?不然的话会输出123ld】
* //【开发的时候用缓冲流,更快】
*
*
* @author shkstart
* @create 2019 上午 10:40
*/
public class FileReaderWriterTest {
public static void main(String[] args) {
File file = new File("hello.txt");//相较于当前工程
System.out.println(file.getAbsolutePath());
File file1 = new File("day09\\hello.txt");
System.out.println(file1.getAbsolutePath());
}
/*
将day09下的hello.txt文件内容读入程序中,并输出到控制台
说明点:
1. read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1
2. 异常的处理:为了【保证流资源一定可以执行关闭操作】。需要使用try-catch-finally处理
3. 【读入的文件】一定要存在,否则就会报FileNotFoundException。
//【写出的文件一定要存在吗?】
*/
@Test
public void testFileReader(){
FileReader fr = null;
try {
//1.实例化File类的对象,指明要操作的文件
File file = new File("hello.txt");//相较于当前Module
//2.提供具体的流
fr = new FileReader(file);//【造好管道】//【出文件找不到的异常FileNotFoundException】
//3.数据的读入 //【对数据操作】
//read():返回读入的一个字符。如果达到文件末尾,返回-1
//【a --- 97,所以返回值是int(ascii码)】
//【调一次,读一个】
//方式一:
// int data = fr.read();
// while(data != -1){
// System.out.print((char)data);//【强转】
// data = fr.read();
// }
//【垃圾回收机制只回收JVM堆内存里的对象空间。
//对其他物理连接,比如数据库连接、【输入流输出流】、Socket连接无能为力,
// 要手动关闭,不关闭会导致内存泄漏】
//【上面的操作:实现了读取硬盘中的文件,手机app联系人,打开,里面有联系人信息,
// 联系人信息写在xml里或数据库里。
// 一点开app,就会把xml文件输入到内存里(呈现给用户看)】
//方式二:语法上针对于方式一的修改
int data;
while((data = fr.read()) != -1){//【read()了11次,最后一次返回-1】
System.out.print((char)data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.流的关闭操作
// try {
// if(fr != null)
// fr.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
//或
if(fr != null){//【为什么加这个判断?如果new FileReader(file)出现异常,就不会ne