Java IO编程_字节流和字符流
使用 java.io.File 类虽然可以操作文件,但是却不能操作文件的内容。如果要进行文件内容的操作,就必须依靠流的概念来完成。流在实际中分为输入流与输出流两种。输入流与输出流是一种相对的概念,关键是要看参考点,以下图为例:水库的水源流向房屋,如果以房屋为参考点,那么这就属于输入流;如果以水库为参考点,这就属于输出流;同样以下雨向水库输水源一样,对水库而言就属于输入流。
在 Java 中针对数据流的操作也分为输入与输出两种方式,而且针对此操作提供了以下两类支持:
- 字节流(JDK 1.0开始提供):InputStream(输入字节流)、OutputStream(输出字节流);
- 字符流(JDK 1.1开始提供):Reader(输入字符流)、Writer(输出字符流)。
提示:流的基本操作形式。
在 java.io 包中提供的 4个操作流的类是其核心的组成部分,但是这些类本质上的操作流程区别不大。以文件读、写操作为例,其基本流程为以下四步。
第一步:通过 File 类定义一个要操作文件的路径;
第二步:通过字节流或字符流的子类对象为父类对象实例化;
第三步:进行数据的读(输入)、写(输出)操作;
第四步:数据流属于资源操作,资源操作必须关闭。
其中最为重要的是第四步,读者一定要记住,不管何种情况只要是资源操作(例如:网络、文件、数据库的操作都属于资源操作),必须要关闭连接(几乎每种类都会提供close()方法)。
在 java.IO包中,四个操作流的类(OutputStream、InputStream、Writer、Reader)全部都属于抽象类,所以在使用这些类时,一定要通过子类对象的向上转型来进行抽象类对象的实例化操作。在整个 IO流的操作中最麻烦的并不是这四个基础的父类,而是一系列子类。每种子类代表着不同的输入流、输出流位置。
字节输出流:OutputStream
字节流是在实际开发中使用较多的一种流操作,而java.io.OutputStream是一个专门实现字节输出流的操作类。0utputStream 类的常用方法如下图所示。
通过上图发现,在OutputStream类中提供了3个输出(write0)方法,这3个write0方法分别可以输出单个字节(使用int接收)、全部字节数组和部分字节数组。
提示:关于 OutputStream 类的组成说明。
OutputStream 是一个抽象类,而这个抽象类的定义如下
public abstract class OutputStream extends Object implements Closeable, Flushable在类定义中可以发现 OutputStream 类同时实现了 Closeable与 Flushable 两个父接口,而这两个父接口的定义组成如下。
//Closeable 接口:JDK 1.5之后才提供
public interface Closeable extends AutoCloseable {
public void close()throws lOException:
}//Flushable接口:JDK1.5之后才出现
public interface Flushable {
public void flush()throws IOException
}通过两个父接口提供的方法可以发现,close()与fush()方法都已经在utputStream类中明确定义过了,这是因为在JDK 1.0时并没有为 OutputStream 类设计继承的接口而从 JDK 1.5之后考虑到标准的做法,才增加了两个父接口,不过由于最初的使用习惯这两个接口很少被关注到。
到了 JDK 1.7版本之后,对于接口的定义又发生了改变,在Closeable 接口声明时继承了 AutoCloseable 父接口,这个接口就是JDK 1.7中新增的接口,此接口定义如下。
public interface AutoCloseable {
public void close() throws Exception
}通过定义可以发现,在 AutoCloseable 接口中也定义了一个 close()方法,那么为什么在 JDK 1.7中又需要提供这样的 AutoCloseable(自动关闭)接口呢?原因是JDK 1.7中
针对异常处理产生了新的支持。
在以往的开发中,如果是资源操作,用户必须手工关闭资源(方法名称几乎都是close()),但是实际上会有许多开发者忘记关闭资源,就经常导致其他线程无法打开资源进行操作,所以Java提供了以下一种新的异常处理格式。
try(AutoCloseable接口子类对象=new AutoCloseable 接囗子类名称(){
调用方法(有可能会出现异常);
}catch(异常类型对象)(
异常处理:
}...[finally {异常处理的统一出口;}]只要使用此种格式,在操作完成后用户就没有必要再去调用close()方法了,系统会自动帮助用户调用 close()方法以释放资源。
class Net implements AutoCloseable {
@Override
public void close() throws Exception {
System.outprintln("***网络资源自动关闭,释放资源。");
}
public void info() throws Exception { //假设有异常抛出
System.out.println("***欢迎访问:www.yootk.com");
}
}
public class TestDemo {
public static void main(Stringl args){
try(Net n = new NetO){
n.info0 ;
}catch(Exception e){
e.printStackTrace0:
}
}
}
程序执行结果: **欢访间:www.yootk.com
***网络资源自动关闭,释放资源。(自动执行的close0操作)本程序按照 AutoCloseable 的使用原则使用异常处理格式,可以发现程序中并没有明确调用 close()方法的语句,但是在整个资源操作完成后会自动调用 close()释放资源。虽然 Java 本身提供了这种自动关闭操作的支持,不过从开发习惯上讲,仍有不少开发者还是愿意手工调用 close()方法,所以可以由读者自己来决定是否使用此类操作。