莫度编程网

技术文章干货、编程学习教程与开发工具分享

java程序员必备的基础知识:Java IO编程_字节流和字符流

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()方法,所以可以由读者自己来决定是否使用此类操作。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言

    Powered By Z-BlogPHP 1.7.4

    蜀ICP备2024111239号-43