Java基础总结--IO总结2

1.键盘录入--Java具有特定的对象封装这些输入输出设备
在System类定义 in-InputStream类型和out-PrintStream类型成员变量
阻塞是方法:read()无数据就阻塞
windows里面回车键对于两个字节\r-13\n-10
从系统获得流对象只有一个,所以别关流
InputStream in = System.in(调用的是系统的流,在Java中被定义为该中类型)
不要进行关闭,因为关闭的是系统的流否则会用不了。
StingBulider/StringBuffer清空用的是delete()
键盘录入的结束通常都是自定义结束的

2.转换流(字节流与字符流之间的转化)
字节流想利用字符缓冲流的readLine()--先转化为字符流,在被缓冲流装饰
InputStreamReader和OutputStreamReader继承Reader
InputStreamReader(InputStream in)--字节流转化为字符流可以指定charset编码
对于字节与字符流的区别:字节对于一个中文需要读两次,字符对于中文其实也是利用底层的字节流读两次再进行查表,返回一个中文字符。
字符流 = 字节流 + 编码表(未指定按照操作系统默认的码表)
编码:文字转化为数字encode
解码:数字转化为文字decode
流的传送:源A地--小管道--大管道--大管道--小管道--目的B地
转化流:可以指定编码表(未指定就用本机默认和其子类相同)
中文GBK-2B/UTF-8(国际标准-按照实际长度定字节数-每字节存在编码头)
指定用UTF-8写就要用UTF-8读
* 什么时候使用转化流:
源或目是字节流操作是文本数据,可以使用转化流,提高对 文本的操作
一旦文本操作涉及具体的编码表时候,必须使用转化流

3.流操作的基本规律---流只能对传送的数据进行操作
* 明确源地和目地
* 明确数据是否是纯文本数据--确定使用的具体体系
是:字符流
否:字节流
* 明确具体的设备
源设备:
硬盘--文件
键盘--System.in
内存--数组
网络--Socket流
目设备:
硬盘--文件
控制台--System.out
内存--数组
网络--Socket流
* 是否需要提高额外功能
需要高效(缓冲区)
是否需要转换流

4.File类--将存在/不存在的文件或文件夹封装成对象
* 方便对文件或文件夹的属性信息进行操作
* File类对象可以作为参数传递给流对象
* File类的常见方法
构造方法
File(File parent, String child) //1,2类似
File(String parent, String child)
File(String pathname)
字段
char separatorChar系统默认名称分隔符\\
char pathSeparatorChar系统默认路径分隔符
常见的方法
1.获取:文件名,文件路径,文件大小(不存在就0B),文件修改时间
注意文件路径:相对路径和绝对路径(从根目录开始)
2.创建与删除(文件、文件夹)
boolean-创建createNewFile()不存在就创建,存在就不创建,与输出来不同,每次 都是进行覆盖/或者续写 --只能操作的文件或目录,不可以操作里面的数据
删除boolean-delete() windows删除从里往外删除
创建单极或多级目录(删除多级目录--只会删除最里面的一个目录)
文件正在被访问不能删除
3.判断
先文件是否存在(是否目录/是否文件-针对存在)是否隐藏
4.重命名renameTo(File dest) 重命名文件
5.获取指定的当前目录下的文件及文件夹名称 String[]-list()
(包含隐藏的文件夹)
注意:封装File对象的时候必须是目录,不能是文件名
如果目录存在,会返回一个长度为0的数组
6.文件过滤器(重点)
list(FilenameFilter filter)-String[]
FilenameFilter--文件过滤器(接口)定义类--实现FilenameFilter接口
将该类的对象传递给List()方法
过滤器方法原理:先遍历目录,放在数组中并遍历,满足条件放在容器里面,
把集合转化为数组返回
7.深度变量文件夹--对指定目录的所有目录的列出[递归]
8.递归
* 一定要明确递归的条件,否则容易栈溢出
5.Map接口的子类Properties--可以和IO技术结合--Map集合的属性集
特点:集合中键和值都是字符串类型
集合中的数据可以保存在流中,或者从流中获取
作用:通常该集合用于操作以键值对形式存在的配置文件
配置文件:存储配置信息的文件,用于配置某些应用程序<键值对,xml,数据库>
遍历集合中元素:Set<String> stringPropertyNames()--变成集合,再迭代器
Properties与流的结合
list(PrintStream out)--直接将集合信息打印在控制台
store(OutputStream out, String comments)--将集合信息存储硬盘--这就叫持久化
两个参数,前面指定写的位置,后面字符串对数据进行描述--不要写中文注释
修改硬盘上存储的键值对信息
先读文件(保证里面是键值对)--放到集合--修改--存储
load(InputStream inStream) 读数据
java里面配置信息文件命名XX.properties/ini(windows系统)/xml文件
eg:记录程序使用的次数---使用Properties--仅仅是Properties一个使用方面
配置信息--通常用在保存应用程序的个性化设置(保存设置后关掉依然存在)
注意:递归过程保证容器唯一,不要将容器定义在方法里面,要传参数容器
定义方法的时候需要确定传入的参数--针对谁进行的处理

6.其他的流对象--辅助功能
打印流(不跑出异常):PrintStream--System.out返回值
构造方法:接收File,字符串路径,流out对象
常见方法:提供操作各种数据的打印方法。print方法保存数据的表示形式
print(97)--文件里面就是97,write(97)--会选择最低的1B存储不会保留形式
实现原理:将数字变成字符串然后写字符串
PrintWriter--使用平台默认编码方式
构造方法:接收File,字符串路径,流out对象,写字符流

序列流:SequenceInputStream--对于多个流的合并--只有处理源的对象
输入流的逻辑串联--把多条流封装为一条流(SequenceInputStream)
本质就是集合中装入多个流--最后一个流返回值当作是结束
将多个源合并成一个源
eg:文件切割(按照顺序切割)+文件合并
注意切割文件时候将文件类型和文件的个数存在一个配置文件里面,因为合并
的时候需要用到这些信息

对象流:ObjectInputStream/OutputStream--为了能够保存对象数据的关联性
存储的对象--在硬盘的文件里面(对象的持久化存储)对象流+文件流的配合使用
对象流的前提:要操作的对象必须实现serializable(标记接口)将对象转化为二进制数字流--对象要按照顺序存储在文件中--writeObject(Object obj)、readObject()
注意:*存储对象仅仅只是想延长对象的生命周期,所以并不关心写出去的格式。
*读对象所在文件时候必须使用基本流+对象流才能将数据转化为一个对象
*读对象的时候必须保证有该对象的类文件在内存在+写出去的文件--两个存在 才可以成功读对象--强制转型
*写对象--序列化;读对象--反序列化(类似于编码和解码)
*关于存储对象--存储的是对象的非静态成员变量(被transient修饰的也不会 写到对象文件里面--其他并无差别--非静态数据不想被序列化)
serializable(标记接口)存在的意义?--给类加ID
存储对象--序列化的时候得到一个序列化id号(对应的类也有相同的id号),再进行读对象的反序列化的过程中,会检测加载的类与原来的类的对象id是否一致,不一致就会发生异常,就不能读对象
不同版本的编译器可能编译的id结果不一致,解决办法自己定义对象序列化id号
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

RandomAccessFile--随机访问文件--不属于任何io的继承体系--字节流
特点
* 自身具备对随机访问文件的读写功能
* 该对象内部维护了一个byte数组,并通过指针可以操作数组中的元素--数组可以延长--自动扩展
* 可以设置和获取当前指针的位置
* 其实该对象将字节输入流和字节输出流的封装--为一个整体的工具对象
* 操作随机文件---只能是文件(源/目的)
* 构造方法的特殊之处--指定操作文件的模式(读写的控制四种可选)
* 该类里面有许多有用的方法读写基本数据类型(保证原本的字节数),字节数组等
* 如果文件不存在则创建,存在则不创建-不会覆盖
* 可以指定存储和写的位置,随机的对文件操作seek(long pos)--设置当前指针位置
没有指定的情况下是从0角标开始写(若原来存在则覆盖)
* 随机写--可以给任意位置写,可以从任意位置开始读
* 随机访问文件要求数据要有规律,长度可以进行规律的估计
* 小应用:利用多个线程负责不同地方的数据写数据(利用该类可以指定开始写位置)

PipedInputStream/PipedOutputStream-管道流[应用于多线程]
特点
* 输入流与输出流可以直接连接 read()<-->write()
* 管道流读必须要读管道流的输出
read()[阻塞方法没管道输出数据,就一直等待]-->write()[后面就执行不到]
程序就等待在这--一般用多线程可以处理该问题,写线程写出数据唤醒读线程
* 管道流内部含有一个缓冲区
* 需要调用connect()方法连接两个流

DataInputStream/DataOutputStream---操作基本数据类型
特点--保存基本数据类型的形态
* 使用结合+InputStream--读和写的类型必须一致
* writeUTF()--readUFT()对于使用(编码和解码是utf8修改版)自动添加的头信息

操作数组的流对象--[源与目都是内存上]
ByteArrayInputStream/ByteArrayOutputStream--用流的思想操作数组
特点
* 内存中存在可变长度的数组缓冲数据
* 不用关闭流(关闭流原因:调用底层的资源)--操作的内存不用底层的资源

* 不会抛出io异常
* ByteArrayInputStream(byte[] buf)--明确源内存
ByteArrayOutputStream()--自动包含数组--也可以指定缓冲区的大小
* 如果要操作的源是内存--直接就用ByteArrayInputStream
CharArrayReader/CharArrayWriter
StringReader/StringReader

7.常见的编码表
ASCII-可以是7bit字符
GBK--中文编码
unicode--统一处理方式固定长度编码--2B
utf-8--不固定长度的编码,最多可以用三个字节表示一个字符

上一篇:H5试题


下一篇:【洛谷 P4360】 [CEOI2004]锯木厂选址(斜率优化)