Java第九次作业

Java第八次作业

(一)学习总结

1.用思维导图对javaIO操作的学习内容进行总结

2.下面的程序实现了文件的拷贝,但采用的是一个字节一个字节的读写方式,效率很低。使用缓冲区可以减少对文件的操作次数,从而提高读写数据的效率。IO包中提供了两个带缓冲的字节流BufferedInputStream和BufferedOutputStream,查阅JDK帮助文档,修改程序,利用这两个类完成文件拷贝,对比执行效率。

import java.io.*;
public class Test{
    public static void main(String args[]) {
        FileInputStream in=null;
        FileOutputStream out=null;
        File fSource=new File("d:"+File.separator+"my.jpg");
        File fDest=new File("d:"+File.separator+"java"+File.separator+"my.jpg");
        if(!fSource.exists()){ 
            System.out.println("源文件不存在");   
            System.exit(1);   
        }
        if(!fDest.getParentFile().exists()){   
            fDest.getParentFile().mkdirs();     
        }
        try {   
            in=new FileInputStream(fSource);
            out=new FileOutputStream(fDest);
            int len=0;
            long begintime = System.currentTimeMillis();
            while((len=in.read())!=-1){
                out.write(len);          
            } 
            long endtime = System.currentTimeMillis();
            System.out.println("文件拷贝完成,耗时"
                            +(endtime-begintime)+"毫秒");
        }catch(Exception e){
            System.out.println("文件操作失败");  
        }finally{       
            try {   
                in.close();   
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }      
        }     
    }
}

FileInputStream和FileOutputStream文件拷贝的时间:

使用 BufferedInputStream和 BufferedOutputStream修改:

                    in=new FileInputStream(fSource);
	            out=new FileOutputStream(fDest);
	            byte[] b = new byte[1];
	            rin= new BufferedInputStream(in);
	            rout= new BufferedOutputStream(out);
	            int len=0;
	            long begintime = System.currentTimeMillis();
	            while((len=rin.read(b))!=-1){
	                rout.write(len);          
	            } 

拷贝的时间:

BufferedInputStream的数据成员b是一个位数组,默认为2048字节。当读取数据来源时,BufferedInputStream会尽量将b填满。当使用read()方法时,实际上是先读取buf中的数据,而不是直接对数据来源作读取。当b中的数据不足时,BufferedInputStream才会再实现给定的InputStream对象的read()方法,从指定的装置中提取数据。

BufferedOutputStream的数据成员b也是一个位数组,默认为512字节。当使用write()方法写入数据时实际上会先将数据写到b中,当buf已满时才会实现给定的OutputStream对象的write()方法,将buf数据写到目的地,而不是每次都对目的地作写入的动作。
3、其他总结
对文件的操作。

(二)实验总结

  • 程序设计思路:

(1)定义三个基本信息类,一个宠物信息Petmessage类,有宠物的编号、姓名、种类、年龄、价格、数量属性和get、set方法。另一个是登录用户信息User类,有用户名和登录密码属性和检验登录信息是否正确的一个方法;还有一个是出售宠物信息类,有宠物的编号、姓名、种类、年龄、价格、购买数量。
(2)定义一个管理员访问信息Administrator类,当访问宠物商店时展示商店里有那些宠物,并且定义按编号查询、添加宠物和删除宠物的方法,方便管理员管理商店时调用。
(3)定义一个管理员管理宠物AdministratorSever类,定义方法展示所有的宠物,定义按编号查询,输入宠物的编号,显示宠物的所有信息,定义添加方法添加宠物,添加宠物时,输入宠物信息,迭代取出宠物商店原有的宠物编号和新添加的宠物编号比较一样添加失败,不一样,调用Administrator 的添加方法添加新的宠物,并且刷新宠物商店展示所欲有的宠物,定义删除方法,输入要删除宠物的编号,宠物商店里没有宠物的编号,删除失败,如果宠物商店里有输入的编号。则调用Administrator的删除方法删除,定义修改方法,输入要修改的编号,宠物商店中有这个编号,先调用删除方法,在调用添加方法,没有这个编号则不能修改。
(4)定义一个JDBCUtils的类,类中有连接Java和SQL的方法和关闭连接对象的方法。信息有SQL存储,如果要访问信息需要把数据库和Java连接。
(5)在视图中定义三个类:一个是进入系统的界面,一个是登录界面,另一个是宠物展示的界面。在进入系统的界面点击进入系统,会跳转到登录界面;在登录界面的类中,声明登录、密码等按钮、标签和输入信息的文本域。使用监听接口的监听按钮的单击事件判断是否是触发源,输入相应的用户名和密码比较是一样的进入宠物展示界面,错误提示相应的错误信息。在宠物展示的界面中。同时设置向里面添加文本域、标签和按钮并且使用绝对定位确定位置。在宠物展示的类中添加宠物信息和添加、修改、删和购买的按钮,并且提供添加、修改、删除和购买的监听器;确定按钮、文本等绝对位置。
(6)定义两个Tool类,一个是确定视图中登录界面和展示界面的窗口位置,另一个是把购买的宠物信息以表格的形式保存到本地。

  • 问题1:数据中存储了3个宠物信息,然而只能查询出1个宠物的信息,也添加不进去其他的宠物
  • 原因:当查询出一个宠物信息的时候就返回了集合,就只有一个宠物了,添加不进去宠物是因为使用宠物的属性时出错。
  • 解决方案:
while(rs.next())
				{
					PetMessage thisPet = new PetMessage();
					thisPet.setNo(rs.getString("no"));
					thisPet.setName(rs.getString("name"));
					thisPet.setKind(rs.getString("kind"));
					thisPet.setAge(rs.getInt("age"));
					thisPet.setNumber(rs.getInt("number"));
					thisPet.setPrice(rs.getDouble("price"));
					list.add(thisPet);	
				}
				return list;
			}

返回值已改在while循环的外面。

  • 问题2:保存到本地的文件要以当时的时间为文件名保存。
  • 取当前时间的代码:
Date date = new Date();
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
		String name = "销售记录" + format.format(date)+ ".csv";
  • 类图:
  • 文件拷贝
  • 程序设计思路:在程序中根据提示输入要复制的文件位置和要复制到的文件位置;如果输入文件的位置不正确,提示错误。
  • 问题:文件复制的时间长
  • 解决方案:使用BufferedInputStream和BufferedOutputStream;缩短时间。

(三)代码托管

https://git.oschina.net/hebau_cs15/Java-CS01yxr.git

(四)学习进度条

代码行数(新增/累积) 学习时间(新增/累积) 本周学习内容
目标 5000行 300小时
第2-4周 150/300 30/30 学习了....
第5周 220/300 30/50 学习了关于double类型存在精度问题,取指定位置和截取字符串;数组的应用
第6周 550/600 60/80
第8周 700/800 60/80 面向对象的继承和多态
第9周 800/800 80/100 工厂设计和Java常用的类
第10周 800/800 80/100 异常处理和集合类
第11周 1000/1000 90/100 图形界面管理
第12周 1100/1100 100/100 JBDC
第12周 1000/1100 80/80 JavaIo
原文地址:https://www.cnblogs.com/errui/p/6884818.html