黑马程序员---比向东---第二十天
File类:用于将文件或者文件夹封装成对象
方便于文件与文件夹得属性信息进行操作
File对象可以作为参数传递给流的构造函数
File类的常见方法:
1 创建
boolean createNewFile();
在指定位置创建文件,如果该文件已经存在,则不创建并返回false
和输出流不一样,输出流对象一建立创建,文件存在便会覆盖。
boolean mkdir() 创建文件夹,一次只能创建一个一级目录
boolean mkdirs() 创建多级目录(文件夹)
2 删除
boolean delete() 删除失败返回false。
void deleteOnExit()在程序退出时删除指定文件
3 判断
boolean canExecute() 判断文件是否可以执行
boolean exists() 是否存在
boolean isFile() 判断文件是否存在
boolean isDirectory() 判断文件路径(文件夹)是否存在
boolean isHidden() 判断隐藏文件是否存在
isAbsolute() 判断绝对路径
4 获取
String getName();
String getPath() 获取相对路径
String getParent() 获取绝对路径下的文件父目录,如果是相对路径返回null
FilegetAbsoluteFile() 返回的绝对路径被封装成对象
String getAbsolutePath()
long lastModified()返回此抽象路径名表示的文件最后一次被修改的时间
long int length()返回由此抽象路径名表示的文件的长度。
递归:
列出指定目录下文件或者文件夹,包含子目录中的内容
也就是列出指定目录下所有内容
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可
在列出过程中出现的还是目录的话,还可以再次调用本功能
也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归。
递归要注意
1 限定条件
2 要注意次数,尽量避免内存溢出。
Properties
properties是hashtable的子类
也就是说具备map集合的特点,而且它里面存储的键值对都是字符串
是集合中和io技术相结合的集合容器
该对象的特点:可以用于键值对形势的配置文件。
在加载数据时,需要有固定格式一般是 键=值
打印流:该流提供了打印方法,可以将各种数据类型的数据原样打印
打印流
printStream 字节打印流
构造函数可以接收的参数类型
1 file对象File 2字符串路径String 3 字节输出流OutputStream
printWriter 字符打印流
构造函数可以接收的参数类型
1 file对象File 2字符串路径String 3 字节输出流OutputStream
4 字符输出流 Writer
publicPrintWriter(OutputStream(Writer) out, boolean autoFlush)
通过现有的 OutputStream 创建新的 PrintWriter。此便捷构造方法创建必要的中间 OutputStreamWriter,后者使用默认字符编码将字符转换为字节。
参数:
out - 输出流
autoFlush- boolean 变量;如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区
黑马程序员---比向东---第二十一天
序列流
SequenceInputStream 对多个流进行合并
把多个源合并成一个源,在把合并后的源—>目的
SequenceInputStream(Enumeration<? extends InputStream> e) 可以把多个源先存储到Vector集合中,在把 new Vector<FileInputStream >.elements(); 即集合中的所有元素,一块当做参数传递给它的构造方法中(合并源); |
SequenceInputStream(InputStream s1, InputStream s2) |
操作对象 ObjectInputStream ObjectOutputStream
被操作的对象必须要实现Serializable(标记接口)
ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义
被static所修饰时,不能被序列化,被transient修饰时,也不会被序列化
管道流
PipedInputStream PipedOutputStream输入输出可以直接进行连接,通过结合线程使用。
管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从PipedInputStream
对象读取,并由其他线程将其写入到相应的 PipedOutputStream
。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏。
RandomAccessFile随机访问文件,自身具备读写的方法
通过skipBytes(int x) seek(int x) 来达到随机访问,该类不算是io体系中子类,而是直接继承Object,但是它是io包中成员,因为它具备读和写功能。内部封装了一个数组,而且通过指针对数组的元素进行操作,可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。其实完成读写的原理就是 内部封装了字节输入流和输出流。
通过构造函数可以看出,该类只能操作文件。而且操作文件还有模式:只读r 读写rw等
1 如果模式为只读r 则不会创建文件,会去读取一个已存在的文件,如果该
文件不存在,则会报异常
2 如果模式为rw模式,该对象的构造函数要操作的文件不存在,会自动创建,
如果存在,则不会覆盖。
skipBytes(int x) 跳过指定的字节数,不能往回跳
seek(int x) 调整指针的位置,从x字节开始读或写数据,向前或后都可以调整
DataInputStream DateOutputStream可以用于操作基本数据类型的数据的流对象。
如果用writeUTF()写那么只能用readUTF()读,因为此UTF-8 是4个字节的
是修改后的编码表。而之前的UTF-8单位是3个字节的
用于操作字节(字符,字符串)数组的流对象
ByteArrayInputStream 在构造的时候,需要接受数据源,而且数据源是一个字节数组
ByteArrayOutputStream 在构造的时候,不用定义数据目的,因为该对象内部封装了http://可变 长度的字节数组。这就是数据目的地。
因为这两个流对象都操作数组,没有使用系统资源,所以不用进行close关闭资源
源设备:键盘 System.in 硬盘FileStream内存ArrayStream
目的设备:控制台System.out 硬盘FileStream 内存ArrayStream.
编码表的转换
字符流的出现为了方便操作字符,但更重要的是假如了编码转换
通过子类转换流来完成InputStreamOutputStream,在两个流对象在构造的时候
可以加入字符集
常见的编码表:
ASCII:美国标准信息交换码,用一个字节的7位可以表示
ISO8859-1:拉丁码表(欧洲码表),用一个字节的8位表示。
GBK2312: 中国的中文码表,2个8位来表示,最高位为-1
GBK: 中国的中文码表升级,融合了更多的中文文字符号。
Unicode:国际标准码,融合了多种文字。所有语言都用2个字节来表示
UTF-8:最多用3个字节来表示一个字符
转码图例
编码:字符串变成字节数组
String-->byte[]: str.getBytes(charsetName);无参数按照默认GBK编码
解码:字节数组变成字符串
byte[]-->String: new String(byte[],charsetName);
注意:如果用GBK编码,用UTF-8解码,在编码用UTF-8得到字节数据
再用GBK解码。得到结果还是会出现乱码,因为GBK,和UTF-8都识别
中文的缘故,所谓的编码解码解错码表的前提是:解码的码表不支持中文
//编码(如果遍错了,得到的对应的数字,只能使用对应的码表解码了)
byte[] b3 =s.getBytes("GBK");
System.out.println(Arrays.toString(b3));
//解码ISO8859-1(解码错了,还可以再遍回去,得到解码之前的字节数据)
String s3 = newString(b3,"ISO8859-1"); //查表查错了,欧洲码表
System.out.println("乱码的s3="+s3);
//对s3 进行ios8859-1编码
byte[] b4 =s3.getBytes("iso8859-1");
System.out.println(Arrays.toString(b4));
//解码
String s4 = newString(b4,"gbk");
System.out.println("返回第一次编码之前的s4="+s4);