在实现这个功能之前,先要了解一下数据流的基础概念,基本字节数据流类和数据流中提供的主要数据操作方法
1 数据流的基本概念
几乎所有的程序都离不开信息的输入和输出,比如从键盘读取数据、从文件中获取或者向文件存入数据、在显示器上显示数据。这些情况下都会涉及有关输入/输出的处理。在Java中,把这些不同类型的输入、输出源抽象为流(Stream),其中输入或输出的数据称为数据流(DataStream)。用统一的接口来表示。
数据流是指一组有顺序的、有起点和终点的字节集合。程序从键盘接收数据或向文件中写数据,都可以使用数据流来完成。流被组织成不同的层次。
比如说中文在编码表中默认占2个字节。而为了按照文字的单位来处理,所以出现了字符流。
字节流:一次读入或读出是8位二进制。
字符流:一次读入或读出是16位二进制。
数据流分为输入数据流和输出数据流。输入数据流只能读不能写,而输出数据流只能写不能读。从数据流中读取数据时,必须有一个数据源与该数据流相连。
2 基本字节数据流类
文件数据流
InputStream和OutputStream两个类都是抽象类。抽象类是不能进行实例化的,因此,在实际应用中经常用到的并不是这两个类,而是一系列基本数据流类。它们都是InputStream和OutputStream的子类,在实现其父类方法的同时又都定义了其特有的功能。
文件数据流包括FilelnputStream和FileOutputStream,这两个类用来进行文件的I/O处理,其数据源或数据终点都应当是文件。
3 数据流中提供的主要数据操作方法
输入数据流中提供的主要数据操作方法如下。
•int read( ):从输入流中读取一个字节的二进制数据。
•int read(byte[ ]b):将多个字节读到数组中,填满整个数组。
•int read(byte[ ]b,int off,int len):从输入流中读取长度为len的数据,从数组b中下标为off的位置开始放置读入的数据,读毕返回读取的字节数。
这3个方法提供了访问数据流中数据的方法,所读取的数据都默认为字节类型。第一个read( )方法将读取的一个字节作为低位,形成一个0~255的int类型的数值返回。它是一个抽象方法,需要在子类中具体实现。
以上3个方法中,当输入流读取结束时,会得到-1,以标志数据流的结束。在实际应用中,为提高效率,读取数据时经常以系统允许的最大数据块长度为单位读取。也就是说要与一个后面即将讨论的BufferedlnputStream相连。
•void close( ):关闭数据流。当结束对一个数据流的操作时应该将其关闭,同时释放与该数据流相关的资源,因为Java提供系统级的垃圾自动回收功能,所以当一个流对象不再使用时,系统可以自动关闭。但是,为提高程序的安全性和可读性,建议显式关闭输入/输出流。
•int available( ):返回目前可以从数据流中读取的字节数(但实际的读操作所读得的字节数可能大于该返回值)。
•long skip(long l):跳过数据流中指定数量的字节不读取,返回值表示实际跳过的字节数。
对数据流中字节的读取通常是按从头到尾顺序进行的,如果需要以反方向读取,则需要使用回推(Push Back)操作。在支持回推操作的数据流中经常用到如下几个方法。
•boolean markSupported( ):用于测试数据流是否支持回推操作,当一个数据流支持mark( )和reset( )方法时返回true,否则返回false。
•void mark(intmarkarea):用于标记数据流的当前位置,并划出一个缓冲区,其大小至少为指定参数的大小。
•void reset( ):将输入流重新定位到对此流最后调用mark方法时的位置。
输出数据流是指只能写不能读的流,用于从计算机中输出数据。与输入流类似,java.io包中所有输出数据流大多是从抽象类OutputStream继承而来的,并且实现了其中的所有方法,这些方法主要提供了关于数据输出方面的支持。输出数据流中提供的主要数据操作方法如下。
•void write(int i):将字节i写入到数据流中,它只输出所读入参数的最低8位。该方法是抽象方法,需要在其输出流子类中加以实现,然后才能使用。
•void write(byte b[ ]):将数组b[ ]中的全部b.length个字节写入数据流。
•void write(byte b[ ],int off,int len):将数组b[ ]中从下标off开始的len个字节写入数据流。元素b[off]是此操作写入的第一个字节,b[0ff+len-1]是此操作写入的最后一个字节。以上这些方法用于向输出数据流中写数据。在实际应用中,和操作输入数据流一样,通常以系统允许的最大数据块长度为单位进行写操作。
•void close( ):当结束对输出数据流的操作时应该将其关闭。
•void flush( ):刷新此输出流并强制写出所有缓冲的输出字节。
4 代码实现
再了解完以上概念,实现这个功能就非常简单,直接使用FileInputStream读取文件,然后在新建一个字节数组存放数据即可,具体代码如下
public class MainRun {
public static String PathName="G:\\JavaData\\1.txt";
public static void main(String args[])
{
ReadTxt1();
}
public static Boolean ReadTxt1()
{
try {
InputStream is=new FileInputStream(PathName);
byte[]b=new byte[is.available()];
is.read(b);
System.out.println(Arrays.toString(b));
System.out.println(new String(b));
is.close();
return true;
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
return false;
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
return false;
}
}
}