缓冲流
不使用缓冲流
public static void m1()throws Exception{
String pathname="D:\\javaProject\\recv\\智游-张奎龙\\apache-tomcat-8.5.51-windows-x64.zip";
FileInputStream fis = new FileInputStream(pathname);
String pathname2="D:\\javaProject\\recv\\智游-张奎龙\\copy\\新建 文本文档.zip";
FileOutputStream fos = new FileOutputStream(pathname2);
//每次读取一个字节数组
byte[] bytes=new byte[1024];
int length;
long start = System.currentTimeMillis();
while ((length=fis.read(bytes))!=-1){
fos.write(bytes,0,length);
}
long end = System.currentTimeMillis();
System.out.println("花费的时间"+(end-start));
//关闭流
fos.close();
fis.close();
}
使用缓冲流
private static void m2()throws Exception{
String pathname="D:\\javaProject\\recv\\智游-张奎龙\\apache-tomcat-8.5.51-windows-x64.zip";
FileInputStream fis = new FileInputStream(pathname);
String pathname2="D:\\javaProject\\recv\\智游-张奎龙\\copy\\新建 文本文档.zip";
FileOutputStream fos = new FileOutputStream(pathname2);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
//每次读取一个字节数组
byte[] bytes=new byte[1024];
int length;
long start = System.currentTimeMillis();
while ((length=bis.read(bytes))!=-1){
bos.write(bytes,0,length);
}
long end = System.currentTimeMillis();
System.out.println("花费的时间"+(end-start));
bos.close();
bis.close();
}
模拟登录 判断用户名和密码是否正确
public static void m6() throws Exception{
// 准备一个路径
String pathname = "D:\javaProject\recv\智游-张奎龙\copy\新建 文本文档.txt";
// 准备一个文件字符输入流对象
FileReader fr = new FileReader(pathname);
// 准备一个缓冲字符输入流对象
BufferedReader br = new BufferedReader(fr);
// 输入用户名和面值
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名");
String username = scanner.nextLine();
System.out.println("请输入密码");
String password = scanner.nextLine();
// 判断用户名和密码值是否存在
// 使用循环读取
String data = null;
// 定义一个开关
boolean flag = false;
while ((data = br.readLine()) != null) {// readLine()返回值为null--->读取到流的末尾
//张三,123456
String[] user = data.split(",");
// 第一个值就是用户名 第二个值就是密码值
if (user[0].equals(username) && user[1].equals(password)) {
flag = true;
}
}
if (flag) {
System.out.println("登录成功");
} else {
System.out.println("用户名或者密码不正确!!");
}
}
Properties
- 它是一个属性类,属于HashTable类的一个子类,可以使用Map接口当中所有的方法
- 它的键值对类型都是字符串
- 常用API方法
store() --->把属性集中的数据存储到文件中
load() ---->把文件中的数据读取到Properties属性集中
getProperty() ---->获取属性值
setProperty() ---->设置属性值
//Properties 把属性集中的数据存储到properties文件中
private static void m7()throws Exception{
//创建一个属性集
Properties properties = new Properties();
properties.setProperty("张三","123456");
properties.put("李四","111111");
//把properties属性集当中的值存储到一个文件当中
String pathname="day22\\src\\data.properties";
// 准备一个文件字节输出流对象
FileOutputStream fos = new FileOutputStream(pathname);
properties.store(fos,"data message");
fos.close();
}
//把properties文件中的数据读取到Properties属性集中
private static void m8()throws Exception{
//创建一个属性集
Properties properties = new Properties();
// 准备一个输入流对象
FileInputStream fis = new FileInputStream("day22\\src\\data.properties");
properties.load(fis);
String v1 = properties.getProperty("张三");
String v2 = properties.getProperty("李四");
System.out.println(v1+"--"+v2);
}
对象序列化与反序列化
private static void m9()throws Exception{
Student s1=new Student(1,"张三1",98);
//把s1作为一个整体存储到文件当中 序列化
String pathname="day22\\src\\student.txt";
//创建一个字节输出流对象
FileOutputStream fos = new FileOutputStream(pathname);
//可以进行序列化对象
ObjectOutputStream oos = new ObjectOutputStream(fos);
//把对象数据写入到到day22\src\student.txt当中
oos.writeObject(s1);
//把文件当中的对象数据读取到内存当中 反序列化
// 创建一个输入流对象
FileInputStream fis = new FileInputStream("day22\\src\\student.txt");
// 创建一个对象输入流
ObjectInputStream ois = new ObjectInputStream(fis);
// 从反序列化流中读取对象数据
Student s11 =(Student) ois.readObject();
System.out.println(s11);
// 关闭流对象
ois.close();
fis.close();
oos.close();
fos.close();
}
- 备注:如果类中定义的成员变量为静态的,那么该静态成员变量是不能进行序列化的
- 原因:因为静态成员变量不属于对象,储存的位置不在对象当中,在方法区中的静态区中存储所以我们在进行对象数据序列化的时候,是不能把方法区中静态区中的数据进行序列化,最终静态成员变量值是不会存储到序列化的文件中
- 类对象在进行序列化和反序列化的时候,每次jvm都会先比对序列版本号,如果序列版本号不一致,那么程序就不允许通过反序列化读取文件中的对象数据
- 解决办法:
不让jvm每次为我生成序列版本号,由开发者把序列版本号写成一个常量值,这样后续再次改动类文件结构时,jvm就不会再生成一个新的序列版本号
//使用FilenameUtils工具包
private static void m1()throws Exception{
String pathname="day22\\src\\io.txt";
String name = FilenameUtils.getName(pathname);
System.out.println(name);
//创建一个File实例
File file = new File(pathname);
String path = file.getName();
System.out.println(path);
//获取文件的拓展名
String extension = FilenameUtils.getExtension(path);
System.out.println("文件的拓展名:"+extension);
//判断是否是以指定的拓展名结尾
boolean result = FilenameUtils.isExtension(path, "txt");
System.out.println(result);
}
//使用FileUtils工具包
private static void m2()throws Exception{
String pathname="D:\\javaProject\\recv\\智游-张奎龙\\三国演义 (2).txt";
File file = new File(pathname);
String string = FileUtils.readFileToString(new File(pathname), "UTF-8");
System.out.println(string);
//整行读取,从流中全部读完
List<String> list = FileUtils.readLines(file, "UTF-8");
System.out.println(list);
//把字符串直接写入到文件当中
String pathname2="day22\\src\\SanGuo2.txt";
File file2 = new File(pathname2);
FileUtils.writeStringToFile(file2,"你好,世界","UTF-8");
String string2 = FileUtils.readFileToString(file2, "UTF-8");
System.out.println(string2);
FileUtils.writeStringToFile(file2,"你好,世界","UTF-8",true);
//拷贝文件夹
String pathname3="D:\\javaProject\\recv\\智游-张奎龙\\三国分章节";
//目标文件夹
String pathname4="D:\\javaProject\\recv\\智游-张奎龙\\新建文件夹";
FileUtils.copyDirectory(new File(pathname3),new File(pathname4));
//拷贝文件
String pathname5="D:\\javaProject\\recv\\智游-张奎龙\\三国分章节\\000 三国演义 上卷.txt";
String pathname6="D:\\javaProject\\recv\\智游-张奎龙\\新建文件夹\\000.txt";
FileUtils.copyFile(new File(pathname5),new File(pathname6));
}
打印流
//使用打印流
private static void m3()throws Exception{
PrintStream printStream = new PrintStream("day22\\src\\io.txt");
printStream.write("智游教育".getBytes());
printStream.print("智游java");
printStream.append('中');
}
异常:
- 继承体系:Throwable 异常类(顶级父类):Error错误类/Exception异常类
- Exception异常类
编译器异常(受检异常,checked):在高级开发工具中,编写代码过程中,代码中就包含的异常信息需要进行异常处理,否则编译异常
运行期异常(非受检异常,runtime):在编译过程中不会发生异常,只有class文件加载到jvm虚拟机才能检查出的异常 - 编译期异常
IO异常--->Exception
运行期异常 --->RuntimeException
ArithmeticException 算数异常
索引越界异常 StringIndexOutOfBoundsException
空指针异常 NullPointerException - 结果:
异常在程序当中发生后,会导致程序异常终止,异常后面的代码是不会执行或加载的 - 异常:
首先jvm会找到匹配的异常类(对象)来接收异常信息
异常对象包括:异常类型、异常产生的位置、异常产生的原因、异常的解决办法 - 异常链:一个异常可能引发其他异常
- 解决异常:
通过它的提示信息来定位异常产生的位置--->原因---->日志