Day20-1
1 转换流
1.1 转换输入流和转换输出流
-
OutputStreamWriter:转换输出流,在输出数据时,可以指定编码格式
构造方法:
OutputStreamWriter(OutputStream in, Charset cs) :使用基础的输出流对象,指定以cs 编码格式来写出信息 -
InputStreamReader:转换输入流,在输入数据时,可以指定编码格式
InputStreamReader(InputStream in, Charset cs) :使用基础的输入流对象,指定以cs编码 格式读取信息 -
总结:
如果读取信息:读取的编码,应该和源文件的编码保持一致
如果是写出信息:写出的编码,应该和目标文件编码保持一致
使用的前提:
如果读取的文件或者写出的文件,和当前运行环境编码是不对应的使用转换流 -
特点:
不管是转换输入流还是转换输出流,都是字符流
转换输入流代码
package demos2;
import java.io.*;
public class Demo01 {
public static void main(String[] args) throws IOException {
// FileReader fr = new FileReader("day20/x.txt");
//解决方案:如果运行环境和源文件的格式编码不对应,应该以源文件的编码读取信息
//创建一个转换输入流对象,可以指定编码格式读取信息
//执行的编码:如果需要读取信息,就以源文件格式读取
InputStreamReader isr = new InputStreamReader(new FileInputStream("day20/x.txt"),"gbk");
int i;
while((i = isr.read()) != -1){
System.out.println((char)i);
}
isr.close();
}
}
转换输出流代码
package demos2;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Demo02 {
public static void main(String[] args) throws IOException {
// FileWriter fw = new FileWriter("day20/y.txt");
//问题:目标文件的编码是UTF-8
//解决:就应该执行UTF-8的格式去写出信息
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day20/y.txt"),"utf-8");
osw.write("你好你好");
osw.close();
}
}
2 标准输入流输出流
2.1 标准输入流
- 概述:System.in
(1)该流的类型为InputStream,属于是字节流
(2)默认关联的设备为键盘,即数据源为键盘
(3)通过System.setIn(InputStream in)方法,可以更改标准输入流关联的设备
代码
package demos3;
import java.io.*;
import java.util.Scanner;
public class Demo01 {
public static void main(String[] args) throws IOException {
//创建一个标准字节输入流
// InputStream is = System.in;
// //一次只能读取一个字节
// int i = is.read();
// System.out.println(i);
//将字节输入流,包装为一个字符输入流
// InputStreamReader isr = new InputStreamReader(System.in);
// //将这个字符输入流,包装为一个高效字符输入流
// BufferedReader br = new BufferedReader(isr);
// //读取一行信息
// String str = br.readLine();
// System.out.println(str);
//更改System.in默认读取的位置
//默认从键盘读取,现在更改为从x.txt读取
System.setIn(new FileInputStream("day20/x.txt"));
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(str);
}
}
2.2 标准输出流
- 概述:System.out
(1)该流的类型为PrintStream,其父类为OutputStream是一个字节输出流
(2)默认关联的设备为控制台,即数据目的地为控制台
(3)通过System.setOut(PrintStreamout)方法,可以更改标准输出流关联的设备
代码
package demos3;
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class Demo02 {
public static void main(String[] args) throws FileNotFoundException {
// PrintStream ps = System.out;
// ps.write(97);
// ps.close();
System.setOut(new PrintStream("day20/a.txt"));
PrintStream ps = System.out;
ps.write(97);
ps.close();
}
}
3 打印流
- 打印流介绍:
(1)打印流分为打印字节流和打印字符流:
PrintStream打印字节流 属于字节输出流
PrintWriter打印字符流属于字符输出流
(2)打印流属于输出流。
(3)打印流中在继承各个父类中的write()方法外,还提供了很多重载形式的print()和println()方法(特有的方法)
3.1 打印字节流
- 打印字节流:
PrintStream:是OutPutStream的间接子类,是一个输出流,也是一个字节流 - 构造方法:
函数 | Value |
---|---|
PrintStream(File file) | 创建具有指定文件的新打印流。 |
PrintStream(String fileName) | 创建指定文件路径的新打印流。 |
PrintStream(OutputStream out) | 将一个字节流对象,封装为一个打印流 |
- 常用方法:
(1)从父类中继承的方法:write()
注意:只可以写出一个字节信息
(2)自己特有的方法:print println
不仅可以输出字节信息,还可以输出各种数据类型的信息
比如:整数、小数、字符、字符串、对象 - 注意事项:
(1)如果写出的是一个对象,该对象所属类型重写了toString方法,写出的就是属性值,如果该对象所属类型没有重写,写出的就是一个地址值。
(2)如果写出的数组是一个字符数组,写出的是数组的内容
如果写出的数组是一个其他数组,写出的是数组的地址值
代码
package demos4;
import javax.annotation.processing.Filer;
import java.io.*;
public class Demo01 {
public static void main(String[] args) throws IOException {
//创建一个打印字节输出流
PrintStream ps = new PrintStream("day20/a.txt");
//打印一个字节信息(从父类中继承的方法)
ps.write(97);
//打印各种类型的数据(自己单独的特殊方法)
ps.print(100);
ps.print("abc");
ps.print(new Object());
//在文件中进行换行操作
ps.println(1000);
ps.println("xyz");
ps.println(new char[]{'a','b','c'});
//关流
ps.close();
}
}
3.2 打印字符流
- 打印字节流:
PrintWriter:是Writer的间接子类,是一个输出流,也是一个字符流 - 构造方法:
函数 | Value |
---|---|
PrintWriter (File file) | 创建具有指定文件的新打印流。 |
PrintWriter (String fileName) | 创建指定文件路径的新打印流。 |
PrintWriter(OutputStream out) | 将一个字节流封装为一个打印字符流 |
PrintWriter(Writer out) | 将一个字符流封装为一个打印流 |
PrintWriter(OutputStream out,boolean b) | 将一个字节流封装为一个打印字符流, 可以实现自动刷新功能 |
PrintWriter(Writer out,boolean b) | 将一个字符流封装为一个打印流,可以实现自动刷新功能 |
- 常用方法:
(1)从父类中继承的方法:write()
注意:可以写出一个字符,也可以写出一个字符串
(2)自己特有的方法:print println
代码
package demos4;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class Demo02 {
public static void main(String[] args) throws IOException {
// PrintWriter pw = new PrintWriter("day20/b.txt");
PrintWriter pw = new PrintWriter(new FileWriter("day20/b.txt",true),true);
//从父类继承的方法
pw.write("你好你好");
pw.write('a');
//有自己定义的方法
pw.print(100);
pw.print(100.01);
pw.println(new Person("张三",23));
// pw.close();
}
}