java输入输出流(画板五子棋保存)
??File可以创建和删除文件,但是可不可以读取或者写入文件呢?那肯定是不可以的,因为File类里并没有定义读取或写入的方法,
?如果想实现的话,那么就要用到java的输入输出流了。
??文件可以分为以下两种:
?1.文件:就是指的文本文件,扩展名为 .txt? .java的都是文本文件,读取和写入有Writer和Reader方法,存储字节为16位,即一次读取或写入两个字节
?2.流文件:像图片、音乐、视频、office都是流文件,读取和写入就要用InputStream和OutputStream了,它一次读取或写入一个字节的
?
?流:
??我刚学的时候也在想为什么叫流呢?其实流是java中输入和输出的抽象,也就是很形象的体现了java中的输入输出机制,? 输入流就是我们在程序中的某个地方(文件、网络)读取数据时用的,输出流就是我们将读取的数据发送到某个地方(文件、网络、控制台)时使用的。
??就像C++中的输入输出一样,cin和cout是C++输入输出流的对象,
??cin缺省对应的是键盘,cin>> 接收从键盘输入的数据
??cout缺省对应的是屏幕,cout<< 是数据输出到屏幕上
?
??流的分类:
???根据基本方法分类:
????输入流:*IputStream? java.io.InputStream是所有输入流的父类
????输出流:*OutputStream java.io.OutputStream是所有输出流的父类
???根据性质可以分为:
???基础字节流:FileInputStream,FileOutputStream??是按字节读取的
???过滤流(缓冲流):BufferedInputStream,BufferedOutputStream?将读取的文件暂时放到JVM缓冲区后,到一定程度后会一次读出或写入,效率较高
???基于具体数据类型的流:DataInputStream和DataOutputStream??? 可以读取基本类型的数据
???基于对象的读写:ObjectInputStream和ObjectOutputStream??? 可以对对象进行保存
??
?输入输出的常用方法:
?InputStream:
? ?int available() 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
???void close() 关闭此输入流并释放与该流关联的所有系统资源。
???void mark(int readlimit)?? 在此输入流中标记当前的位置。
???boolean markSupported() 测试此输入流是否支持 mark 和 reset 方法。
?? abstract? int read()? 从输入流中读取数据的下一个字节。
???int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
???int read(byte[] b, int off, int len)?? 将输入流中最多 len 个数据字节读入 byte 数组。
??
?OutputStream:
?? void close() 关闭此输出流并释放与此流有关的所有系统资源。
???void flush() 刷新此输出流并强制写出所有缓冲的输出字节。
???void write(byte[] b)? 将 b.length 个字节从指定的 byte 数组写入此输出流。
?? void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
?? abstract? void write(int b)? 将指定的字节写入此输出流。
??flush()方法要特别注意了,最好每次一涉及到输入输出就调用这个方法,例如在利用BufferedOutputStream时若没调用这个方法,
??就会输不出我们想要的东西
??close() 每次调用完输入输出流后记得关闭文件,如果不关,就像水龙头一样用完不关会出问题的,它会占用系统资源
??
??还有其他一些方法,就不一一列出了,API文档上都有,如果有什么不懂,可以随时查询
??
??之前做了一些简单的画板和五子棋,学习了输入输出流之后就像是不是可以实现基本的保存呢,画板的话就是保存上次画的内容,
??五子棋就保存上次棋局,这个就用到了自定义文件格式了:
???我们自己定义一个文件读写的方法,去读取并输出数据
???我已经实现了画板和五子棋的保存,下面有源码,大家有什么问题和建议可以给我留言
??
??画板的保存
/** * 定义一个重绘棋子的方法 */public void drawChess(java.awt.Graphics g) {// 判断cl对象是否为空,防止出现空指针异常if (null != cl) {// 得到数组对象int[][] ch = cl.getChess();// 循环数组中的每一个元素对象for (int i = 0; i < ch.length; i++) {for (int j = 0; j < ch[i].length; j++) {// 得到 数组中的元素对象if (ch[i][j] == 2) {// 贴棋子的图片java.net.URL url = this.getClass().getResource("b.png");// 根据url路径对象创建一个图片对象javax.swing.ImageIcon imageW = new javax.swing.ImageIcon(url);// 设置图片显示的坐标以及宽度和高度g.drawImage(imageW.getImage(),(Config.X + j * Config.SIZE) - Config.CHESS/ 2, (Config.Y + i * Config.SIZE)- Config.CHESS / 2, Config.CHESS, Config.CHESS,observer);} else if (ch[i][j] == 1) {// 贴棋子的图片java.net.URL url = this.getClass().getResource("w.png");// 根据url路径对象创建一个图片对象javax.swing.ImageIcon imageW = new javax.swing.ImageIcon(url);// 设置图片显示的坐标以及宽度和高度g.drawImage(imageW.getImage(),(Config.X + j * Config.SIZE) - Config.CHESS/ 2, (Config.Y + i * Config.SIZE)- Config.CHESS / 2, Config.CHESS, Config.CHESS,observer);}}}}if(ch != null){System.out.println("会不出来");int[][] ch = dio.getChess(); for(int i = 0; i <ch.length;i++){for(int j = 0; j < ch[i].length;j++){if(ch[i][j] == 1){// 贴棋子的图片java.net.URL url = this.getClass().getResource("w.png");// 根据url路径对象创建一个图片对象javax.swing.ImageIcon imageW = new javax.swing.ImageIcon(url);// 设置图片显示的坐标以及宽度和高度g.drawImage(imageW.getImage(),(Config.X + j * Config.SIZE) - Config.CHESS/ 2, (Config.Y + i * Config.SIZE)- Config.CHESS / 2, Config.CHESS, Config.CHESS,observer);}if(ch[i][j]==2){// 贴棋子的图片java.net.URL url = this.getClass().getResource("b.png");// 根据url路径对象创建一个图片对象javax.swing.ImageIcon imageW = new javax.swing.ImageIcon(url);// 设置图片显示的坐标以及宽度和高度g.drawImage(imageW.getImage(),(Config.X + j * Config.SIZE) - Config.CHESS/ 2, (Config.Y + i * Config.SIZE)- Config.CHESS / 2, Config.CHESS, Config.CHESS,observer);}}}}}