java IO流之-----字节流的操作

来源:互联网 发布:学人工智能10本必看书 编辑:程序博客网 时间:2024/06/06 02:18

 

                 java IO

IO流的概述                                

IO流:(输入输出流)

流是一组顺序的,有起点和终点的字节结合,是对数据传输的的总称和抽象。数据在设备之间的传输称为流。流的本质是数据传输,根据数据传输的特性将流抽象为各种类,方便直观的进行数据操作。

分类:

处理数据的类型:

字节流和字符流

流向的不同:输入流和输出流

 IO流的关系图:

 


OutPutStream 类(输出字节流):输出流接收输出字节并将这写字节发送到某个接收器

提供了如下方法:

close():关闭流、

void flush():刷新输出流并强制写出所有缓冲的输出字节

以及各种的write()。

实际操作需要其子类:

对文件的操作需要字节流。

字节输出流

文件操作代码如下:

public class demo1 {

//字节输出流的方式1每次输出一个字 节

public static void Write1 () {

try {

//创建一个文件字节输出流

OutputStream ow = new FileOutputStream("g:\\java.txt");

String info = "hello ,IO";

ow.write(3);// 向文件中输出

 byte [] bytes=info.getBytes();

 int j = bytes.length;

 for (int i = 0 ;i<j; i++) {

 ow.write(bytes[i]);

 }

 System.out.println("Done!!!!!!");

ow.close();//关闭流

catch (FileNotFoundException e) {

e.printStackTrace();

catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

Write1 ();

}

}

当然对于write也有其他方法,按照上面的一次输入一个字节的话效率会有点底,此是可以使用传入一个字节数组提高效率。

字节输入流:

此类表示所有字节输入流的超类

提供的方法:

read ():从输入流中读取下一个字节 (从子节输入流读取一个字节,如果没有输入可用,将阻塞),如果到达文件末尾则返回-1

read (byte[]):从输入流中读取一定量的字节,并将其存在缓冲区数组b中

FilleInputStream():从文件系统中的某个文件中获得输入字节,用于读取图像之类的原始字节流,要读取字符流应使用FileReader

读取如下:

public class demo2 {

public static void Reade() {

 try {

 // 构造字节输入流

InputStream in = new FileInputStream("g:\\java.txt");

int b= -1 ;

while ((b= in.read())!=-1) {

System.out.print((char)b);

}

in.close();

catch (FileNotFoundException e) {

e.printStackTrace();

catch (IOException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}

public static void main(String[] args) {

Reade();

}

}

当然一个字节一个字节读,的速度是最慢的因此一般不这么使用

使用如下方法(直接读入一个字节数组中)

根据文件大小创建数组长度,然后将数据读入创建好的数组,

代码如下:

 {

File f = new File ("g:\\java.txt");

 // 构造字节输入流

InputStream in = new FileInputStream(f);

byte [] bytes = new byte [ (int) f.length()];// 根据文件大小构造字节数组

 

     int  len= in.read(bytes);

    System.out.println(new String (bytes));

    System.out.println("length"+len);

in.close();

}

但此方法依然存在缺陷,存在内存溢出的风险(使用于读取小的文本文件)因此需要优化

这里不在指定字节数组长度为文件长度,而是根据文件的大小自己指定大小

如下:

 

 File f = new File ("g:\\java.txt");

 // 构造字节输入流

InputStream in = new FileInputStream(f);

byte [] bytes = new byte [20]; //这里测试指定较小的值实际中可以根据自己文件大小定义

int len = -1;

StringBuffer sb = new StringBuffer();

while ((len =in.read(bytes))!=-1) {

sb.append(new String (bytes,0,len));

}

in.close();

System.out.println(sb);

这样读取数据的“性能”是比较好的,但是应该注意的是

sb.append(new String (bytes,0,len));

在读取的时候一定要使用len的参数,因为上面的方式读取的话是按照次数度的(文件总长度/字节数组长度)因此如果不指定长度的话,最后一次可能会重复读入导致输出的结果不准确。因此切记一定要指定长度。

0 0
原创粉丝点击