IO体系结构和基础应用总结

IO体系结构和基础应用
流的概念和分类
输入输出流都是在java.io包中的。流分为输入流和输出流,输入流:InputStream 输出流:OutputStream 。当程序要读取文件的时候,就要用到输入流,文件的字节就一个字节一个字节的输入到程序当中。而程序要保存或者输出时,就用到输出流,把字节送到相应的地址上。流可形象的比喻成水管,把一个个字节(水)送到目的地。

流的分类:
1. 基础字节流:InputStream 和OutputStream 是java中可以按最小数据单位读取的流,每次都写一个字节,基础流是直接连接到输入源的流。
2. 过滤流(节点流):过滤流是用来包装基础流以提供更好的特性,如提供缓冲功能的BufferedInputStream和BufferedOutputStream;过滤流是用来包装基础流或其他流,他并不直接连接到数据源。
3. 基于具体数据类型的流:如果要从流中读取指定的数据类型的数据,如int,long型的数值,则要使用DataInput/DataOutput接口的子类如DataInputStream和DataOutputStream;
4. 基于对象读写:jdk提供了一种强大的功能流,及对象的输入输出流,即ObjectInput/ObjectOutput接口的子类,如我们使用ObjectOutputStream将一个Java对象写入到文件中;对象流的读取就是常说的java对象序列化技术。


InputStream(输入流):
InputStream是抽象类,所以要使用输入流,得使用它的子类。(FileInputStream,ObjectInputStream,PipedInputStream。。。。。。。)
FileInputStream:文件输入流
主要有两个构造器:
FileInputStream(File file):通过文件对象做参数构造输入流对象
FileInputStream(String name):通过文件路径名连接到指定文件的输入流
主要方法:
Void close():关闭输入流,
Int available():流中可读取的字节的有效长度。
Int read():这个方法会调用下一个字节作为一个byte值,进行文件的读入操作。虽然返回的是int型,但是计算机读取的是一个byte。
Int read(byte[] b):从流中读取的byte
文件读入操作有两种做法,一种是一次性读取一个byte数组,另一种是一个byte一个byte来读取。
1. InputStream is = new FileInputStream(fileName);
//创建一个数组。
Byte[] b = new byte[is.available()];
//将读取的字节读到数组去
Is.read(b);
String s = new String(b);
Return s;
2. 2. InputStream is = new FileInputStream(fileName);
//创建一个数组。
Byte[] b = new byte[is.available()];
//count用来计数下标
Int count = 0;
//读取每一个字节,如果返回-1则表示读完了
While((i=is.read()!=-1){
B[count] = (byte)I;
Count++;
}
String s = new String(b);
Return s;

OutputStream(输出流):
FileOutputStream文件输出流是OutputStream的子类,有如下构造器
FileOutputStream(File file):构造输出到指定文件
FileOutputStream(String path):输出到指定的文件地址
主要方法:
Void close():关闭输出流
Void write(byte[] b):将数组中的内容输出
Void flush():将输出流可能还保留在jvm内存中的数据强制输出到目标中


缓冲流:
缓冲流的作用:当执行文件输入输出流的时候,程序会将一个字节先从程序中读入到vm内存,再到系统内存,再到源文件上,然后将此字节原路返回。读入的时候就将这个字节从程序中送到vm内存,再到系统内存,再到目标文件。如此一来,文件一大的话,输入输出的时间就会很长。而缓冲流是将读取的文件字节先保存在缓冲区中,等到缓冲区满了,在一次性输出到目标文件,这样的话就可以大大的节省了时间。

BufferedInputStream是InputStream的子类,有如下构造器
BufferedInputStream(InputStream is):使用一个InputStream类型的输入流对象创建一个默认缓冲区大小的缓冲输入对象,默认缓冲区大小在jdk1.6是8192k。
BufferedInputStream(InputStream is,int size):自定义大小的缓冲区域

BufferedOutputStream是OutputStream的子类,构造器
BufferedOutputStream(OutputStream os):
BufferedOutputStream(OutputStream os,int size):制定缓冲大小的输出流

画图板保存文件:
思路:实例化一个机器人,来截取整个画板,在此图片中一个像素一个像素点取颜色值,然后保存到一个数组中去,保存到指定路径,然后用我们写的程序打开,在重绘的时候遍历该数组,获取颜色,并画出来

重绘方法
//重绘二维数组,读取的是二维数组里面的int值(颜色),然后用画直线的方法把每一个点给画出来!!
if(array!=null){
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
g.setColor(new Color(array[i][j]));
g.drawLine(i, j, i, j);
}
}
}
截屏类
public class ScreenCapture {

public int[][] createScreenCapture(JPanel dp) throws AWTException{
//获取到画图面板的宽和高
int width = dp.getWidth();
int height = dp.getHeight();
System.out.println("宽:"+width+" 高:"+height);

//获取画图面板相对于屏幕上的坐标值
Point point = dp.getLocationOnScreen();
System.out.println("X="+point.getX()+" Y="+point.getY());

//实例化一个矩形对象
Rectangle rect = new Rectangle((int)point.getX(),(int)point.getY(),width,height);

//实例化一个机器人类的对象
Robot robot = new Robot();

//开始截取屏幕上的图片了
BufferedImage image = robot.createScreenCapture(rect);

//实例化一个二维数组兑现个,用来存储图片每一个像素点的值
int [][] array = new int[width][height];

//遍历图片,将每一个像素点的颜色取出,存入到数组中
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
//取出颜色,存入到数组中
array[i][j] = image.getRGB(i,j);
}
}

return array;
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值