1 流
1.1 流的概念:
Java io包通过数据流、序列化和文件系统为用户提供了一种完成I/O操作的输入/输出流;
流就是对输入输出的一个封装,用于屏蔽具体物理目标的差异性;
数据流是指所有的数据通信通道;
Java程序不能直接操纵输入输出设备,而是在程序和设备之间加入了一个中间介质,叫做流;
1.2 流的分类:
BIO同步阻塞:数据的读取必须阻塞在一个线程里等待其完成;
NIO同步非阻塞:一个线程不断的轮询每个输入输出的状态改变,如果有状态发生了改变,则进行下一步的操作;
AIO同步阻塞:无需一个线程去轮询IO操作的状态改变,在发生改变后,系统会通知对应的线程来处理。
按照流向分为输入(读数据)和输出流(写数据);
按照传输单位分为字节流和字符流(字节为8位,字符为16位,进行二进制操作)使用桥节流可以实现两个流的转换;
按功能分为节点流和过滤流:
节点流:负责数据源和程序之间建立连接,节点流对特定的地方读写,
过滤流:用于给节点增加功能,过滤流使用节点流进行输入/输出并增添附加功能;
1.针对对象进行功能扩展的最直接的方式是继承,最大的缺陷是耦合
2.具体采用的是装饰模式,装饰与被装饰类可以独立发展,不会相互耦合,缺点是多层装饰比较复杂。
I/O流是一种很宝贵的资源,使用完后必须调用close()方法关闭并释放资源,注意只关闭最外层的流。
2 File类
首先,java.io.File用于封装和平台无关的文件夹和文件夹对象。
2.1 常见的构造方法
File(String pathName)以path为路径创建File对象
File(String parent,String child)这里文件对象的路径为相对于parent路径的child路径;
2.2 需要记忆的方法
File ff = new File("路径");
System.out.println(ff.getAbsolutePath());//用于获取文件对象的绝对路径
//首先要判断该文件是否存在
System.out.println(ff.exists());
System.out.println(ff.isDirectory()); //用于判断当前文件对象是否为文件夹
System.out.println(ff.ifFile()); //判断当前文件是否为文件
System.out.println(ff..length()); //获取指定文件对象的字节数,单位为字节
ff.delete(); //删除文件或者文件夹,注意Java并不能保证删除一定成功
ff.mkdirs(); //创建多级文件夹,而使用mkdir只能创建一层文件夹
//实际编程中很少使用的方法
listFiles():File[] //获取当前文件夹里的所有子文件信息,子文件为File对象;
2.3 访问文件名的方法
- getName(): String获取文件名称;
- getPath(): String获取路径,如果构建File时使用的是相对路径,返回的即相对路径,绝对路径同理;
- getAbsolutePath: String获取绝对路径
- getParent(): String获取当前文件对象的上级File对象,如果构建文件对象是相对路径,返回为null;
2.4 文件检测相关方法
常用的:
- isFile(): boolean是否是文件;
- isDirectory(): boolean是否为文件夹
不常用:
- canWrite():boolean 是否可写
- canRead():boolean是否可读
- isAbsolute():boolean是否为绝对路径
- lastModied():long文件的后修改时间
3 字节流
在顶层有两个抽象类InputStream和OutputStream。
InputStream和OutputStream中定义了read()和write()方法,它们被派生流类重载;
3.1 基本输入输出
System类是一个非常强大的类,提供了标准的输入,输出及运行时的系统信息;
- System类不能创建对象,也就是说,System类的所有属性和方法都是静态的,引用时要以System作为前缀
- System.out:把输出送到缺省的显示(通常是显示器),是PrintStream的对象
- System.in:从标准输入获取输入(通常是键盘),是InputStream的对象
- System.err:把错误信息送到缺省的显示,是PrintStream的对象
- System.in与System.out是System类的两个静态属性
- 从键盘上读取一个字节的数据并返回读取的int类型内容0-255,如果输入中文则会出现乱码,因为一个中文由2个字节构成
4 字符流(用于操作文本文件)
Reader字符输入流
- read():int 0-65535 -1
- read(char[]):int -1
- close():void
- FileReader :用于操作文件,属于节点流,读取指定文件并在控制台上进行显示
Writer字符输出流
- write(int):void
- write(char[],int,int):void
- close()
FileWriter用于操作文件
- new FileWriter(String fileName)
- new FileWriter(String fileName,boolean append) 默认覆盖,boolean表示是否追加
5 节点流
具体类
- 针对文件操作:FileReader、FileWriter和FileInputStream、FileOutputStream
- 针对内存数组操作:CharArrayReader、 CharArrayWriter和ByteArrayInputStream、 ByteArrayOutputStream
- 针对内存字串操作:StringReader、 StringWriter,没有对应的字节流
- 管道流用于线程通信操作:PipedReader、 PipedWriter和PipedInputStream、 PipedOutputStream
文件节点流
- FileInputStream和FileOutputStream是文件字节流,是一种节点流
- FileOutputStream(“文件名称”) 如果文件不存在则新建文件,如果文件存在则覆盖文件内容
内存数组节点
如果是文本则使用char[],如果是二进制则使用byte[]
构造器方法
- CharArrayReader(char[] buf)其中char[]就是数据的来源,也就是说Reader就是从char[]中读取数据
- CharArrayRead(char[] buf,int offset,int length)
内存字串流
StringReader用于从一个字串String中读取数据,StringWriter用于给一个StringBuer中写入数据,实现一个可边 长的字串。
先到这吧!下一篇总结过滤流、桥节流、缓冲流、数据流、打印流和对象流噢!