一、File
1.认识File、IO流
程序中存储数据的方案:是放到内存条中
缺点:它们记住的数据,在断电,或者程亭终止时会丢牛
想要长期保存数据解决方案:
文件是非常重要的存储方式,在计算机硬盘中。
即便断电,或者程序终止了,存储在硬盘文件中的数据也不会丢失。
File类
注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据。
IO流:用于读写数据(可以读写文件,或网络中的数据)
2.File
①创建对象
文件路径:在电脑中是\,但是在编程中\这是转移符号,所以要想表示正确路径有以下三种方法:
File.separatar就表示文件分隔符,可以跨平台使用
文件路径中可不存在:会创建出来
要找本模块的文件,相对路径,会直接在工程中查找文件
②常用方法- 判断文件类型、获取文件信息
获取时间的格式:
创建File对象时的路径:
③常用方法-创建文件、删除文件
④常用方法-遍历文件夹
方法以拿名字,方法二拿File对象
应用:操作
⑤遍历文件下的多级文件
递归方法:方法内调用方法自己
方法递归的三要素:递归的公式,递归的终结点,递归的方向必须走向终结点
猴子吃桃:
公式:f(x)-f(x)/2-1=f(x+1) --》f(x)=2f(x+1)+2--》是往f(10)走
文件搜索:(没有具体公式)
3.字符集
UTF-8--大家都是用
重点:
字符集的编码、解码操作:
编码:将字符编码成字节数组
解码:将字节数组解码成字符
一、IO流
两者结合共有:四大流--字节输入流、字节输出流、字符输入流、字符输出流
Java中会包装成类,它们都是抽象类
1.IO流-字节流
①文件字节输入流-每次读取一个字节
作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去。
read()方法每次读取一个字节,写一次返回一次,移到下一个,没有就返回-1
注意:
读取数据的性能很差,并且读取中文字符会乱码
IO流使用完毕后,必须关闭!释放系统资源
②文件字节输入流-每次读取多个字节
设定桶buffer的大小,使用一次。read(byte[] buffer),就会读取一次,若读取不到返回-1,读取到了会返回读取了几个字节。
使用循环进行改造
注意:性能得到提升,也不能避免汉字读取乱码,文件拷贝作用
③文件字节输入流:一次读取完全部字节
字节流和字符流的适用场景:
④文件字节输出流
写方法:
之前是覆盖管道,如果不想每次写的时候把文件内容清空而是想在之后添加:
就在创建流的时候,后面参数添true
若想下次写入换行写入:应该写入\n
⑤文件复制
将图片复制到另一个地方
⑥释放资源的方式
trry-catch-finally
特点:finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止
就算try区域return了finally区也会执行,除非exit
千万不要在finally区return数据,因为try区就算return也会执行finally就会把之前数据吞掉
应用场景:一般用于在程序执行完成后进行资源的释放操作(专业级做法)
因为就算适用IO流错误,也会执行释放的操作。
在finally区中使用try-catch是因为怕在流创建前就出现错误,关闭空
try-with-resourse-更好
资源就是最终实现AutoCloseable接口的类,其都会有一个close方法,并且资源放到这里后,用完之后,会自动调用这个方法完成资源的释放操作。
把流对象放在try后的小括号中,会自动释放
2.IO流-字符流
适合读写文本文件内容
①文件字符输入流
FileReader作用:以内存为基准,可以把文件中的数据以字符的形式读入到内存中去。
读取一个字符:
读取多个字符:
②文件字符输出流
FileWriter作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去。
注意事项:
字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效
原因创建流后,写的数据首先是写入到内存中一块缓存区(不是很大)中,刷新流才会将缓存区中的数据写入文件。
关闭流会自动刷新流,但是关闭流就不能再使用流
3.IO流-缓冲流
作用:对原始流进行包装,以提高原始数据流读写数据的性能。
①字节缓冲流
提高字节流读写数据的性能
字节缓冲流的作用原理:自带8KB缓冲池
②字符缓冲流
作用:自带8K (8192)的字符缓冲池,可以提高字符输入流读取字符数据的性能。
注意这里定义字符缓冲输入流的时候,如果想要使用按照行读取字符,就不能用多态的方式定义
read()方法返回的是读取到多少个字符,readLine()返回的就是那一行的字符串
readLine:
③性能分析-原始流和缓冲流
字节数组越大速度越快,但是大到一定程度就会不增加
4.IO流-转换流
如果代码编码和文本文件编码不一致
解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了。
用第二种构造器
首先使用字节输入流拿到文件对象,再定义字符输入转换流
对于字符输出转换流,控制写出去的为什么编码
5.IO流-打印流-写数据
包装了缓冲流。
作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去。
打印什么出去就是啥出去,以前打印数字会打印char,使用这个就会打印你打的字,可以替代写数据的流。
PrintStream:
使用wrie方法就还是跟文件字节输出流一样,输出的数字会转码成字符
PrintWriter:
打印数据上与PrintStream几乎一样,除了write方法不一样。
注意:如果想要使用低级流可以直接在文件内容后加内容就得先变成低级流再使用打印流:
应用:
输出语句的重定向,让程序中System.out.println打印的数据输出到文件中,而不是控制台
out就是个打印流对象,System就是目前控制台系统,所以在此打印就输出控制台。
若想打印到别的地方,就使用System.setOut方法,传一个打印流给它。
6.IO流-数据流
DataOutStream:数据输出流:允许把数据和其类型一并写出去。
输出的看似乱码,但是不是给你看的,使用数据输入流,可以将其数据类型一并输入
DataInputStream:数据输入流:用于读取数据输出流写出去的数据。
注意:别人先写的什么数据就得对应读什么数据
7.IO流-序列化流
对象序列化:把Java对象写到文件中去
对象反序列化:把文件中的Java对象读出来
序列化流就是实现这两个操作的
objectOutputStream(对象字节输出流):可以把Java对象进行序列化:把Java对象存入到文件中去。
注意:如果你想要序列化Java对象的话,那个对象的类就必须实现Serializable接口
特殊的存法,方便读出来,使用objectInputStream
objectInputStream(对象字节输入流):可以把Java对象进行反序列化:把存储在文件中的Java对象读入到内存中来。
如果某些对象中的成员不想被序列化,例如用户密码,在定义类的时候加一个transient,代表不参与序列化
ArrayList已经实现了Serilazible接口
8.IO框架
框架:解决某类问题,编写的一套类、接口等,可以理解成一个半成品,大多框架都是第三方研发的。
好处:在框架的基础上开发,可以得到优秀的软件架构,并能提高开发效率
框架的形式:一般是把类、接口等编译成class形式,再压缩成一个.jar结尾的文件发行出去。
IO框架:封装了Java提供的对文件、数据进行操作的代码,对外提供了更简单的方式来对文件进行操作,对数据进行读写等。
Commons-io
Commons-io是apache开源基金组织提供的一组有关IO操作的小框架,目的是提高IO流的开发效率。
一行代码就可实现:并且优化性能
导框架到项目:
三、特殊文本文件、日志技术
特殊文件:属性文件.properties、XML文件.xml
用他们的原因:普通文件无法解析,而属性文件用键值对可以进行解析,数据的关系
存储有关系的数据,作为系统的配置文件,作为信息进行传输
如果存储多个用户的复杂信息,就采用XML文件
了解它们的特点作用,如何用程序读取、存储数据
日志技术:把程序运行的信息,记录到文件中,方便程序员定位bug、并了解程序的执行情况等
1.特殊文件:Properties属性文件
如何读取数据:
如何写数据:
2.特殊文件:XML文件
①XML书写规则
只需要会读取它的数据
根标签就是这里的users
XML文件示例:
输入cd回车就可以在其中填<
应用场景:经常用来做为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。
②读取XML文件-解析XML文件
使用XML的框架,Dom4j
其解析XML文件的思想
构造器和方法
创建SAXReader对象,并将XML读成文档对象,再拿到根元素对象
根元素root指的是users,元素element指的的,根元素下的各级子元素,属性值指的是元素后面跟的内容,例如这里的id。
不用刻意记
写XML文件不使用dom4j,推荐直梓圯程序里的数据坼培成XL格式,然后用IO流写出去!
③约束XML书写格式-了解
3.日志技术
①概述
什么是日志
什么是日志技术
②日志技术的体系
Logback日志技术框架-三个重要模块
③使用Logback日志框架
记录系统的运行信息
logback.xml中记录了输入到控制台的格式,以及输出文件路径
LOGGER.info记录的是重要的信息,LOGGER.error记录的是错误的信息,LOGGER.debug记录运行中的数据进行调试用
④核心配置文件
对Logback日志框架进行控制的。
日志文件 满足1MB就会压缩一个gz格式日志文件,%i来区分
只想输出文件,就删除refconsole那行
⑤Logback设置日志级别
日志级别:
学习日志级别原因: