本质是一套用于数据传输的机制
三要素(方向,方式,位置)
根据传输的方向:(参照物--内存)
输入流:往内存来传入数据
输出流:从内存往外传输数据
根据传输的方式
字符流--传输的字符形式数据
字节流--传输字节形式的数据
四大基本流:(四个类都是抽象类)
根据数据存放/获取的位置
硬盘、内存、网络、外设设备
硬盘:
字符流
给硬盘上的一个.txt文件写入数据 文件 字符输出流--FileWriter
从硬盘上.txt文件读取数据 文件 字符输入流--FileReader
package cn.tedu.io.file;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//创建文件字符输出流对象
//创建对象过程中会检测路径信息是否存在如果不存在则会新建空文件
//如果指定的路径信息存在则会创建新的空文件进行覆盖
//为了保证输出流能往文件写入数据(之前有的数据就不会影响新的写入数据)
FileWriter writer=new FileWriter("E:\\1.txt");
//写出数据
//底层为了提高和保证传输数据效率,提供缓冲区来传输数据并且要求存满了才进行传输
//此时数据没有存满(8kb)缓冲区就滞留在缓存区数据就丢了
writer.write("你好");
//冲刷缓冲区
//及时数据没有存满也会进行传输
//防止数据滞留在缓存区
writer.flush();
//关流
//含有自动冲刷过程
writer.close();
//把流对象置为null(无用对象)
writer=null;
}
}
IO流中的异常捕获:
1.在try块外声明流对象赋值为null,在try块里进行真正的初始化
2.保证流对象初始化成功才能进行关流
3.无论关流成功与否,流对象都要置为null,让系统进行回收
4.如果关流操作失败如果发生在自动冲刷之前,需要日安家一个手动冲刷过程,保证数据不会滞留在缓冲区
package cn.tedu.io.file;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo2 {
public static void main(String[] args) {
//1.声明IO流对象并且赋值为null
FileWriter writer=null;
try {
//流对象进行真正的初始化
writer=new FileWriter("E:\\2.txt");
//写入数据
writer.write("andj");
//4.手动冲刷
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
//2.判断流对象是否初始化成功
if(writer!=null)
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
//3.无论关流是否成功都要把流对象置为null
writer=null;
}
}
}
}
FileReader
package cn.tedu.io.file;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
//创建文件字符输入流的对象
//底层没有自带的缓冲区
FileReader reader=new FileReader("E:\\a.txt");
//读取数据
//返回单个字符的编码值
/*System.out.println(reader.read());//100
System.out.println(reader.read());//119
System.out.println(reader.read());//116
//读取完毕的标志--返回-1
System.out.println(reader.read());//-1*/
//通过循环实现
int i=-1;
//把方法返回值(读取到的字符编码值)赋值给新变量,再让新变量和-1比较
while ((i=reader.read())!=-1){
System.out.println(i);
}
//关流
reader.close();
}
}
package cn.tedu.io.file;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo2 {
public static void main(String[] args) throws IOException {
//创建字符输入流对象
FileReader reader=new FileReader("E:\\1.txt");
//自建缓冲区
//新数组
char[] cs=new char[4];
//把读取到的数据放到数组中
//方法返回值就是读取字符的个数,返回-1读取结束
int len=-1;
while ((len=reader.read(cs))!=-1){
//展示数组内容
System.out.println(new String(cs,0,len));
}
//关流
reader.close();
}
}
字节流
给硬盘上.txt文件写入数据 文件 字节输出流--FileOutputStream
从硬盘上.txt文件读取数据 文件 字节输入流--FileInputStream
package cn.tedu.io.file;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo {
public static void main(String[] args) throws IOException {
//创建文件字节输出流对象
//底层没有自带的缓冲区
//如果不指定append那么默认为false,就是每次新建空文件覆盖之前的内容
//如果指定append为true那么每次就是追加数据
FileOutputStream fos=new FileOutputStream
("E:\\2.txt",true);
//调用方法来写出数据
fos.write("你好".getBytes());
//关流
fos.close();
}
}
package cn.tedu.io.file;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
//创建文件字节输入流对象
FileInputStream fis=new FileInputStream("E:\\2.txt");
//返回一个字节对应的编码值
System.out.println(fis.read());
System.out.println(fis.read());
System.out.println(fis.read());
System.out.println(fis.read());
//返回-1的时候说明读取完毕
System.out.println(fis.read());
//自建缓冲区
byte[] bs=new byte[10];
int len=-1;
//返回的是读取到的字节数,遇到-1说明读取完毕
while ((len=fis.read(bs))!=-1){
System.out.println(new String(bs,0,len));
}
//关流
fis.close();
}
}