java 输出视频流_java之九 基本输入输出流

流的概念

Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流通过Java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不同。 Java中流的实现是在java.io包定义的类层次结构内部的。

注意:如果你熟悉C/C++,你已经对流的概念很熟悉了。JAVA中流的实现跟C/C++中有些相似。字节流和字符流

Java 2 定义了两种类型的流:字节类和字符类。字节流(byte stream)为处理字节的输入和输出提供了方便的方法。例如使用字节流读取或书写二进制数据。字符流(character stream)为字符的输入和输出处理提供了方便。它们采用了统一的编码标准,因而可以国际化。当然,在某些场合,字符流比字节流更有效。

Java的原始版本(Java 1.0)不包括字符流,因此所有的输入和输出都是以字节为单位的。Java 1.1中加入了字符流,某些字节形式的类和方法不受欢迎。这也是为什么没用字符流的老代码在适当的地方需要更新的原因。

需要声明:在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。下面是对字节流和字符流的概述。

字节流类

字节流由两个类层次结构定义。在顶层有两个抽象类:InputStream 和 OutputStream。

每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络连接,甚至是内存缓冲区。字节流类显示于表9-1中。本章的后面将讨论一些这样的类。其他的类的描述在第2部分。记住,要使用流类,必须导入Java.io包。

表 9-1  字节流类

抽象类InputStream和 OutputStream定义了实现其他流类的关键方法。 最重要的两种方法是read()和write(),它们分别对数据的字节进行读写。两种方法都在InputStream  和OutputStream中被定义为抽象方法。它们被派生的流类重载。

字符流类

字符流类由两个类层次结构定义。顶层有两个抽象类:Reader和Writer。这些抽象类处理统一编码的字符流。Java中这些类含有多个具体的子类。字符流类如表9-2所示。

表 9-2  字符流的输入/输出类

抽象类Reader和Writer定义了几个实现其他流类的关键方法。 其中两个最重要的是read()和write(),它们分别进行字符数据的读和写。这些方法被派生流类重载。预定义流

所有的Java程序自动导入java.lang包。该包定义了一个名为System的类,该类封装了运行时环境的多个方面。例如,使用它的某些方法,你能获得当前时间和与系统有关的不同属性。System 同时包含三个预定义的流变量,in,out和err。这些成员在System中是被定义成public 和static型的,这意味着它们可以不引用特定的System对象而被用于程序的其他部分。

System.out是标准的输出流。默认情况下,它是一个控制台。System.in是标准输入,默认情况下,它指的是键盘。System.err指的是标准错误流,它默认是控制台。然而,这些流可以重定向到任何兼容的输入/输出设备。

System.in 是inputStream的对象;System.out和System.err是PrintStream的对象。它们都是字节流,尽管它们用来读写外设的字符。如果愿意,你可以用基于字符的流来包装它们。

前面的章节在例题中已经用到过System.out。你可以以同样的方式使用System.err。下面对此进行解释,你会看到使用System.in有一点复杂。读取控制台输入

在Java 1.0中,完成控制台输入的惟一途径是字节流,使用该方法的老代码依然存在。今天,运用字节流读取控制台输入在技术上仍是可行的,但这样做需要用到不被赞成的方法,这种做法不值得推荐。Java 2中读取控制台输入的首选方法是字符流,它使程序容易符合国际标准并且易于维护。

注意: Java没有像标准C的函数scanf()或C++输入操作符那样的统一的控制台输入方法。

Java中,控制台输入由从System.in读取数据来完成。为获得属于控制台的字符流,在BufferedReader对象中包装System.in。BufferedReader 支持缓冲输入流。它最常见的构造函数如下:

BufferedReader(Reader inputReader)

这里,inputReader是链接被创建的BufferedReader实例的流。Reader是一个抽象类。它的一个具体的子类是InputStreamReader,该子类把字节转换成字符。为获得链接System.in的一个InputStreamReader的对象,用下面的构造函数:

InputStreamReader(InputStreaminputStream) 因为System .in引用了InputStream 类型的对象,它可以用于inputStream。综上所述,下面的一行代码创建了与键盘相连的BufferedReader对象。

BufferedReader br = newBufferedReader(new

InputStreamReader(System.in));

当该语句执行后,br是通过System.in生成的链接控制台的字符流。读取字符

从BufferedReader读取字符,用read()。我们所用的read()版本如下:

int read( ) throws IOException

该方法每次执行都从输入流读取一个字符然后以整型返回。当遇到流的末尾时它返回-1。你可以看到,它要引发一个IOException异常。

下面的例子程序演示了read()方法,从控制台读取字符直到用户键入“q”:

// Use a BufferedReader to readcharacters from the console.

import java.io.*;

class BRRead {

public static void main(String args[])

throws IOException

{

char c;

BufferedReader br = new

BufferedReader(newInputStreamReader(System.in));

System.out.println("Enter characters,'q' to quit.");

// read characters

do {

c = (char) br.read();

System.out.println(c);

} while(c != 'q');

}

}

下面是程序运行:

Enter characters, 'q' to quit.

123abcq

1

2

3

a

b

c

q

程序的输出看起来与预想的略有不同,因为System.in在默认情况下是以行来缓冲的。

这意味着在你键入ENTER以前实际上是没有输入的。你能猜想,这不能充分体现交互式控制台输入条件下read()的独特价值。读取字符串

从键盘读取字符串,使用readLine()。它是BufferedReader  类的成员。它的通常形式如下:

String readLine( ) throwsIOException

它返回一个String对象。

下面的例子阐述了BufferedReader类和readLine()方法; 程序读取和显示文本的行直到键入“stop”:

// Read a string from consoleusing a BufferedReader.

import java.io.*;

class BRReadLines {

public static void main(String args[])

throwsIOException

{

// create a BufferedReader using System.in

BufferedReader br = new BufferedReader(new

InputStreamReader(System.in));

String str;

System.out.println("Enter lines oftext.");

System.out.println("Enter 'stop' toquit.");

do {

str = br.readLine();

System.out.println(str);

} while(!str.equals("stop"));

}

}

下面的例题生成了一个小文本编辑器。它创建了一个String对象的数组,然后依行读取文本,把文本每一行存入数组。它将读取到100行或直到你按“stop”才停止。该例运用一个BufferedReader类来从控制台读取数据。

// Atiny editor.

importjava.io.*;

classTinyEdit {

public static void main(String args[])

throws IOException

{

// create a BufferedReader using System.in

BufferedReader br = new BufferedReader(new

InputStreamReader(System.in))

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值