【1】什么是IO流呢?
IO流:IO流用来处理设备之间的数据传输(java对数据操作都是通过流的方式;java用于操作流的对象都包含在IO包中)
【2】IO流的分类?
A:按数据流向分:
1:输入流:读入数据:
2:输出流:写出数据
B:按数据类型分:
1:字节流:可以读写任何类型的文件,比如:音频,视频,文本文件
a:字节输入流InputStream 读
b:字节输出流OutputStream 写
2:字符流:只能读写文本文件
a:字符输入流 Reader 读
b:字符输出流 Writer 写
如果数据所在的文件通过Windows自带的记事本打开并能读懂里面的内容,就用字符流,其他用字节流。
【3】IO流基类概述
A:字节流的抽象基类 InputStream OutputStream
B:字符流的抽象类:Reader Writer
注意:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀
如:InputStream的子类FileReader
【4】FileOutputStream的构造方法
举个小实例呦:
public class Demo {
public static void main(String[] args) throws IOException {
FileOutputStream out=new FileOutputStream("a.txt");
out.write(100);//向文件中写入一个字节
out.write("夏牧子".getBytes());//写入字节数组
byte[] bytes="慢慢喜欢你".getBytes();//写入字节数组的一部分
out.write(bytes,6,9);
out.close();//释放资源
}
}
我们现在操作的是文本文件,所有按照我们的想法,我们优先想到字符流,但是字节流优先于字符流,所以先使用字节流
因为我们要写数据,所以我们应该使用字节流中的输出流OutputStream
我们发现OutputStream是一个抽象类,我们不能对其进行直接实例化,而我们需要使用子类对其进行实例化,操作文件的话,我们可以选择FileOutputStream
【5】FileOutputStream写出数据
它的构造方法FileOutputStream(File file)
FileOutputStream(String name)
举个例子蛤:File file=new File("b.txt");//创建了一个新文件
FileOutputStream file1=new FileOutputStream(file);//创建一个向file文件中写入数据的文件输出流
上面的代码,做了哪些事情嘞?
a:调用系统资源创建b.txt
b:创建out输出流对象,关联b.txt
操作到最后都需要执行out.close();
作用是释放资源,为了释放底层代码,让out 这个对象编程垃圾等待垃圾回收器的回收
【6】FileOutputStream的三个write()方法
---->public void write(int b):写一个字节,超过一个字节,砍掉前面的字节
---->public void write(byte[] b ):写一个字节数组
---->public void write(byte[] b,int off,int len):写一个字节数组的一部分
来演示一下这三个write()方法的使用
FileOutputStream out = new FileOutputStream("a.txt");
//向文件中写入数据
out.write(100);//向文件中写入一个字节
//写入字节数组
out.write("夏牧子".getBytes());
//写入字节数组的一部分
byte[] bytes = "春天的风能否吹来夏天的雨".getBytes();
//从第9个字节开始写15个字节 utf-8 一个汉字是3个字节
out.write(bytes,9,15);
//注意流使用完毕要关闭
out.close();//释放资源
默认的编码方式是UTF-8 因此一个汉字是占3个字节
【7】FileOutputStream写入数据实现换行和追加写入
换行:
Windows下的换行符是用 \r\n
Linux下的换行符是用 \n
Mac下的换行符是用 \r
追加:FileOutputStream写出数据时如何实现数据的追加写入呢?
FileOutputStream fos=new FileOutputStream("fos.txt",true);//完成追加写入
FileOutputStream fos=new FileOutputStream("fos.txt");//完成数据的追加写入
//写入数据
for(int i=0;i<10;i++){
fos.write(("hello"+i).getBytes());
fos.write("\r\n".getBytes());//写入换行符
}
fos.close();//释放资源
【8】FileOutputStream写出数据加入异常处理
package CSDNDemo;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOExceptionDemo {
public static void main(String[] args) {
FileOutputStream out=null;
try{
out=new FileOutputStream("d.txt");
byte[] bytes="abc".getBytes();
out.write(bytes,1,2);
}catch(IOException e){
try{
if(out!=null){
out.close();
}
}catch(IOException e1){
e1.printStackTrace();
}
}
}
}
【9】FileInputStream 读取数据一次读取一个字节
如果没有数据,返回的是-1
FileInputStream in=new FileInputStream("a.txt");
byte[] bytes=new byte[1024];
int len=0;
len=in.read(bytes,0,2);
String s=new String(bytes);//把字节数组转化成字符串
in.close();
【10】字节流复制文本文件
过程解析:A:创建字节输入流对象和字节输出流对象
B:读写操作
C:释放资源
FileInputStream in = new FileInputStream("a.txt");
FileOutputStream out=new FileOutputStream("E:\\copy.txt");
int len=0;
byte[] bytes=new bytes[1024*8];
while((len==in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
in.close();
out.close();
【11】BufferedOutputStream写出数据概述
缓冲思想:字节流一次读写一个数组的速度明显比一次读写一个字节的速度块的多,这也是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想,提供了字节缓冲区流
【12】BufferedOutputStream和BufferInputStream的构造方法
BufferedOutputStream(OutputStream out)
BufferedInputStream(InputStream in)
来个小实例演示一下:
BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream("a.txt"));
BufferedInputStream in=new BufferedInputStream(new FileInputStream("b.txt"));
int len=0;
while((len=in.read())!=-1){
out.write(len);
out.flush();
}
in.close();
out.close();