目录
1、字符流
1.1、字符输入流:Reader
文件字符输入流:FileReader
作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去
构造器 | 说明 |
public FileReader(File file) | 创建字符输入流管道与源文件对象接通 |
public FileReader(String pathname) | 创建字符输入流管道与源文件路径接通 |
方法名称 | 说明 |
public int read() | 每次读取一个字符返回,如果字符已经没有可读的返回-1 |
public int read(char[] buffer) | 每次读取一个字符数组,返回读取的字符个数, 如果字符已经没有可读的返回-1 |
一次读取一个字符:读取中文字符不会出现乱码(如果代码文件编码一致),性能较慢
package com.itwpf.d03_stream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Arrays;
public class FileReaderDemo1 {
public static void main(String[] args) throws IOException {
Reader reader = new FileReader(new File("day05_file\\src\\main\\java\\data.txt"));
int len ;
while((len = reader.read())!=-1){
System.out.print((char)len);
}
}
}
一次读取一个字符数组:读取的性能得到了提升,读取中文字符输出不会乱码。
package com.itwpf.d03_stream;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Arrays;
public class FileReaderDemo1 {
public static void main(String[] args) throws IOException {
//创建一个字符输入流管道与源文件接通
Reader reader = new FileReader("day05_file\\src\\main\\java\\data.txt");
char []code = new char[1024];
int len ;
//使用循环读取字符
while((len = reader.read(code))!=-1){
//解码
String s = new String(code,0,len);
//输出
System.out.print(s);
}
}
}
1.2、字符输出流:Writer
文件字符输出流:FileWriter
作用:以内存为基准,把内存中的数据以字符的形式写出到磁盘文件中去的流。
构造器 | 说明 |
public FileWriter(File file) | 创建字符输出流管道与源文件对象接通 |
public FileWriter(File file,boolean append) | 创建字符输出流管道与源文件对象接通, 可追加数据 |
public FileWriter(String filepath) | 创建字符输出流管道与源文件路径接通 |
public FileWriter(String filepath,boolean append) | 创建字符输出流管道与源文件路径接通, 可追加数据 |
文件字符输出流(FileWriter)写数据出去的API
方法名称 | 说明 |
void write(int c) | 写一个字符 |
void write(char[] cbuf) | 写入一个字符数组 |
void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
void write(String str) | 写一个字符串 |
void write(String str, int off, int len) | 写一个字符串的一部分 |
流的关闭与刷新
方法 | 说明 |
flush() | 刷新流,还可以继续写数据 |
close() | 关闭流,释放资源,但是在关闭之前会先刷新流。 一旦关闭,就不能再写数据 |
package com.itwpf.d03_stream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class FileWriterDemo1 {
public static void main(String[] args) throws IOException {
//1、创建一个字符输出流管道与目标文件接通,覆盖通道,每次启动都会清空文件之前的数据
Writer fileWriter = new FileWriter("day05_file\\src\\main\\java\\data03.txt");
//2.写数据
fileWriter.write("adv");
//3.刷新
fileWriter.flush();
//4.关闭
fileWriter.close();
}
}
字符输出流如何实现写出去的数据能换行
fw.write("\r\n");
字节流、字符流的使用场景总结:
字节流适合做一切文件数据的拷贝(音视频,文本)
字节流不适合读取中文内容输出
字符流适合做文本文件的操作(读,写)
2、缓冲流
2.1、概述
缓冲流概述:
缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流
作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能
字节缓冲流性能优化原理:
字节缓冲输入流自带了8KB缓冲池,以后我们直接从缓冲池读取数据,所以性能较好。
字节缓冲输出流自带了8KB缓冲池,数据就直接写入到缓冲池中去,写数据性能极高了。
字节缓冲流
字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能。
字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能。
构造器 | 说明 |
public BufferedInputStream(InputStream is) | 可以把低级的字节输入流包装成一个高级的缓冲字节 输入流管道,从而提高字节输入流读数据的性能 |
public BufferedOutputStream(OutputStream os) | 可以把低级的字节输出流包装成一个高级的缓冲字节 输出流,从而提高写数据的性能 |
2.2、字节缓冲流的使用
package com.itwpf.d04_BufferedInputOutputStream;
import java.io.*;
public class ByteBufferDemo {
public static void main(String[] args) {
try(
InputStream inputStream = new FileInputStream("D:\\log4j\\00\\01.mp4");
OutputStream outputStream = new FileOutputStream(new File("D:\\log4j\\01\\04.mp4"));
InputStream bufferinputStream = new BufferedInputStream(inputStream);
OutputStream bufferoutputStream = new BufferedOutputStream(outputStream);
){
byte []bytes= new byte[1024];
int len;
while((len = bufferinputStream.read(bytes))!=-1){
bufferoutputStream.write(bytes,0,len);
bufferoutputStream.flush();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
2.3、字符缓冲流的使用
字符缓冲输入流
字符缓冲输入流:BufferedReader。
作用:提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能。
构造器 | 说明 |
public BufferedReader(Reader r) | 可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能 |
字符缓冲输入流新增功能
方法 | 说明 |
public String readLine() | 读取一行数据返回,如果读取没有完毕, 无行可读返回null |
字符缓冲输出流
字符缓冲输出流:BufferedWriter。
作用:提高字符输出流写取数据的性能,除此之外多了换行功能
构造器 | 说明 |
public BufferedWriter(Writer w) | 可以把低级的字符输出流包装成一个高级的 缓冲字符输出流管道,从而提高字符输出流写数据的性能 |
字符缓冲输出流新增功能
方法 | 说明 |
public void newLine() | 换行操作 |
package com.itwpf.d04_BufferedInputOutputStream;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;
public class BufferReaderDemo1 {
public static void main(String[] args) {
try(
Reader rd = new FileReader("day05_file\\src\\main\\java\\data.txt");
BufferedReader br = new BufferedReader(rd);
){
String s;
while((s = br.readLine())!=null){
System.out.println(s);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
package com.itwpf.d04_BufferedInputOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.*;
import java.util.stream.Stream;
public class BufferReaderDemo2 {
public static void main(String[] args) {
try(
BufferedReader br = new BufferedReader(new FileReader("day05_file\\src\\main\\java\\data03.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("D:/log4j/01/01.txt"));
){
String s;
Map<Integer,String> map = new TreeMap<>();
while((s=br.readLine())!=null){
String s2 = s.split(" ")[0];
int n = Integer.parseInt(s2);
map.put(n,s);
}
int size = map.size();
for (String value:map.values()) {
bw.write(value);
bw.newLine();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
3、转换流
字符输入转换流
字符输入转换流:InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流。
构造器 | 说明 |
public InputStreamReader(InputStream is) | 可以把原始的字节流按照代码默认 编码转换成字符输入流。几乎不用, 与默认的FileReader一样。 |
public InputStreamReader(InputStream is ,String charset) | 可以把原始的字节流按照指定 编码转换成字符输入流, 这样字符流中的字符就不乱码了(重点) |
package com.itwpf.d04_BufferedInputOutputStream;
import java.io.*;
public class InputStreamReaderDemo1 {
public static void main(String[] args) {
try(
Reader reader = new InputStreamReader(new FileInputStream("D:\\log4j\\01\\02.txt"),"GBK");
BufferedReader fr = new BufferedReader(reader);
){
String line;
while((line=fr.readLine())!=null){
System.out.println(line);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
字符输出转换流
字符输入转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流。
构造器 | 说明 |
public OutputStreamWriter(OutputStream os) | 可以把原始的字节输出流按照代码 默认编码转换成字符输出流。几乎不用。 |
public OutputStreamWriter(OutputStream os,String charset) | 可以把原始的字节输出流按照 指定编码转换成字符输出流(重点) |
package com.itwpf.d04_BufferedInputOutputStream;
import java.io.*;
public class OutputStreamWriterDemo1 {
public static void main(String[] args) {
try(
OutputStream outputStream = new FileOutputStream("day05_file\\src\\main\\java\\data11.txt");
Writer writer = new OutputStreamWriter(outputStream,"GBK");
BufferedWriter bufferedOutputStream = new BufferedWriter(writer);
){
bufferedOutputStream.write("1 public class CharacterDemo {\n" +
"2 public static void main(String[] args) {\n" +
"3 // 创建对象\n" +
"4 // Character ch = new Character((char) 97);\n" +
"5 Character ch = new Character('a');\n" +
"6 System.out.println(\"ch:\" + ch);\n" +
"7 }\n" +
"8 }");
}catch(Exception e){
e.printStackTrace();
}
}
}
4、序列化对象
4.1、对象序列化
对象序列化:
作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。
使用到的流是对象字节输出流:ObjectOutputStream
构造器 | 说明 |
public ObjectOutputStream(OutputStream out) | 把低级字节输出流包装成高级的对象字节输出流 |
ObjectOutputStream序列化方法
方法名称 | 说明 |
public final void writeObject(Object obj) | 把对象写出去到对象序列化流的文件中去 |
创建Student对象(对象必须实现Serializable接口)
package com.itwpf.d04_BufferedInputOutputStream;
import java.io.Serializable;
public class Student implements Serializable {
private String name;
private String loginName;
private String password;
private int age;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", loginName='" + loginName + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, String loginName, String password, int age) {
this.name = name;
this.loginName = loginName;
this.password = password;
this.age = age;
}
public Student() {
}
}
package com.itwpf.d04_BufferedInputOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class ObjectOutputStreamDemo1 {
public static void main(String[] args) throws Exception {
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("day05_file\\src\\main\\java\\data12.txt"));
Student s = new Student("张三","zhangsan","123456",20);
os.writeObject(s);
os.close();
}
}
4.2、对象反序列化
对象反序列化:
使用到的流是对象字节输入流:ObjectInputStream
作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化。
构造器 | 说明 |
public ObjectInputStream(InputStream out) | 把低级字节输如流包装成高级的对象 字节输入流 |
ObjectInputStream序列化方法
方法名称 | 说明 |
public Object readObject() | 把存储到磁盘文件中去的对象数据恢复成 内存中的对象返回 |
package com.itwpf.d04_BufferedInputOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.ObjectInputStream;
public class ObjectInputStreamDemo2 {
public static void main(String[] args) throws Exception {
ObjectInputStream os = new ObjectInputStream(new FileInputStream("day05_file\\src\\main\\java\\data12.txt"));
Object o = os.readObject();
System.out.println(o.toString());
}
}
5、打印流
打印流
作用:打印流可以实现方便、高效的打印数据到文件中去。
打印流一般是指:PrintStream,PrintWriter两个类。
可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印boolean的true,写出去就是true。
PrintStream
构造器 | 说明 |
public PrintStream(OutputStream os) | 打印流直接通向字节输出流管道 |
public PrintStream(File f) | 打印流直接通向文件对象 |
public PrintStream(String filepath) | 打印流直接通向文件路径 |
方法 | 说明 |
public void print(Xxx xx) | 打印任意类型的数据出去 |
PrintWriter
构造器 | 说明 |
public PrintWriter(OutputStream os) | 打印流直接通向字节输出流管道 |
public PrintWriter (Writer w) | 打印流直接通向字符输出流管道 |
public PrintWriter (File f) | 打印流直接通向文件对象 |
public PrintWriter (String filepath) | 打印流直接通向文件路径 |
方法 | 说明 |
public void print(Xxx xx) | 打印任意类型的数据出去 |
package com.itwpf.d05_printStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class PrintDemo1 {
public static void main(String[] args) throws Exception {
PrintStream ps = new PrintStream(new FileOutputStream("day05_file\\src\\main\\java\\data02.txt",false),false,"UTF-8");
ps.println("你好世界");
ps.close();
}
}
PrintStream和PrintWriter的区别
打印数据功能上是一模一样的,都是使用方便,性能高效(核心优势)
PrintStream继承自字节输出流OutputStream,支持写字节数据的方法。
PrintWriter继承自字符输出流Writer,支持写字符数据出去。
输出语句重定向
属于打印流的一种应用,可以把输出语句的打印位置改到文件。
PrintStream ps = new PrintStream("文件地址")
System.setOut(ps);
package com.itwpf.d05_printStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class PrintDemo2 {
public static void main(String[] args) throws Exception {
System.out.println("你好世界123456");
PrintStream ps = new PrintStream("day05_file\\src\\main\\java\\data02.txt");
System.setOut(ps);
System.out.println("shijian123456");
}
}
控制台输出:
你好世界123456
文件day05_file\\src\\main\\java\\data02.txt中出现:
shijian123456