IO流小结(掌握)
1.File
创建文件对象,对硬盘里的文件进行操作.
File file = new File("path"); //ptah可以是绝对路径也可以是相对路径
判断
获取
删除
新创建
2.异常
根类:
Throwable
--Error 这个是错误,一般程序无法拯救
--Exception 程序出现的异常,一般是程序员编码导致
--RuntimeException 编译不报错 运行时报错
NullPointerException ClassCastException ArrayIndexOutOfBoundsException
--编译异常 编译器就会报错
3.IO流(字节流& 字符流)
|--字节流
|--字节输入流
InputStream 往进读
|--FileInputStream --操作文件文件的流
|--BufferedInputStream -- 字节包装流
int read():一次读取一个字节
int read(byte[] bys):一次读取一个字节数组
|--字节输出流
OutputStream 往出写
|--FileOutputStream
|--BufferedOutputStream
void write(int by):一次写一个字节
void write(byte[] bys,int index,int len):一次写一个字节数组的一部分
|--字符流 --操作文本文件, 不能操作非文本文件
|--字符输入流
Reader
|--BufferedReader
String readLine():一次读取一个字符串 while((line = br.readLine()) != null)
int read():一次读取一个字符 (中文GBK编码下占2个字节,一个字符)
char[] charArr = new char[1024<<3]
int read(char[] chs):一次读取一个字符数组
|--InputStreamReader ------ Input Reader 他就是一个转换, 把子字节流转换成字符流
|--FileReader
|--字符输出流
Writer
void write(int ch):一次写一个字符
void write(char[] chs,int index,int len):一次写一个字符数组的一部分
|--OutputStreamWriter
|--FileWriter
|--BufferedWriter
void newLine():写一个换行符 (跨平台) 代表的意思就是回车换行
void write(String line):一次写一个字符串
4.IO的其他流
1)序列流 --- 作用: 可以把多个输入流整合成一个输入流 ( 拼接一个map3串烧)
SequenceInputStream
问题: 如果有很多输入流怎么整合? 通过他的构造传入一个枚举对象,完成多个流的整合,枚举里面装的是多个流
2)内存流 --- 作用: 该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据(读入的文件不能太)
使用方式
创建对象:ByteArrayOutputStream baos = new ByteArrayOutputStream();
写出数据: write(int), write(byte[] , 0 ,len)
获取数据: toByteArray() ------------- byte[] arr = baos.toByteArray(); 缓冲区的数据全部获取出来.
还可以直接打印的baos
3)随机访问流(雌雄同,即是输入流也是输出流)
RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能, 即使输入流,又是输出. (雌雄同体)
创建对象: RandomAccessFile raf = new RandomAccessFile("g.txt", "rw"); /r代表可读, w代表可写
read(),write(),seek() ---> raf.seek(0);设置指针 raf(100) 从101开始写
用途: 多线程下载
4)对象操作流
该流可以将一个对象写出, 或者读取一个对象到程序中. 也就是执行了序列化和反序列化的操作
序列化:将对象写出到文件
创建输出流对象:ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e.txt"))
写入对象 oos.writeObject(new Person("张三",18));
反序列化:将文件中的字节数据翻译成对象
创建输入流对象:ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e.txt"));
Person p1 = (Person) ois.readObject();
注意: 被序列化的对象,该类必须实现Serializable接口,
(给被序列化的类添加序列号id)如: private static final long serialVersionUID = 1L;
5)数据输入输出流
作用: DataInputStream, DataOutputStream可以按照基本数据类型大小读写数据
创建输出流对象:DataOutputStream dos = new DataOutputStream(new FileOutputStream("b.txt"));
给文件写一个int值: dos.writeInt(997);
write(997) ---> 按照GBK编码找到字符---> 写到文件
创建输出流对象: DataInputStream dis = new DataInputStream(new FileInputStream("b.txt"));
读出一个int值: int x = dis.readInt();
6)打印流
作用: 该流可以很方便的将对象的toString()结果输出, 并且自动加上换行, 而且可以使用自动刷出的模式
创建对象: PrintStream ps = System.out;
PrintWriter pw = new PrintWriter(new FileOutputStream("g.txt"), true); //true:表示自动刷新
注意: pw.print(97); 无自动刷出
pw.write(99); 无自动刷出
pw.println(97); 有自动刷出
7)标准输入输出流
System.in是InputStream, 标准输入流, 默认可以从键盘输入读取字节数据
System.out是PrintStream, 标准输出流, 默认可以向Console中输出字符和字节数据
修改输入流: System.setIn(InputStream)
修改输出流: System.setOut(PrintStream)
8)两种方式实现键盘录入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); (InputStreamReader)--- 转换流(字节到字符的转换)
String line = br.readLine();
Scanner
String line = sc.nextLine();
9)Properties 是Hashtable的子类,双键集合
作用: Properties 可保存在流中或从流中加载,属性列表中每个键及其对应值都是一个字符串。
Properties的特殊功能
public Object setProperty(String key,String value) -----> 设置属性
public String getProperty(String key) ----->根据键获取值
public Enumeration<String> stringPropertyNames() ----->获取键的集合
Properties的load()和store()功能
prop.load(new FileInputStream("config.properties")); //将文件上的键值对读取到集合中
public Object setProperty(String key,String value) --- 把文件读到内存,然后修改其内容
prop.store(new FileOutputStream("config.properties"), null); //将修改后的内存存储在文件中,第二个参数是对列表参数的描述,可以给值,也可以给null
|