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();
}
}
}
}
- 运行结果:文件拷贝完成,耗时2250毫秒
- 相关内容:
- BufferedInputStream是套在InputStream外,起着缓存的功能,用来改善里面那个InputStream的性能,它自己不能脱离里面那个单独存在。
- FileInputStream是读取一个文件来作InputStream。
- 所以可以把BufferedInputStream套在FileInputStream外,来改善FileInputStream的性能。
- FileOutputStream的改善雷同。
- 修改后:
import java.io.*;
public class Test {
public static void main(String args[]) {
BufferedInputStream in = null;
BufferedOutputStream 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 BufferedInputStream(new FileInputStream("d:"+ File.separator + "my.jpg"));
out = new BufferedOutputStream(new FileOutputStream("d:"+ File.separator + "java" + File.separator+ "my.jpg"));
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();
}
}
}
}
- 修改后运行结果:文件拷贝完成,耗时9毫秒(明显的看到修改后的拷贝速度加快)
3.其他需要总结的内容。
- 在数据库中
- 问题:在数据库中若在数据库原有的model库中创建了表的话,之后每建立一个新的数据库都会存放它所建的表。
- 原因:model库是模板数据库,新建数据库时默认情况下都copy了model库的内容。
二、实验总结:
1.实验内容:
1.宠物商店:在实验八的基础上,增加一个功能,用文件保存每日的交易信息记录。
- 程序设计思路:(在实验八程序设计思路之上进行修改如下:)
- 在工具包里面新建文件处理类。
- 此类中先定义静态常量分隔符,再将购买的宠物做参数。
- 判断文件是否存在并调用不同参数的creataFile方法实现保存宠物信息。
- 最后将createFile方法实现,若文件存在就将此文件作为输出流的目的地,若不存在就创建此名字的文件并创建表头;再将购买的宠物信息从pet对象中得到信息存入表中;最后关闭输出流。
- 在购买服务中。
- 在用户购买宠物后用对象调用文件处理类的方法将数据保存到表格中
- 问题1:在将销售记录存到excel中时,表头出现乱码。
- 原因:不应该建立excel后不建立表头,在程序中一种是没有此表,建立此表和表头;另一种是有此表直接存放数据,不建表头。
- 解决方案:经过多次实验,将自己建的文件删去可以得到销售记录。或者建立一个带表头的excel表。
- 宠物商店首页窗口:
- 管理员管理窗口:
- 用户注册窗口:
- 用户登录窗口:
- 用户购买窗口:
- excel保存截图:
2.完成文件复制操作,在程序运行后,提示输入源文件路径和目标文件路径。
- 程序设计思路:
- 在main方法中,让用户输入源文件路径和文件路径(这两个路径作为file的构造方法的参数新建两个File类对象);
- 然后判断源文件是否存在若不存在结束程序;若存在然而目标文件不存在,就创建输入源文件目录;
- 再设置输入流的源文件和输出流的目标文件,记录开始时间,复制文件,记录结束时间,输出时间差。
- 最终不管怎样都执行关闭输入、输出流。
- 问题1:没有实现让用户输入源文件和目标文件,只是在最后将源文件和目标文件输出。
- 原因:没读懂题意
- 解决方案:通过同学提议,意识到这一点,将本来设置好的源文件和目标文件改成让用户输入的。部分代码如下:
Scanner input=new Scanner(System.in);
System.out.println("请输入源文件路径:");//输入源文件路径
File fSource=new File(input.next());
System.out.println("请输入目标文件路径:");//输入目标文件路径
File fDest=new File(input.next());
三、代码托管(务必链接到你的项目)
- 码云commit历史截图
上传实验项目代码到码云,在码云项目中选择“统计-commits”,设置搜索时间段,搜索本周提交历史,并截图。
- 代码托管
- 截图