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的参数,因为上面的方式读取的话是按照次数度的(文件总长度/字节数组长度)因此如果不指定长度的话,最后一次可能会重复读入导致输出的结果不准确。因此切记一定要指定长度。