IO流 字节流 字符流 Poperties
IO流顶级父类
字节流
字节输出流OotputStream
java.io.stream抽象类:字节输出流的所有类的超类
共性方法:
public void close()//完成流的操作后必须调用
public void flush()//刷新此输出流并强制任何缓冲的输出字节被写出
public void write(byte[] bytes)//
public void write(byte[], int off, int len)//
public void write(int t)
FileOutputStream类(java.io.FileOutputStream):OutputStream的子类
构造方法:
public FileOutputStream(String name)
public FileOutputStream(File file)
注意:
- 创建输出流对象,都会清空目标文件中的数据
- ** 虽然参数为int类型四个字节,但是只会保留一个字节的信息写出**
数据追加续写:
public FileOutputStream(File file, boolean append)
public FileOutputStream(File file, boolean append)
回车与换行
字节流输入 InputStream(java.io.InputStream:字节输入流的所有类的超类)
共性方法:
public void close()
public abstract int read()
public int read(byte[] b)
FileInputStream类(java.io.FileInputStream): InputStream的子类
构造方法:
FileInputStream(File file)
FileInputStream(String name)
注意:
- 如果没有文件,则抛出FileNotFoundException
- 虽然读取了一个字节,但是会自动提升为int类型
开发中常用的方法:
public class FISRead{
public static void main(String[] args) throws IOException{
FileInputStream fis = new FileInputStream("read.txt");
int len = -1;
byte[] bytes = new byte[1024];
while((len = fis.read(bytes)) != -1){
string s = new String(bytes, 0, len);//最后一行只取len个有效字符
}
fis.close();
}
}
复制等操作时:
流的关闭原则:先开后关,后开先关
字符流
字符输入流 【Reader】: java.io.Reader
共性方法:
public void close()
public int read()
public int read(char[] cbuf)
FileReader类:java.io.FileReader
注意:
- 字符编码:字节与字符对应的规则。
- Windows系统的中文编码默认是GBK编码表
- idea中UTF-8
- 字节缓冲区:一个字节数组,用来临时储存字节数据
- write方法写到缓冲区,不刷新或者不关闭,不会到硬盘文件里
构造方法:
FileReader(File file)
FileReader(String filename)
字符输出流【Writer】:java.io.Writer
共性方法:
void write(int c)
void wtite(char[] cbuf)
abstract void wtite(char[] cbuf, int off, int len)
void wtite(String str)
void wtite(String str, int off, int len)
void flush()
void close()
flush与close的区别:
flush:刷新缓冲区,流对象可以继续使用
close:先刷新,再通知系统释放资源,流对象不能再使用
FileWriter类:java.io.Writer
构造方法:
FileWriter(File file)
FileWriter(String fileName)
字符流与字节流的使用
- 字符流:只能操作文本文件,不能操作图片,视频等非文本文件
- 字节流:单纯读写文本文件时,使用字符流
IO异常处理
jdk7之前
public class Test {
public static void main(String[] args) {
FileWriter fw = null;
try{
fw = new FileWriter("fw.txt");
fw.write("abc");
}catch (IOException e){
e.printStackTrace();
}finally {
try {
if(fw != null){
fw.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
jdk 7 新特性
import java.io.FileWriter;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
// try-with-resource 语句,该语句确保了每个资源在语句结束时关闭
try (FileWriter fw = new FileWriter("fw.txt");){
fw.write("abc");
}catch (IOException e){
e.printStackTrace();
}
}
}
jdk 9新特性
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
final FileReader fr = new FileReader("in.txt");
FileWriter fw = new FileWriter("out.txt");
try (fr; fw) {
int b;
while ((b = fr.read()) != -1) {
fw.write(b);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
属性集
java.util.Properties 继承于 Hashtable ,来表示一个持久的属性集。它使用键值结构存储数据,每个键及其 对应值都是一个字符串
构造方法:
public Properties()
基本存储方法:
public Object setProperty(String key, String value)//保存一对键值对
public String getProperty(String key)//以键找值
public Set<String> stringPorpertyNames()//键集
与流相关的方法:
public void load(InputStream isStream)//从字节流中读取键值对
public void load(Reader reader)//按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)
void store(OutputStream out,String comments)//以适合使用load()方法加载到Peoperties表中的格式,将此Properties表中的属性列表(键和元素对)写入输出流
参数:comments 表示注释信息,一般为“”空字符串
表中行开头加#,那改行被注释不能被load方法读取
void store(Writer writer, String comments)