File类;
FIie封装不是一个具体存在是文件或文件夹,仅仅是个路径。它可以是存在的也可不存在。
递归;
注意事项;
1.必须得有出口;否则栈内存溢出。
2.递归的次数不宜过多;否则内存溢出。
3.构造方法不能递归。
IO流;
输入(input);输出(output);
流是对数据传输的总称;
常用于;文件复制,文件上传,文件下载。
分类;
1,流向
输入流:读数据;
输出流 :写数据;
2,数据类型
字节流和字符流。
使用场景;
如果是纯文本文件用字符流;
如果是图片,视频,音频等二进制文件用字节流。
不确定文件类型用字节。’
抽象类:(不能直接创建对象)
InputStream:是所有字节输入流的超类;
OutputStream:是所有字节输出流的超类;
使用字节输出流写数据的步骤:
1,创建对象;
2,调用字节输出流的写数据方法;
3,释放资源。
切记FileOutputStream创建对象后面直接跟是文件路径不用 new File();
FileOutputStream fas = new FileOutputStream("D:\\itcast\\a.txt");
A:调用系统功能创建了文
B:创建了字节输出流对
C:让字节输出流对象指向创建好的文件
FileOutputStream
字节流写数据的两个小问题
1,换行 windows : \r\n;
2,Linux:\n;
字节流写数据的实现追加;
FileOutputStream(文件路径名,boolean append)当后面为true时是在后面追加。
字节流写数据的异常处理;
Try - catch ----finally;
finally特点
- 被finally控制的语句一定会执行,除非JVM退出
字节流读数据;
FileInputStream(String name);
创建字节输入流对象
- 调用字节输入流对象的读数据方法
- 释放资源
字节缓冲流(高效流)
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("myByteStream\\bos.txt"));
BufferedOutputStream-bos=new-BufferedOutputStream(new-FileOutputStream("myByteStream\\bos.txt");
字符流
由于字节流操作中文不是特别方便,所以java 就提供了字符流
字符流= 字节流+编码表;
编码表;
什么是字符集
是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等
计算机利用编码表识别字符集;不同字符就对应不同的编码表;
常见的字符集有;
ASCII,GBXXX,Unicode;
1,ASCII利用7位表示一个字符;共128个字符;
ASCII的扩展字符集使用8位表示一个字符,共256字符,方便支持欧洲常用字符
2, GBXXX字符集:
GBK:最常用的中文码表,使用了双字节编码方案;
3,Unicode字符集:
UTF-8编码:可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用 中,优先采用的编码,它使用一至四个字节为每个字符编码
编码规则:
128个US-ASCII字符,只需一个字节编码
拉丁文等字符,需要二个字节编码
大部分常用字(含中文),使用三个字节编码
其他极少使用的Unicode辅助字符,使用四字节编码
编码:
用 getBytes()
getBytes(String charsetName) 注意 charsetName为指定字符集;
解码:
String (byte []bytes); String(byte[] bytes, String charsetName)
String ss = new String(bas);解码时在方法前加个new;
字符流中的编码解码问题(转换流)
- InputStreamReader:是从字节流到字符流的桥梁
OutputStreamWriter:是从字符流到字节流的桥梁
InputStreamReader(InputStream in) | 使用默认字符编码创建InputStreamReader对象 |
| InputStreamReader(InputStream in,String chatset) | 使用指定的字符编码创建InputStreamReader对象 |
| OutputStreamWriter(OutputStream out) | 使用默认字符编码创建OutputStreamWriter对象 |
| OutputStreamWriter(OutputStream out,String charset) | 使用指定的字符编码创建OutputStreamWriter对象 |
字符流写数据方式;
1,Write(int c);2,Write(char[]chuf);3.Write(char[]cbuf,int off,int len);4,Write(String);5,Write(String ,int off,int len)
Flush()刷新流;
字符流读数据的方式;
Int read();
Int read(char[]chuf);
字符数组转换成字符串用new String(数组名,0,len);
字符缓冲流
BufferedWriter(Writer out) | 创建字符缓冲输出流对象 |
| BufferedReader(Reader in) | 创建字符缓冲输入流对象 |
特有功能;
BufferedWriter:
Void newLine 写一行分隔符
BufferedReader:
String readLine()读一行文字;
指定编码集;
new BufferedReader(new InputStreamReader(new FileInputStream("D:\\javase\\a.txt"),"GBK"));
对象序列化:
就是将对象保存到磁盘中,或者在网络中传输对象;
这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息;
字节序列化写到文件;
序列化流 ObjectOutputStream;
将Java对象的原始数据类型和图形写入OutputStream
方法:
WriteObject()-
ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("myOtherStream\\oos.txt"));
一个对象要想被序列化,该对象所属的类必须必须实现Serializable 接口 不需要重新方法;
对象反序列化:
该字节序从文件中读出来,重构对象。
ObjectInputStream
方法Object readObject();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myOtherStream\\oos.txt"));
为了解决修改对象所属的类会出现异常,要把对象类序列化值固定;
private static final long serialVersionUID = 42L;
如果类中某个成员变量不想被序列化;
要用关键字transient修饰;
Properties集合;
--是一个Map体系的集合类
- Properties可以保存到流中或从流中加载
- 属性列表中的每个键及其对应的值都是一个字符串
创建集合对象;它没有泛型
Properties prop = new Properties();
添加元素 put();
setProperty(String key, String value) | 设置集合的键和值,都是String类型
getProperty(String key) | 使用此属性列表中指定的键搜索属性
stringPropertyNames() | 从该属性列表中返回一个不可修改的键集
Properties和IO流相结合的方法
//把集合中的数据保存到文件
myStore();
//把文件中的数据加载到集合
myLoad();
load(InputStream inStream) | 从输入字节流读取属性列表(键和元素对)load(Reader reader) | 从输入字符流读取属性列表(键和元素对)
store(OutputStream out, String comments) | 将此属性列表(键和元素对)写入此
store(Writer writer, String comments) | 将此属性列表(键和元素对)写入此
例子;
prop.load(fr);
prop.store(fw,null);
|
|