主要内容
- IO流
- 字节流
- 字符流
- 异常处理
- Properties
1 IO概述
输入流 | 输出流 | |
---|---|---|
字节流 | 字节输入流 | 字节输出流 |
InputStream | OutputStream | |
字符流 | 字符输入流 | 字符输出流 |
Reader | Writer |
2 字节流
万物皆字节
2.1字节输出流OutputStream
public void close():关闭流释放资源(完成流操作必须使用)
public void flush():刷新流输出字节
public void write(byte[] b):将b.length字节从指定数组输出
public void write(byte[] b,int off,int len):从数组写入len字节,从off开始
public abstract void(int b):指定字节输出流
2.2FileOutputStream类
文件输出流,将数据写出到文件
构造方法:
public FileOutputStream(File file):创建文件输出流写入File对象表示的文件 public FileOutputStream(String name):创建文件输出流以指定的名称写入文件 创建流对象,必须传入文件路径,没有该文件,会创建,有文件,会清空此文件数据 举例: // 使用File对象创建流对象 File file = new File("a.txt"); FileOutputStream fos = new FileOutputStream(file); // 使用文件名称创建流对象 FileOutputStream fos = new FileOutputStream("b.txt");
写出字节数据
1.write(int b) 每次写出一个字节 2.write(byte[] b)每次写出数组中的数据 3write(byte[] b, int off, int len).写入指定长度字节数组,从off索引,len个字节 举例 // 使用文件名称创建流对象 FileOutputStream fos = new FileOutputStream("fos.txt"); // 写出数据 fos.write(97); // 写出第1个字节 fos.write(98); // 写出第2个字节 fos.write(99); // 写出第3个字节 //字符串转换为字节数组 byte[] b = "黑马程序员".getBytes(); // 写出字节数组数据 fos.write(b); // 写出从索引2开始,2个字节。 fos.write(b,2,2); //关闭资源 fos.close();
数据追加续写
true表示追加数据,false清空原有数据 创建文件输出流写入File对象 public FileOutputStream(File file,boolean append) 创建文件输出流指定的名称写入文件 public FileOutputStream(String name,boolean append) 举例: // 使用文件名称创建流对象 FileOutputStream fos = new FileOutputStream("fos.txt",true); // 字符串转换为字节数组 byte[] b = "abcde".getBytes(); // 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。 fos.write(b); // 关闭资源 fos.close();
写出换行
- Windows:\r\n
- Unix:\n
- Mac:\r
2.4 字节输入流InputStream
读取字节信息到内存
public void close():关闭流释放资源
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并存储到字节数组 b中。
2.5 FileInputStream类
文件输入流,从文件中读取字节
构造方法
FileInputStream(File file) :打开file文件的连接创建一个FileInputStream FileInputStream(String name) : 打开路径名name的连接创建一个FileInputStream 创建一个流对象时,必须传入一个文件路径。该路径下,如果没有文件,会抛出 FileNotFoundException 。
读取字节数据
read() 每次读取一个字节的数据,提升为int,读取到末尾,返回-1. read(byte[] b) 每次读取b.length个字节到数组中,返回有效的字节个数,读取到末尾返回-1 举例: // 使用文件名称创建流对象 FileInputStream fis = new FileInputStream("read.txt"); // 定义变量,保存数据 int b ; // 定义变量,作为有效个数 int len ; // 定义字节数组,作为装字节数据的容器 byte[] b = new byte[2]; // 循环读取 while (( len= fis.read(b))!=‐1) { // 每次读取后,把数组变成字符串打印 System.out.println(new String(b)); } // 循环读取 while ((b = fis.read())!=‐1) { System.out.println((char)b); } // 关闭资源 fis.close();
3 字符流
专门用于处理文本文件
3.1字符输入流Reader
public void close() 关闭流释放资源。 public int read() 从输入流读取一个字符。 public int read(char[] cbuf) 从输入流中读取一些字符,并将它们存储到字符数组 cbuf
3.2FileReader类
读取字符文件,Windows编码:GBK , IDEA中:UTF-8
构造方法
FileReader(File file) : 创建一个 FileReader ,给定要读取的file对象 FileReader(String fileName) : 创建一个 FileReader ,给定要读取的文件的名 举例: // 使用File对象创建流对象 File file = new File("a.txt"); FileReader fr = new FileReader(file); // 使用文件名称创建流对象 FileReader fr = new FileReader("b.txt");
读取字符数组
read方法, 每次读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1 read(char[] cbuf) 每次读取b的长度个字符到数组中,返回读取到的有效字符个数, 读取到末尾返回 -1
3.3字符输出流Writer
void write(int c) 写入单个字符。 void write(char[] cbuf) 写入字符数组。 abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len 写的字符个数。 void write(String str) 写入字符串。 void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个 数。 void flush() 刷新该流的缓冲。 void close() 关闭此流,并刷新它。 ···
3.4FileWriter类
构造方法
FileWriter(File file) : 创建一个FileWriter,给定要读取的File对象。 FileWriter(String fileName) : 创建一个 FileWriter,给定要读取的文件的名称
基本写出数据
write(int b) 方法, 每次可以写出一个字符数据
关闭和刷新
flush :刷新缓冲区,流对象可以继续使用。 close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。 即便是flush方法写出了数据,操作的后还是要调用close方法,释放系统资源。
写出其他数据
write(char[] cbuf) 和 write(char[] cbuf, int off, int len) 每次可以写出字符数组中的数据, write(String str) 和 write(String str, int off, int len) , 每次可以写出字符串中的数据 续写和换行:操作类似于FileOutputStream
4 IO异常的处理
jdk7前处理
// 声明变量 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的处理(了解内容)
try (创建流对象语句,如果多个,使用’;'隔开) {
// 读写数据
} catch (IOException e) {
e.printStackTrace();
}
5 属性集
继承Hashtable表示一个持久的属性集
5.1Properties
构造方法
public Properties() :创建一个空的属性列表。
基本的存储方法
public Object setProperty(String key, String value) : 保存一对属性。 public String getProperty(String key) :使用此属性列表中指定的键搜索属性值。 public Set<String> stringPropertyNames() :所有键的名称的集合。
与流相关的方法
load方法:把硬盘中的文件(键值对),读取到集合 public void load(InputStream inStream) : 字节输入流,不能读取中文 public void load(Reader reader) 字符输入流,可以读取中文
注意
- 存储键值对文件,键与值默认连接符可以使用=,空格(其他字符)
- 存储键值对文件,可以使用#进行注释,被注释的键值对不会再被读取
- 存储键值对的文件,默认都是字符串,不用再加引号
store方法:把集合中的临时数据,持久化写入到硬盘 public void store(OutputStream out, String comments) 字节输出流,不能写中文 public void store(Writer writer, String comments) 字符输出流,可以写中文 comments是注释,不能使用中文,默认Unicode编码格式