JavaSE自学笔记整理(八)
来源:互联网 发布:php ajax 跨域 编辑:程序博客网 时间:2024/05/17 13:11
IO流
解决设备与设备之间的数据传输问题 分类: 按照数据流向划分: 输入流 输出流 按照处理的单位划分: 字节流:读取文件的二进制数据,并且不处理二进制数据 字符流:读取文件的二进制数据,并且处理二进制数据成为我们能识别的字符。(读取的数据是以字符为单位的) 字符流 = 字节流+解码
一、File类 可以描述一个文件或者是一个文件夹
1.构造方法: File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 注意:File没有无参的构造函数
2.路径: 绝对路径:该文件在硬盘上的完整路径; 相对路径:资源文件相对于当前程序的路径; . 当前路径 .. 上一级路径 注意:不在同一个盘是不可以写相对路径的 路径中使用的分隔符: 在windows上是\;在lunix上是/; 可以用File.separator获取系统分隔符; 注意: windows系统上有两种分隔符\和/;/写一个即可,\需要写两个
3.常用的方法: 创建: createNewFile() 在指定位置创建一个空文件,成功就返回true,如果已存在就不创建然后返回false mkdir() 在指定位置创建目录,这只会创建最后一级目录,如果上级目录不存在就抛异常。 mkdirs() 在指定位置创建目录,这会创建路径中所有不存在的目录。 renameTo(File dest) 重命名或者剪切 重命名文件或文件夹,也可以操作非空的文件夹,文件不同时相当于文件的剪切,剪切时候不能操作非空的文件夹。移动/重命名成功则返回true,失败则返回false。 删除: delete() 删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除,成功返回true,失败返回false。 deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除 两者区别: delete是一执行就马上删除 deleteonExit是jvm退出时才删除 判断: exists() 文件或文件夹是否存在。 isFile() 是否是一个文件,如果不存在,则始终为false。 isDirectory() 是否是一个文件夹,如果不存在,则始终为false。 isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。 isAbsolute() 测试此抽象路径名是否为绝对路径名。 获取: 文件相关 getName() 获取文件或文件夹的名称,不包含上级路径。 getPath() 返回绝对路径,可以是相对路径,但是目录要指定 getAbsolutePath() 获取文件的绝对路径,与文件是否存在没关系 length() 获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。 getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。 lastModified() 获取最后一次被修改的时间。 文件夹相关: staic File[] listRoots() 列出所有的根目录(Window中就是所有系统的盘符) list() 返回一个字符串数组,该数组存储目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。 list(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。 listFiles() 返回一个抽象路径名数组,存储文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。 listFiles(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。 注:FilenameFileter主要是过滤文件名,只有一个方法: accept(File dir, String name) //可以通过正则表达式来过滤文件:name.maches(正则表达式)
二、字节流
1.输入字节流:InputStream InputStream是所有输入字节流的超类,是抽象类 1.1 FileInputStream FileInputStream是InputStream的直接子类,是读取文件数据的字节输入流 使用步骤: 1.找到文件 2.建立数据通道 3.读取数据:read() 4.释放资源 1.2 BufferedInputStream BufferedInputStream是缓冲输入字节流,内部维护了一个8kb的字节数组 使用步骤: 1.找到目标文件 2.建立数据流入通道 3.建立缓冲输入字节流 4.关闭通道
2.输出字节流:OutputStream OutputStream是所有输入字节流的超类,是抽象类 2.1 FileOutputStream FileOutputStream是OutputStream的直接子类,是读取文件数据的字节输入流 使用步骤: 1.找到文件 2.创建文件字节输出流 3.写出文件:write() 4.关闭资源 注意事项: 1.使用FileOutputStream写入数据时,如果目标文件不存在,则自动创建该文件 2.使用FileOutputStream写入数据时,如果目标文件已经存在,则会先清空目标文件的数据再写入 3.使用FileOutputStream写入数据时,如果目标文件已经存在,需要在原来的数据基础上再添加新数据则需使用FileOutputStream(File file, boolean append)构造方法。append为true; 4.使用write方法写出一个int类型的数据,会自动舍弃32位,只保留后八位 2.2 BufferedOutputStream BufferedInputStream是缓冲输出字节流,内部维护了一个8kb的字节数组 使用步骤: 1.找到目标文件 2.建立数据输出通道 3.建立缓冲输出字节流 4.调用bufferedoutputstream的flush方法
三、字符流
1.输入字符流:Reader Reader是所有输入字符流的超类,是抽象类 1.1 FileReader FileReader是Reader的直接子类,是读取文件字符流 使用步骤: 1.读取文件 2.建立字符流通道 3.读取文件字符数据 4.关闭字符流通道 1.2 BufferedReader BufferedReader是缓冲输入字符流,内部维护了8192的字符数组 使用步骤: 1.找到目标文件 2.建立数据流入通道 3.建立缓冲输入字符流 4.读入文件内容 5.关闭通道
2.输出字符流:Writer Writer是所有输出字符流的超类,是抽象类 2.1 FileWriter FileWriter是Writer的直接子类,是输出文件字符流 使用步骤: 1.读取文件 2.建立字符流通道 3.写出数据 4.关闭字符流通道 2.2 BufferedWrite BufferedWrite是缓冲输出字符流,内部维护了8192的字符数组 使用步骤: 1.找到目标文件 2.建立数据流出通道 3.建立缓冲输出字符流 4.写入文件内容 5.关闭通道 注意:BufferedWrite拓展了newline的功能(就是回车换行)
三、转换流 InputStreamReader是字节流通向字符流的桥梁 OutputStreamWriter是字符流通向字节流的桥梁
四、序列流 序列流也称为合并流,是用来对两个流进行合并的 构造方法: SequenceInputStream(InputStream s1, InputStream s2) //合并两个流 SequenceInputStream(Enumeration<? extends InputStream> e //合并多个流,vector集合的elements()方法返回Enumeration迭代;
五、打印流 1.PrintStream:字节打印流 构造函数可以接收的数据类型: 1.字符串路径。 2.File对象。 3.OutputStream 2.PrintWrite:字符打印流 构造函数可以接收的数据类型: 1,字符串路径。 2,File对象。 对于1,2类型的数据,还可以指定编码表。也就是字符集。 3,OutputStream 4,Writer 对于3,4类型的数据,可以指定自动刷新。
六、对象的序列化与反序列化 对象的序列化: 将内存中的对象直接写入到文件设备中 ObjectOutput:接口 writeObject(Object obj) //将对象写入底层存储或流。 实现类:ObjectOutputStream 对象的反序列化: 将文件设备中持久化的数据转换为内存对象 ObjectInput:接口 readObject() //读取并返回对象。 实现类:ObjectInputStream 注意: 1.对象信息必须实现serializable接口,才能写到文件中,serizabale接口没有任何实现方法,只是标识作用 2.反序列化创建对象时不调用构造方法 3.反序列化时jvm会计算出该类的serialVersionUID,然后与本地的class文件的serialVersionUID对比,如果一样则反序列化成功 4.改变成员变量则serialVersionUID也会改变,但是本地的serialVersionUID不会改变,导致反序列化失败 解决方法:在该类中直接指定serialVersionUID即可 5.如果某个成员变量不想写到硬盘上,可以用transient修饰,即可跳过
七、Properties Properties集合是配置文件类,主要生成配置文件和读取配置文件 体系: Map--->Hashtable--->Properties 主要方法: setProperties(key,value) 添加配置信息 store() 生成配置文件 //使用该方法存储时,会带着当时存储的时间。 load() 读取配置文件 注意: 1.如果配置信息一旦使用了中文,用store方法生成配置文件时,要用字符流解决,如果用字节流解决,则出现乱码,因为使用的是iso8859-1编码 2.如果修改配置文件信息,使用setproperties后再重新用store方法写入文件
八、编码 1.常见的码表: ASCII: 美国标准信息交换码、用一个字节的7位可以表示。 ISO8859-1: 拉丁码表。以ASCII码表为基础。 GB2312: 中文码表。英文占一个字节,中文占2个字节。 GBK: 中国的中文编码表升级,融合了更多的中文文字符号。 UTF-8: 万国码表、英文存的是1个字节,中文存的是3个字节。 2.编码: 字符串--->字节数组 String类的getBytes()方法进行编码,将字符串,转为对映的二进制,并且这个方法可以指定编码表。 注意:如果没有指定码表,该方法会使用操作系统默认码表,可以通过System.getProperty("file.encoding")查询当前系统的码表。 3.解码: 字节数组--->字符串 String类的构造函数完成。 String(byte[] bytes) 使用系统默认码表 String(byte[],charset) 指定码表
九、 装饰者模式 目的:增强一个类的功能,而且可以让这些装饰类互相装饰 步骤: 1. 在装饰类的内部维护一个被装饰类的引用。 2. 让装饰类有一个共同的父类或者是父接口。 继承实现的增强与装饰者模式实现的增强的区别: 继承实现的增强类: 优点:代码结构清晰,而且实现简单 缺点:对于每一个的需要增强的类都要创建具体的子类来帮助其增强,这样会导致继承体系过于庞大。 修饰模式实现的增强类: 优点:内部可以通过多态技术对多个需要增强的类进行增强 缺点:需要内部通过多态技术维护需要增强的类的实例。进而使得代码稍微复杂。
十、递归 函数的自身调用了自身 使用前提:必须要有情况的条件下调用,要不然就是个死循环
0 0
- JavaSE自学笔记整理(八)
- JavaSE自学笔记整理(一)
- JavaSE自学笔记整理(二)
- JavaSE自学笔记整理(三)
- JavaSE自学笔记整理(四)
- JavaSE自学笔记整理(五)
- JavaSE自学笔记整理(六)
- JavaSE自学笔记整理(七)
- 自学Swift-斯坦福笔记整理(八)
- JAVASE自学笔记IO File
- Redis自学笔记整理
- 自学PHP 笔记整理
- QT自学笔记(八)
- Unity3D自学笔记——UGUI背包系统(八)物品的分类与整理
- Python自学笔记八、进程及线程
- 资源视频学习JavaSE阶段整理笔记
- C#笔记整理(八)
- box2d物理引擎自学笔记整理1
- 《Head First Java》笔记(1)
- zcmu1617
- Windos DOS命令汇总
- 一个关于MongoDB string字段索引的问题
- 手把手图文教你eclipse下如何配置tomcat
- JavaSE自学笔记整理(八)
- java异常之运行时异常和非运行时异常
- Android官方开发文档Training系列课程中文版:键盘输入处理之控制输入法的显示方式
- SaaS-SPM
- 设置ASP.NET MVC4.5站点默认页为html页
- Linux 端口占用问题
- hdu 2147
- apache-tomcat-9安装
- axure中this/target.属性的执行效率低于局部变量.属性,解决后台刷新数据延时抖动问题