IO流
作用:解决设备和设备之间的数据传输问题。
按照 数据流出方向来划分:输出流和输入流
按照 处理的单位来进行划分:字节流和字符流
字节流 : 读取的数据是文件中的 二进制数据,不会对这个二进制数据进行任何的处理,直接以 二进制流的方式进行传输
字符流: 读取的数据是以字符为单位的。 字符串也是读取到这些二进制数据,然后它会把这些二进制数据转换为我们可以识别的字符。
1.字节流
使用步骤:
1.目标 (确定读取的 文件位置)
2.建立数据传输的 通道
3.读取文件中的 数据
4.关闭资源
输入流:FileInputStream和BufferedInputStream
例如:1.找到目标文件(用File来创建)
File file = new File("要找的文件目录");
2.建立数据传输的通道
FileInputStream inputStream = new FileInputStream(file); // 但要注意在这个方法中会抛 出 FileNotFoundException这个异常。
3.读数据(可用while循环来读取数据)
int content =0;
while((content = inputStream.read()) != -1){
System.out.println((char)content);
}
4.关闭资源
inputStream.close();
输出流:FileOutputStream和BufferedOutputStream
使用步骤:
1.目标 (确定读取的 文件位置)
2.建立数据传输的 通道
3.写入文件中的 数据(在写入数据时用write方法)
4.关闭资源
注意:(1)当使用 FileOutputStream的 write(int b)来写入数据的时候,接受的数据类型 虽然是 int类型实际上 它 只能给写出 一个 字节的数据(8个位的数据)
(2)使用FileOutputStream 类 来写入数据到 磁盘的时候, 如果指定的 目标文件 不存在,那么会自己创建这 个目标文件。
(3)使用FileOutputStream 类 来写入数据到 磁盘的时候, 如果指定的 目标文件 存在,那么写入的时候会先 清空文件中原本的数据,然后再写入数据(会覆盖掉原本的内容)。
(4)如果我们不想覆盖这个已经存在的文件中的内容,那么我们可以 用 FileOutputStream(File file, boolean append) 构造输出流对象。
例如:
1.找到目标文件(用File来创建)
File file = new File("要找的文件目录");
2.创建 数据传输的通道
FileOutputStream outputStream = new FileOutputStream(file);// 注意:如想在后面追加内容应写成(file, true)
3.写入数据到 目标文件
String data = "今天太阳很大!";
byte[] b = data.getBytes();
outputStream.write(b, 0, 2);
4.关闭资源
outputStream.close();
字节输入流和节输出流的联合应用
例如:
(1)读取的目标文件路径
File inputFile = new File("读取文件的路径");
(2)写入的目标文件的路径, mokey.jpg是不存在的,是在写入的时候创建的
File outputFile = new File("要输写的路径");
(3) 建立数据传输的通道
FileInputStream fileInput = new FileInputStream(inputFile); // 读取文件的通道
FileOutputStream fileOutput = new FileOutputStream(outputFile);// 输出文件的通道
(4)读取数据(创建缓冲数组,来读取数据)
byte[] b = new byte[1024];
int length = 0;
while((length = fileInput.read(b)) != -1){
fileOutput.write(b); // 当读取到数据后写入到要写的目录文件中 用write方法。
}
(5)关闭资源(注意:先开后关, 后开的先关)
fileOutput.close();
fileInput.close();
io异常的处理
异常存在的可能:读取文件时要读取的文件不存在,此时就会出现异常。
在遇到异常的时候运用我们所学的异常的处理的方法
方法: try{
}catch(IOException e){
}finally{
}
缓冲输入流:InputStream (父类) FileInputStream和BufferedInputStream(子类)
缓冲输出流:OutputStream (父类) FileOutputStream 和 BufferedOutputStream(子类)
作用:读取文件的数据,使用缓冲数组结合循环的方式,效率更高。
使用步骤:
1.找到一个目标文件 (要读取的文件)
2.建立数据传输的通道
3.建立 缓冲输入字节流 对象 来读取数据
4.关闭资源
注意: 实际上 BufferedInputStream这个类的对象本身并不具备读取数据和关闭资源的能力,是靠构造这个对象时提供给他的额FileInputStream对象来实现的
例如:
1.找到目标文件
File file = new File("要读取的文件目录");
2.建立数据传输的通道
FileInputStream fileInputStream = new FileInputStream(file);
3.准备用 BufferedInputStream来读取数据
BufferedInputStream bufferdInputStream = new BufferedInputStream(fileInputStream);
读取数据(一个一个字节的读取)
int content = 0;
while((content = bufferdInputStream.read()) != -1){
System.out.print((char)content);
}
4.关闭资源
bufferdInputStream.close();
缓冲输出字节流
注意事项:
1、使用bufferdOutputStream 写数据的时候,它的 write方法 实际上是先把数据写到了它内部维护的 字节数组中, 没有马上写入到 磁盘中
2.(1)在它内部的 数据被填满了,它会自动的写入
(2)当你调用 flush()方法, 就相当于通知它 把数据写到磁盘中去
(3)当你调用close()方法,关闭资源的时候, 再也不会有数据写入了,也会立刻写数据到磁盘
例如:1.找到目标文件
File file = new File("要写入的目录");
2.建立数据传输的通道
FileOutputStream fileOutputStream = new FileOutputStream(file);
3.准备用 BufferedInputStream来 写入数据
BufferedOutputStream bufferdOutputStream = new BufferedOutputStream(fileOutputStream);
写入数据 bufferdOutputStream.write("hello world".getBytes(), 0, 10);
4.关闭资源
bufferdOutputStream.close();