一、io:上传下载,写入写出
流: 一连串流动的数据,以先入先出的方式进行流动,管道,以程序为中心、程序与网络|文件|服务器|数组..(相关课程推荐:java视频教程)
分类
1)按照流向:
输入流;输出流
2)操作单元分:
字节流 (万能流):任何内容都可以转为字节,可以传输文本,图片,音频;字符流 :只能操作纯文本数据
3)按照功能:
节点流 : 包裹源头,实现基本功能;功能流 : 对节点流增强性能,提高效率
4)各个分类之间是相辅相成的
字节流
(1)字节输入流 : inputstream 此抽象类是表示字节输入流的所有类的超类;fileinputstream 从文件系统中的某个文件中获得输入字节
//字节流输入 inputstream //导包 导包快捷键: ctrl+shift+oimport java.io.file;import java.io.fileinputstream;import java.io.filenotfoundexception;import java.io.ioexception;import java.io.inputstream;public class demo01 { public static void main(string[] args) throws ioexception { //fileinputstream(string name) 通过打开一个到实际文件的连接来创建一个 fileinputstream,该文件通过文件系统中的路径名 name 指定 //fileinputstream(file file) 通过打开一个到实际文件的连接来创建一个 fileinputstream, 该文件通过文件系统中的 file 对象 file 指定 inputstream is=new fileinputstream(new file("d:/test.txt"));//创建d盘符的根目录下的文件 system.out.println(is); //方式1: int read() 读入数据 一个字节一个字节读入 /*int num=is.read(); system.out.println((char)num); num=is.read(); system.out.println((char)num); system.out.println((char)(is.read()));*/ //方式2:使用循环,循环读入,可以简化代码,重复代码只写一次,但还是一个字节一个字节的读入 /*int num=-1; while((num=is.read())!=-1){ system.out.println((char)num); }*/ //方式3:int read(byte[] b) 一个字节数组一个字节数组的读入 //返回值: 返回读入到字节数组中数据的个数,没有读到返回-1 byte[] car=new byte[1]; //int len=is.read(car); int len=-1; while((len=is.read(car))!=-1){ system.out.println(new string(car,0,len)); } //关闭 is.close(); }}
(2)字节输出流: outputstream 此抽象类是表示输出字节流的所有类的超类;fileoutputstream 文件输出流是用于将数据写入 file 的输出流
//字节输出流 outputstream//导包 导包快捷键: ctrl+shift+oimport java.io.filenotfoundexception;import java.io.fileoutputstream;import java.io.ioexception;import java.io.outputstream;public class demo02 { public static void main(string[] args) { //fileoutputstream(string name)创建一个向具有指定名称的文件中写入数据的输出文件流 //fileoutputstream(string name,boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流 //fileoutputstream(file file,boolean append) 创建一个向指定 file 对象表示的文件中写入数据的文件输出流 //boolean append 返回值:true追加,false不追加(默认false) outputstream os=null; //try...catch(){} 捕捉异常,处理异常 try { //1.选择流 os=new fileoutputstream("d:/hhh.txt",hhtrue); //文件不存在,系统会自动帮我们创建,但文件夹不会 //2.准备数据 string str="要好好学习,天天向上..."; byte[] c和=str.getbytes(); //3.写出 void write(byte[] b) os.write(ch); //4.刷出 os.flush(); } catch (filenotfoundexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } finally{ //5.关闭 try {//预防空指针异常 if(os!=null){ os.close(); } } catch (ioexception e) { e.printstacktrace(); } } }}
字符流
只能操作纯文本
1)节点流:
(1)字符输入流:reader 读取字符流的抽象类;filereader 用来读取字符文件的便捷类
//字符输入流 reader//导包 导包快捷键: ctrl+shift+oimport java.io.filenotfoundexception;import java.io.filereader;import java.io.ioexception;import java.io.reader;public class demo03 { public static void main(string[] args) { //filereader(string filename) reader rd=null; try { //1.选择流 rd=new filereader("d:/hehe.txt");//创建d盘符的根目录下的文件 //2.读入 //方法1:int read() 读取单个字符。 /*system.out.println((char)rd.read()); system.out.println((char)rd.read()); system.out.println((char)rd.read()); system.out.println((char)rd.read());*/ int len=-1; //存储读到的数据 如果为-1,证明已达到末尾 //方法2: /*while(-1!=(len=rd.read())){ system.out.println((char)len); }*/ //方法3:int read(char[] cbuf) 将字符读入数组。 char[] car=new char[1024]; while((len=rd.read(car))!=-1){ system.out.println(new string(car,0,len)); } } catch (filenotfoundexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } finally{ if(rd!=null){ try { //关闭功能 rd.close(); } catch (ioexception e) { e.printstacktrace(); } } } }}
(2)字符输出流: writer 写入字符流的抽象类;filewriter 用来写入字符文件的便捷类
//字符输出流:writer//导包 导包快捷键: ctrl+shift+oimport java.io.filenotfoundexception;import java.io.filereader;import java.io.filewriter;import java.io.ioexception;import java.io.reader;import java.io.writer;public class chardemo02 { public static void main(string[] args) { //filewriter(file file) //默认不追加 //filewriter(file file, boolean append) //filewriter(string file) //filewriter(string file, boolean append) writer rt=null; try { //1.选择流 rt=new filewriter("d:/houhou.txt",true); //2.写出 /* void write(char[] cbuf) 写入字符数组 void write(char[] cbuf, int off, int len) 写入字符数组的某一部分 void write(int c) 写入单个字符 void write(string str) 写入字符串 void write(string str, int off, int len) 写入字符串的某一部分 */ rt.write(97); rt.write("\r\n"); //换行 rt.write("你真好看!!!!"); rt.write("\r\n"); rt.write("你真好看!!!!",2,2); rt.write("\r\n"); char[] ch={'a','b','c','d','e'}; rt.write(ch); rt.write("\r\n"); rt.write(ch,2,3); //3.刷出 rt.flush(); } catch (ioexception e) { e.printstacktrace(); } finally{ //4.关闭 if(null!=rt){ try { rt.close(); } catch (ioexception e) { e.printstacktrace(); } } } }}
功能流
缓冲流: 增强功能,提高性能,加快读写效率
1)字节流:
bufferedinputstream 字节输入流缓冲流
bufferedoutputstream 字节输出流缓冲流
没有新增方法,可以发生多态使用
//导包import java.io.bufferedinputstream;import java.io.bufferedoutputstream;import java.io.fileinputstream;import java.io.filenotfoundexception;import java.io.fileoutputstream;import java.io.ioexception;import java.io.inputstream;import java.io.outputstream;public class bufferedinputstream01 { public static void main(string[] args) throws ioexception { //1.选择流 //bufferedinputstream(inputstream in) inputstream is=new bufferedinputstream(new fileinputstream("d:/hehe.txt")); outputstream os=new bufferedoutputstream(new fileoutputstream("e:/hengheng.txt") ); //2.读写 byte[] car=new byte[1024]; int len=-1; while((len=is.read(car))!=-1){ os.write(car,0,len); } //3.刷出 os.flush(); //4.关闭 os.close(); is.close(); }}
2)字符流:
bufferedreader 字符输入流缓冲流
新增方法: string readline() 读取一个文本行
bufferedwriter 字符输出流缓冲流
新增方法: void newline() 写入一个行分隔符
//导包import java.io.bufferedreader;import java.io.bufferedwriter;import java.io.filereader;import java.io.filewriter;import java.io.ioexception;public class bufferedreader02 { public static void main(string[] args) throws ioexception { //1.选择流 导包快捷键: ctrl+shift+o bufferedreader br=new bufferedreader(new filereader("d:/hehe.txt")); bufferedwriter bw=new bufferedwriter(new filewriter("d:/ccc.txt")); //2.读写 string msg=null; while((msg=br.readline())!=null){ bw.write(msg); bw.newline(); } //3.刷出 bw.flush(); //4.关闭 bw.close(); br.close(); }}
data流(字节节点流)
data流(字节节点流):
读写基本数据类型+string类型数据,是字节流功能流的一种
datainputstream 新增方法: readxxx()
dataoutputstream 新增方法: writexxx()
存在新增方法不能发生多态,先写出再写入
可能碰到的异常:eofexception 文件有,内容读入不到,必须读入的是写出的源文件
//导包import java.io.bufferedinputstream;import java.io.bufferedoutputstream;import java.io.datainputstream;import java.io.dataoutputstream;import java.io.fileinputstream;import java.io.filenotfoundexception;import java.io.fileoutputstream;import java.io.ioexception;public class data01 { public static void main(string[] args) throws ioexception { //调用方法 write("d:/data.txt"); read("d:/data1.txt"); } //读入 public static void read(string path) throws ioexception{ //1.输入流 数据类型+数据 datainputstream in=new datainputstream(new bufferedinputstream(new fileinputstream(path))); //2.读入 int i=in.readint(); boolean b=in.readboolean(); string s=in.readutf(); system.out.println(i+"-->"+b+"-->"+s); //3.关闭 in.close(); } //写出 public static void write(string path) throws ioexception{ //1.输出流 dataoutputstream out=new dataoutputstream(new bufferedoutputstream(new fileoutputstream(path))); //2.准备数据 int i=101; boolean f=false; string s="哈哈"; //3.写出 写出和读入的顺序要保持一致 out.writeint(i); out.writeboolean(f); out.writeutf(s); //4.刷出 out.flush(); //5.关闭 out.close(); }}
对象流
object 保存数据类型+数据
字节的功能流:当想要传输|读写对象类型数据的时候,可以使用一个对象流
序列化: 把对象类型的数据转化为可存储|可传输的状态的过程
objectinputstream() 反序列化输入流 新增方法: readobject()
objectoutputstream() 序列化输出流 新增方法: writeobject()
注意:
1)先序列化后反序列化
2)序列化反序列读写顺序一致
3)不是所有的类都能序列化 java.io.serializable 空接口
4)不是所有的属性都需要序列化 transient
5)static内容不会被序列化
6)如果父类实现serializable接口,子类中可以序列化所有内容
如果子类实现serializable接口,但是父类没有实现,子类只能序列化子类独有的内容
//导包import java.io.bufferedinputstream;import java.io.bufferedoutputstream;import java.io.fileinputstream;import java.io.fileoutputstream;import java.io.ioexception;import java.io.objectinputstream;import java.io.objectoutputstream;import java.io.serializable;import java.util.arrays;public class objectdemo02 { public static void main(string[] args) throws ioexception, classnotfoundexception { write("d:/object.txt"); read("d:/object.txt"); } //反序列化输入 public static void read(string path) throws ioexception, classnotfoundexception{ //1.输入流 objectinputstream is=new objectinputstream(new bufferedinputstream(new fileinputstream(path))); //2.读入 object p= is.readobject(); int[] arr= (int[]) is.readobject(); if(p instanceof person){ person person=(person)p; system.out.println(person.getname()); } system.out.println(p); system.out.println(arrays.tostring(arr)); //3,关闭 is.close(); } //序列化输出 public static void write(string path) throws ioexception{ //1.输出对象信息 objectoutputstream os=new objectoutputstream(new bufferedoutputstream(new fileoutputstream(path))); //2.准备数据 person p=new person("aaa",18); int[] arr={1,2,3,4}; //3.输出 os.writeobject(p); os.writeobject(arr); //4.刷出 os.flush(); //5.关闭 os.close(); }}//接口class person implements serializable{ private string name; private static int age; public person() { } public person(string name, int age) { super(); this.name = name; this.age = age; } public string getname() { return name; } public void setname(string name) { this.name = name; } public int getage() { return age; } public void setage(int age) { this.age = age; } @override public string tostring() { return "person [name=" + name + ", age=" + age + "]"; }}
二、file 类
file 类:文件和目录路径名的抽象表示形式
提供的功能:操作文件外部的能力,不能操作文件内部的内容
能够定义真实存在的路径|文件,不在的也可以定义,所以抽象表现形式
构造器: file(file parent, string child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 file 实例
file(string pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 file 实例
file(string parent, string child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 file 实例
本文来自java入门教程栏目,欢迎学习!
以上就是java中的io流如何分类的详细内容。