一、字符缓冲流
字节缓冲流在源代码中内置了字符数组,可以提高读写效率
构造方法 | 说明 |
BufferedReader(Reader reader) | 对传入的字符输入流进行包装 |
BufferedWriter(Writer writer) | 对传入的字符输出流进行包装 |
注意:瑷冲流不具备读写功能,它们只是对普通的流对象进行包装真正和文件建立关联的,还是普通的流对象
1.基本字符使用方法
private static void bufferText1() throws IOException {
//创建字符的输入流
BufferedReader br = new BufferedReader(new FileReader("D:\\java\\javaStudy\\javaStudy\\day14\\A.txt"));
//创建字符的输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java\\javaStudy\\javaStudy\\day14\\B.txt"));
int i;
while ((i=br.read())!=-1){
bw.write(i);
}
br.close();
bw.close();
}
2. .字符缓冲流 + 字符数组
//buffered 字符缓冲流+字符数组
private static void bufferText2() throws IOException {
//创建字符的输入流
BufferedReader br = new BufferedReader(new FileReader("D:\\java\\javaStudy\\javaStudy\\day14\\A.txt"));
//创建字符的输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java\\javaStudy\\javaStudy\\day14\\B.txt"));
char[] chs = new char[1024];
int l;
while ((l=br.read(chs)) != -1){
bw.write(chs,0,l);
}
br.close();
bw.close();
}
3.字符流的两个特有方法
成员方法 | 说明 |
public String readLine() | BufferedReader,读取一行字符串,读取到末尾返回null |
public String newLine() | BuferedWriter,写出换行符(具有跨平台性) |
private static void bufferedText3() throws IOException {
//创建字符的输入流
BufferedReader br = new BufferedReader(new FileReader("D:\\java\\javaStudy\\javaStudy\\day14\\A.txt"));
//创建字符的输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java\\javaStudy\\javaStudy\\day14\\B.txt"));
String c;
while ((c= br.readLine()) != null){
bw.write(c);
//bw.write("\r\n");这个只在window系统下好用
bw.newLine();
}
br.close();
bw.close();
}
二、转换流
作用:1.按照指定的字符编码读写操作
成员方法 | 说明 |
InputStreamReader(InputStream in,String charsetName) | 按照指定的字符编码读取 |
OutputStreamWreiter(OutputStream in,String charsetName) | 按照指定的字符编码写出 |
private static void writeText() throws IOException {//写入
//FileOutputStream里面的第二个参数是开启继续写入的开关,不舍为true将会清空原有内容
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\java\\javaStudy\\javaStudy\\day14\\B.txt",true), "GBK");
osw.write("你是谁");
osw.close();
}
private static void readText() throws IOException {//读取
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\java\\javaStudy\\javaStudy\\day14\\B.txt"),"GBK");
int item;
while ((item = isr.read())!=-1){
System.out.println((char) item);
}
isr.close();
}
2.将字节流转换为字符流进行操作
三、序列化流
可以在流中,以字节的形式直接读写对象。
构造方法 | 说明 |
public ObjectInputStream(InputStream in) | 对象输入流关联文件,关联方式使用字节输入流 |
public ObjectOutputStream(OutputStream in) | 对象输出流关联文件,关联方式使用字节输出流 |
成员方法 | 说明 |
Object readObject() | 从流中读取对象(反序列化) |
void writeObject(Object obj) | 在流中将对象写出(序列化) |
//输出流
private static void objectWrite() throws IOException {
//这个Student类要实现一个接口Serializable,这个接口中没有方法,是一个标记类
Student stu = new Student("张三",23);
ObjectOutputStream ois = new ObjectOutputStream(new FileOutputStream("D:\\java\\javaStudy\\javaStudy\\day14\\C.txt"));
ois.writeObject(stu);
ois.close();
}
//输入流
private static void objectRead() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\java\\javaStudy\\javaStudy\\day14\\C.txt"));
final Object o = ois.readObject();
System.out.println(o);
ois.close();
}
注意:
1.类中的关键字被transient(顺态关键字)修饰之后就不会被序列化了
例子:private transient int age
2.类在实现 Serializable 接口的时候会在写出的时候随机生成一个serialVersionUID一起写出,如果不设置在修改类之后在进行读取的时候就会报错,这个serialVersionUID值在文件上和类上的不一致了,可以自己手动设置“private static final long serialVersionUID = XXXL”,可以在IDEA中的设置,然后通过Alt + Enter建去添加,在IDEA中设置步骤如下:
setting->Inspections->Serialization issues,将serialzable class without "serialVersionUID"打上勾;但是,有些版本Serialization issues中没有serialzable class without "serialVersionUID"
它只是换了地方,直接在Inspections中搜索serialVersionUID,可以看到
四、打印流
1.打印流可以实现方便、高效的打印数据到文件中去,并且可以指定字符编码
2.可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97
PrintStream:
构造器 | 说明 |
public PrintSteam(OutputStream os) | 打印流直接通向字节输出流管道,想要追加写入的时候用这个,在new FileOutputStream的时候开启追加写入 |
public PrintStream(File f,String csn) | 打印流直接通向文件对象 |
public PrintStream(String filepath,String csn) | 打印流直接通向文件路径 |
方法 | 说明 |
public void print\println(Xxxx xx) | 打印任意类型的数据出去(原样写出) |
private static void printOutText1() throws FileNotFoundException {
//可以传第二个参数,字符串后面逗号分割指定写入格式,例如“gbk”
//PrintStream ps = new PrintStream("D:\\java\\javaStudy\\javaStudy\\day14\\D.txt","gbk");
PrintStream ps = new PrintStream("D:\\java\\javaStudy\\javaStudy\\day14\\D.txt");
//ps.write(98); 不建议,因为不能原样写出
ps.println("222");//println带有换行的写出
ps.print("222");//println不带有换行的写出
ps.close();
}
PrintWriter 字符打印流: (用法与上面的PrintStream类似)
构造器 | 说明 |
public PrintWriter(OutputStream os) | 打印流直接通向字节输出流管道 |
public PrintWriter(Writer w) | 打印流直接通向字符输出流管道 |
public PrintWriter(File f,String csn) | 打印流直接通向文件对象 |
public PrintWriter(String filepath,String csn) | 打印流直接通向文件路径 |
方法 | 说明 |
public void print\println(Xxxx xx) | 打印任意类型的数据出去(原样写出) |
五、Properties 集合
Properties类表示一组持久的属性,Properties可以保存到流中加载,属性列表中的每个键及其对应的值都是一个字符串。
1.其实就是一个Map集合
2.内部存在着两个方法,可以很方便的将集合中的键值对写入文件,也可以方便的从文件中读取
3.常用于加载配置文件
Properties 作为集合的使用
构造方法:Properties() 创建一个没有默认值的空属性列表。
方法 | 说明 |
Object setProperty(String key,String value) | 添加(修改)一个键值对,类似Map集合的put方法 |
String getProperty(String key) | 根据键获取值,类似Map集合的get方法 |
Set<String> stringPropertyName() | 获取集合中所有的键,类似Map集合的keyGet方法 |
private static void proMapText() {
Properties pro = new Properties();
pro.setProperty("uersName","admin");
pro.setProperty("passWord","123123");
System.out.println(pro.getProperty("uersName"));
System.out.println(pro.getProperty("passWord"));
final Set<String> proKeyList = pro.stringPropertyNames();
for (String key : proKeyList) {
System.out.println(key+":"+pro.getProperty(key));
}
System.out.println(pro);
}
Properties 和 IO有关的方法
方法 | 说明 |
void load(InputStream inStream) | 从流中加载数据到集合(字节流) |
void load(Reader reader) | 从流中加载数据到集合(字符流) |
viod store(OutputStream out, String comments) | 将集合的键值对写出到文件(字节流) |
void store(Writer writer,String comments) | 将集合的键值对写出到文件(字符流) |
private static void proIoRead() throws IOException {
Properties pro = new Properties();
FileInputStream fis = new FileInputStream("D:\\java\\javaStudy\\javaStudy\\day14\\config.properties");
pro.load(fis);
fis.close();
System.out.println(pro);
}
private static void proIoText() throws IOException {
Properties pro = new Properties();
pro.setProperty("uersName","admin");
pro.setProperty("passWord","123123");
//字节流
FileOutputStream fos = new FileOutputStream("D:\\java\\javaStudy\\javaStudy\\day14\\config.properties");
//字符输出流
FileWriter fw = new FileWriter("D:\\java\\javaStudy\\javaStudy\\day14\\config.properties");
pro.store(fw,"wo");//第二个参数是注释,是String类型
fos.close();
}