I/O流(输入/输出流)
一、字节流
1)基本字节流
InputStream抽象了以字节读取数据的方式;
OutputStream抽象了以字节写出数据的方式;
2)EOF=End =读到-1就读到结尾;
3)InputStream基本方法:
in.read();//读取一个字节无符号填充到int低八位,-1是EOF
in.read(byte[] buf);
in.read(byte[] buf,int start,int size)
4)OutputStream基本方法
out.write(int b); //写出一个byte到流,b的低八位
out.write(byte[] buf);//将buf字节数组都写入到流
out.write(byte[] buf,int start,int size)
5)文件字节流
FileInputStream ---> 具体实现了在文件上读取byte数据的方法
FileOutputStream ---> 具体实现了向文件中写出byte数据的方法
6)DataOutputStream/DataInputStream
对流功能的扩展,可以更加方便的读取int,long,字符等类型数据
DataOutputStream:由FileOutputStream构造出来,通过包装FileOutput,可以调用FileOutput类的write方法来构造新的更方便的写方法:
DataOutputStream dos =new DataOutputStream(new FileOutputStream(file))
dos.writeInt(10);
dos.writeLong(10l);
dos.writeDouble(10.5);
(DataInputStream和DataOutputStream类似)
8)BufferedInputStream/BufferedOutputStream
为IO提供了带缓冲区的操作,提高了流模式的IO的性能
FileOutputStream--->write() 方法相当于一滴一滴地把水"转移"过去
DataOutputStream--->write()方法相当于一瓢一瓢地把水"转移"过去
BufferedOutputStream--->write()方法相当于一瓢一瓢先放入桶中(缓冲区),再从桶中倒入到另一缸中. --单字节读取:方法:int b=in.read()
效率低(没有缓冲区),一般不用与大文件的读取
--批量读取:方法:int bytes=in.read(byte[] b,int start,int length)
效率高(利用了缓冲区),一般用于大文件读取,是常用的文件读取方法
9)输入输出流的联合使用:
1、开启流
FileInputStream in=new FileInputStream(srcFile);
//需要判断的是srcFile是否存在,是否是文件;若是文件,则进行后续操作
FileOutputStream out=new FileOutputStream(destFile);
//因为destFile即使不自己创建,程序也会帮忙创建,所以不用判断是否存在,是否文件
2、进行读写操作。
批量读取——建立缓冲区
byte[] buf=new byte[2*1024];
int b=in.read(buf));
// 判断是否读完,-1则读完,b的值是读到的个数,他并不会等于-1 只是b=in.read(buf)整个等于-1则代表读取完毕了。如果第一次不等于-1则读取第二次,直到读完为-1为止.
循环批量读取
int bytes;
while((bytes=in.read(buf,0,buf.length))!=-1){
out.write(buf,0,bytes);
}
二、字符流
1、基本字符流
Reader抽象了以字符读取数据的方式
Writer抽象了以字符写出数据的方式
1)Reader基本方法:
int b=in.read(); //读一个字符,当流中没有数据可读时,返回值为-1
in.readread(char[] c);//根据数组尺寸从流中读字符,置于数组中。返回读取字符个数。 in.read(char[] c,int off,int len)//读入len 个字符,从下标off 开始置入数组cbuf in.close() // 关闭流
2)Writer基本方法
out.write(int b); //写一个字符数据
out.write(char[] cbuf); //向流中写字符数组cbuf
out.write(String s); //向流中写一个字符串(很实用)
out.flush();//将缓冲区中数据立即写入到输出流, 刷新缓冲区
out.close();// 关闭流
注:字符流一次处理一个字符,底层仍然是基本的字节序列;字符流操作的是文本文件
2、字符流的基本实现
1)InputStreamReader/OutputStreamWriter
--InputStreamReader:完成byte流解析为char流,按照编码解析
FileInputStream in = new FileInputStream("e:\\javaio\\imoocutf8.txt"); //获取字符输入流
InputStreamReader isr = new InputStreamReader(in,"utf-8");
//默认项目的编码,操作的时候,要写文件本身的编码格式
--OutputStreamWriter 提供char流到byte流,按照编码处理。
OutputStreamWriter:提供char流到byte流,按照编码处理
FileOutputStream out = new FileOutputStream("e:\\javaio\\imoocutf81.txt"); //获取字符输出流
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
2)FileReader / FileWriter (字符流过滤器)
专用对文件字符流的操作,无需进行嵌套构造
FileReader fr = new FileReader ("目录/路径");
FileWriter fw = new FileWriter ("目录 / 路径", true ); //加上true参数表示追加 或
FileReader fr = new FileReader("e:\\javaio\\imooc.txt"); //输入流
FileWriter fw = new FileWriter("e:\\javaio\\imooc2.txt");//输出流
3)BufferedReader/BufferedWrite(字符缓冲流)
--BufferedReader、BufferedWriter继承于Reader、Writer.
--BufferedReader构造函数参数是Reader抽象类,所以要用他的另一个子类InputStreamReader来构造。而InputStreamReader的构造方法是InputStream对象,所以要用InputStream的子类FileInputStream来构造.
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); String line;
line = br.readLine(); //一次读取一行,不能识别换行
System.out.println(line);//一次写入一行
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))); bw.write(line);
bw.newLine(); //单独换行操作
bw.flush(); //字符流的所有Output的流write()后都要flush()来刷新此流缓冲
4) PrintWriter(打印流)
PrintWriter继承于Writer,构造方法是File或String name; 构造方便。
PrintWriter pw=new PrintWriter("E:\\java\\text.txt")
pw.println(line);//自动换行
三、对象的序列化,反序列化
(1)对象序列化:将Object转换成 byte序列,反之叫对象的反序列化
(2)序列化流(ObjectOutputStream)-----writeObject
反序列化流(ObjectInputStream)----readObject
(3)序列化接口(Serializable)
--对象必须实现序列化接口,才能进行序列化,否则将出现异常
--这个接口,没有任何方法,只是一个标准
--其实序列化,就是把对象的各个属性,写入到文件中,以字节的形式存储。
//序列化
String file = "demo/obj.dat"; //相对路径下可以使用单斜杠
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
Student stu = new Student("10001", "张三", 20);
oos.writeObject(stu);
oos.flush();
oos.close();
//通过反序列化 把序列化后的对象读出
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
Student stu = (Student) ois.readObject();
System.out.println(stu); ois.close();
第二篇:JAVA_IO流总结
Java开发中IO流介绍
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
IO流的分类
?根据处理数据类型的不同分为:字符流和字节流
?根据数据流向不同分为:输入流和输出流
一、流的分类
1、按功能分
读取流:InputStream Reader
写出流:OutPutStream Writer
2、按流的类型分类
字节流:InputStream OutputStream
字符流:Reader Writer
二、流功能分析
读取流是从输入设备或数据对象中读取数据到程序,用程序进行处理读入的数据,写出流是把程序处理的数据输出到输出设备上比如硬盘和控制台。
字节流读取和写入的数据单位是字节,可以读取和写入任何类型的数据。达内西安Java培训讲师表示,字符流读取跟写入的数据单位是字符,只能读取和写入文本类型的数据。当需要读取或写入文本型的数据时要用字符流,因为它会比字节流读写字符更方便和高效,相反当数据不是文本型时只能用字节流来读取跟写入。
三、流中读写方法的示例。(当用到IO流时就有可能出现IO异常,所以需要处理可能的异常)
字节流:
FileOutputStream fos = new FileOutputStream("D://xxx.xxx");
fos.write("dsfdsf".getBytes());//写入字节数组
fos.close(); //用完后需要关闭流,释放资源。字节流不需要Flush
FileInputStream fis = new FileInputStream("D://xxx.xxx");
fis.read(); //读取一个字节
fis.close();
四、转换流
当需要流之间的转换时会用到转换流。
1、把字节读取流转换成字符读取流
InputStreamReader isr = new InputStreamReader(newFileInputStream("xxx.xxx"));
2、把字符输出流转化成字节输出流
OutputStreamWriter osw = new OutputStreamWriter(newFileOutputStream("xx.xxx"));
五、缓冲流
需要提高流的读写效率时会用到缓冲流
1、字节缓冲流
BufferedInputStream bis = new BufferedInputStream(newFileInputStream("xx"));
BufferedOutputStream bos = new BufferedOutputStream(newFileOutputStream("xx"));
2、字符缓冲流
BufferedReader br = new BufferedReader(isr);
PrintWriter bw = new PrintWriter(osw);
缓冲流对读写功能进行了增强,而且使用缓冲技术提高了读写效率,所以当需要提高程序的读写效率时要使用缓冲流。
六、File类的使用
1、创建
boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false.
和输出流不一样,输出流对象已建立创建文件。而且文件已经存在,会覆盖。
boolean mkdir()创建文件夹
boolean mkdirs()创建多级文件夹
2、删除。
boolean delete();删除失败时返回false.如果文件正在被使用,则删除不了返回false.
void deleteOnExit();在程序退出时删除指定文件。
3、判断
boolean exists();文件是否存在。
isFile():是不是文件
isDirectory();是不是文件夹
isHidden();是不是隐藏文件
isAbsolute();是不是绝对路径
4、获取信息
getName();文件名
getPath();文件路径
getParent();上一层路径
getAbsolutePath();绝对路径