IO 流:
I:Input 输入:读取数据 从外部存储设备 读取数据到 内存中
O:Output 输出:写出数据 从内存中写出数据到 外部存储设备
概述:Java中I/O操作只要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据。输出也叫做作写出数据
注意:字符流主要操作文本文件
IO的分类:
-
按类型分:
- 字节流:以单个字节为基本单位来操作数据
- 字节输入流:顶层类 InputStream 抽象是表示输入字节流的所有类的父类 常用子类:FileInputStream
- 字节输出流:顶层类 OutputStream 抽象类是表示字节输出流的所有类的父类 常用子类:FileOutputStream
- 字符流:以单个字符为基本单位来操作数据
- 符输入流:顶层类 Reader 用于读取字符流的抽象类 常用子类:FileReader
- 字符输出流:顶层类 Writer 用于写入字符流的抽象类 常用子类:FileWriter
- 字节流:以单个字节为基本单位来操作数据
-
按流向分:
- 输入流:
- 字节输入流:顶层类 InputStream 抽象是表示输入字节流的所有类的父类 常用子类:FileInputStream
- 字符输入流:顶层类 Reader 用于读取字符流的抽象类 常用子类:FileReader
- 输出流:
- 字节输出流:顶层类 OutputStream 抽象类是表示字节输出流的所有类的父类 常用子类:FileOutputStream
- 字符输出流:顶层类 Writer 用于写入字符流的抽象类 常用子类:FileWriter
- 输入流:
1.集合的顶层是一个接口,而IO流的顶层是一个抽象类
2.如果一个中文是以gbk编码形式存储的,就是占2个字节
3.如果一个中文是以utf-8编码形式存储的,就是占3个字节
4.Windows系统中默认是gbk编码,idea开发工具默认的是utf-8编码
5.如果一个中文是以gbk编码形式存储的,用utf-8编码打开,那么就会出现乱码
6.计算机中存储任何数据都是以二进制的形式存储的
字节输出流:OutputSteam 中定义的基本共性方法。
public void close(): 关闭此输出流并释放与此流相关联的任何系统资源
public void flush(): 刷新此输出流并强制任何缓冲的输出字节被写出
public abstract void write(int b) : 将指定的字节输出流, 写入一个字节数据到目的文件
public void wiate(byte[] b); 将b.length字节从指定的字节数组写入此输出流,写入一个字节数组的字节数据到目的文件
public void wiate(byte[] b, int off,int len): 从指定的字节数组写入len字节,从偏移量off开始输出到此输出流,(从指定off索引位置开始写入到此文件,len是输出几个字节)写指定长度的字节数组到目的文件小贴士:close方法,当完成流的操作时,必须调用此方法,释放系统资源
FileOutputStream 子类
构造方法:
public FileOutputStream(File file): 创建文件输出流以写入由指定的File对象表示文件
public FileOutputStream(String name): 创建文件输出流以指定的名称写入文件
public FileOutputStream(File file , boolean append): 创建文件输出流以写入由指定的File对象表示文件,true是拼接文件内的内容,false是替换文件内的内容
public FileOutputStream(String name , boolean append): 创建文件输出流以指定的名称写入文件,true是拼接文件内的内容,false是替换文件内的内容
注意:当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件,会清空这个文件的数据
字节输入流:InputStream 基本共性功能方法:
public void close(): 关闭此输出流并释放与此流相关联的任何系统资源
public abstract int read(): 从输入流读取数据的下一个字节,读取一个字节
public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组b中
小贴士:close方法,当完成流的操作时,必须调用此方法,释放系统资源
FileInputStream 子类
构造方法
FileInputStream(File file); 通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的File对象flie命名
FileInputStream(String name): 通过打开与实际文件的连接来创建一个FlieInputStream,该文件由文件系统中的路径名name命名
注意:当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出
FileNotFoundException
字符输入流:Reader 基本共性功能方法。
public void close(): 关闭流
public int read(): 从输入流读取一个字符
public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组中
FileReader 子类
构造方法
FileReader(File file): 创建一个新的FileReader,给定要读取的File对象
FileReader(Steing FileName): 创建就一个新的FileReader,给定要读取的文件的名称
注意:当你创建一个流对象时,必须传入一个文件路径,
字符输出流:Writer 基本共性功能方法
public abstract void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public abstract void flush() :刷新此输出流并强制任何缓冲的输出字符被写出。
public void write(int c) :写出一个字符。
public void write(char[] cbuf) :将 b.length字符从指定的字符数组写出此输出流。写出一个字符数组
public abstract void write(char[] b, int off, int len) :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。
public void write(String str) :写出一个字符串。
FileWriter 子类
构造方法
FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。
FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称。
FileWriter(File file, boolean append): 创建一个新的,true是拼接文件内的内容,false是替换文件内的内容
FileWriter(String fileName,boolean append)) :创建一个新的,true是拼接文件内的内容,false是替换文件内的内容
注意:当你创建一个流对象时,必须传入一个文件路径,
回车符 \r 和换行符 \n :
回车符:回到一行的开头(return)。
换行符:下一行(newline)。
系统中的换行:Windows系统里,每行结尾是 回车+换行 ,即 \r\n ;
Unix系统里,每行结尾只有 换行 ,即 \n ;
Mac系统里,每行结尾是 回车 ,即 \r 。从 Mac OS X开始与Linux统一。
字节:
字符:
IO异常的处理
jdk7以前处理(重要)
public class HandleException1 {
public static void main(String[] args) {
// 声明变量
FileWriter fw = null;
try {
//创建流对象
fw = new FileWriter("fw.txt");
// 写出数据
fw.write("程序员"); //程序员
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fw != null) {
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
jdk7 处理IO流异常的格式:
try (创建流对象语句,如果多个,使用';'隔开) {
// 读写数据
} catch (IOException e) {
e.printStackTrace();
}
jdk9 的改进(了解)
public class TryDemo { public static void main(String[] args) throws IOException {
// 创建流对象
final FileReader fr = new FileReader("in.txt");
FileWriter fw = new FileWriter("out.txt");
// 引入到try中
try (fr; fw) {
// 定义变量
int b;
// 读取数据
while ((b = fr.read())!=‐1) {
// 写出数据
fw.write(b);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Properties 属性列表集合
概述:实现Map,可以当双列集合用,但是主要作用是获取一个文件的信息,是一个持久集
基本的存储方法:
public Object setProperty(String key, String value) : 保存一对属性。(存储键值对到集合)
public String getProperty(String key) :使用此属性列表中指定的键搜索属性值。(根据键找值)
public Set stringPropertyNames() :所有键的名称的集合。 (找出所有的键存到Set集合中)
与流相关的方法 (重点中的重点)
public void load(InputStream inStream) :把文件中的内容拷贝到Properties集合中,以键值对的形式
public void store(OutputStream outstream): 指定文件替换文件中的内容