目录
一. 文件流(节点流)
1.字符流
(1)输入流
(2)输出流
(3)同时使用输入流和输出流对文本文件进行复制
2.字节流
(1)对图片进行复制
二. 缓冲流
1.字符流
2.字节流
三. 转换流
1.字节流 ---> 字符流
2.字符流 ---> 字节流
字节流 (8 bit) | 字符流 (16 bit) | |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
字符流不能用来处理如图片、视频等二进制数据;字节流不能用来处理字符,可能会引起乱码。
对于文本文件通常使用字符流处理,对于图片、视频、音频等非文本文件使用字节流处理。
字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 | |
基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
访问管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
访问字符串 | StringReader | StringWriter | ||
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputStreamWriter | ||
对象流 | ObjectInputStream | ObjectOutputStream | ||
打印流 | PrintStream | PrintWriter | ||
数据流 | DataInputStream | DataOutputStream | ||
FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
一. 文件流(节点流)
除了节点流,其他流都是用来处理节点流的处理流。
1.字符流
(1)输入流
①读入的文件一定要存在,否则会报FileNotFound;
②需要进行异常处理,使用try-catch-finally(IDEA中异常处理的快捷键CTRL+ALT+T和ALT+ENTER);
read():一次读一个字符,返回读入的一个字符,如果达到文件末尾,则返回-1
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class Test{
public static void main(String[] args){
File file = new File("test.txt"); //1.指明要操作的文件
FileReader fileReader = new FileReader(file); //2.提供具体的输入流
int data = fileReader.read(); //3.读入数据。read()方法返回读入的一个字符,如果达到文件末尾,则返回-1
while(data != -1){
System.out.print((char)data);
data = fileReader.read();
}
fileReader.close(); //4.关闭
}
}
以上代码会报错,需要对上面的代码进行异常处理,如下所示:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class Test{
public static void main(String[] args){
FileReader fileReader = null; //2.提供具体的输入流
try {
File file = new File("test.txt"); //1.指明要操作的文件
fileReader = new FileReader(file);
int data = fileReader.read(); //3.读入数据。read()方法返回读入的一个字符,如果达到文件末尾,则返回-1
while(data != -1){
System.out.print((char)data);
data = fileReader.read();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fileReader != null){
try {
fileReader.close(); //4.关闭
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
read(char[]):返回一次读取到数组中字符的个数,在数组中定义一次最多可以读取的数量,最后如果达到文件末尾,则返回-1;
例如:如果定义一次最多可以读取5个字符,则每次读取5个字符,如果最后只剩下了3个字符,则返回3个字符。
import java.io.File;
import java.io.FileReader;
public class Test{
public static void main(String[] args){
File file = new File("test.txt");
FileReader fileReader = new FileReader(file);
char[] cbuf = new char[5];
int len = fileReader.read(cbuf); //记录每次读入到cbuf数组中的字符的个数
while(len != -1){
for(int i = 0; i < len; i++){
System.out.print(cbuf[i]);
}
len = fileReader.read(cbuf);
}
fileReader.close();
}
}
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class Test{
public static void main(String[] args){
FileReader fileReader = null;
try {
File file = new File("test.txt");
fileReader = new FileReader(file);
char[] cbuf = new char[5];
int len = fileReader.read(cbuf); //记录每次读入到cbuf数组中的字符的个数
while(len != -1){
for(int i = 0; i < len; i++){
System.out.print(cbuf[i]);
}
len = fileReader.read(cbuf);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fileReader != null){
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(2)输出流
输出操作对应的文件可以不存在:①如果不存在,会自动创建该文件;②如果存在,调用的构造器是FileWriter(file)或FileWriter(file,flase),则会对原有文件进行覆盖;调用的是FileWriter(file,true),则不会对原文件进行覆盖,而是在原有文件的内容后面追加新输出的数据
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Test{
public static void main(String[] args){
File file = new File("test.txt"); //1.指明写出到的文件名
FileWriter fileWriter = new FileWriter(file); //2.提供具体的输出流
fileWriter.write("Hello"); //3.写出数据
fileWriter.write("World");
fileWriter.close(); //4.关闭
}
}
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Test{
public static void main(String[] args){
FileWriter fileWriter = null; //2.提供具体的输出流
try {
File file = new File("test.txt"); //1.指明写出到的文件名
fileWriter = new FileWriter(file);
fileWriter.write("Hello"); //3.写出数据
fileWriter.write("World");
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fileWriter != null){
try {
fileWriter.close(); //4.关闭
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(3)同时使用输入流和输出流对文本文件进行复制
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
public class Test{
public static void main(String[] args){
File fr = new File("test.txt");
File fw = new File("test1.txt");
FileReader fileReader = new FileReader(fr);
FileWriter fileWriter = new FileWriter(fw);
char[] cbuf = new char[5];
int len = fileReader.read(cbuf); //记录每次读入到cbuf数组中的字符的个数
while(len != -1){
fileWriter.write(cbuf,0,len); //每次写入len个字符
len = fileReader.read(cbuf);
}
fileWriter.close();
fileReader.close();
}
}
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test{
public static void main(String[] args){
FileReader fileReader = null;
FileWriter fileWriter = null;
try {
File fr = new File("test.txt");
File fw = new File("test1.txt");
fileReader = new FileReader(fr);
fileWriter = new FileWriter(fw);
char[] cbuf = new char[5];
int len = fileReader.read(cbuf); //记录每次读入到cbuf数组中的字符的个数
while(len != -1){
fileWriter.write(cbuf,0,len); //每次写入len个字符
len = fileReader.read(cbuf);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fileWriter != null){
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fileReader != null){
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2.字节流
(1)对图片进行复制
使用read(byte[])
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Test{
public static void main(String[] args){
File file1 = new File("test1.jpg");
File file2 = new File("test2.jpg");
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
byte[] buffer = new byte[5];
int len = fis.read(buffer);
while(len != -1){
fos.write(buffer,0,len);
len = fis.read(buffer);
}
fos.close();
fis.close();
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test{
public static void main(String[] args){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
File file1 = new File("test1.jpg");
File file2 = new File("test2.jpg");
fis = new FileInputStream(file1);
fos = new FileOutputStream(file2);
byte[] buffer = new byte[5];
int len = fis.read(buffer);
while(len != -1){
fos.write(buffer,0,len);
len = fis.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
二. 缓冲流
加入缓冲流的作用:提高流的读取和写入的速度
1.字符流
使用read(char[])
import java.io.*;
public class Test{
public static void main(String[] args){
//1.文件
File file1 = new File("test1.txt");
File file2 = new File("test2.txt");
//2.节点流
FileReader fr = new FileReader(file1);
FileWriter fw = new FileWriter(file2);
//3.缓冲流
BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw);
//4.读取和写入
char[] buffer = new char[5];
int len = br.read(buffer);
while(len != -1){
bw.write(buffer,0,len);
len = br.read(buffer);
}
//5.关闭:关外层流(缓冲流)时会自动关闭内层的流(节点流),因此可以只关缓冲流,关闭节点流的操作可以省去
bw.close();
br.close();
}
}
import java.io.*;
public class Test{
public static void main(String[] args){
BufferedReader br = null;
BufferedWriter bw = null;
try {
//1.文件
File file1 = new File("test1.txt");
File file2 = new File("test2.txt");
//2.节点流
FileReader fr = new FileReader(file1);
FileWriter fw = new FileWriter(file2);
//3.缓冲流
br = new BufferedReader(fr);
bw = new BufferedWriter(fw);
//4.读取和写入
char[] buffer = new char[5];
int len = br.read(buffer);
while(len != -1){
bw.write(buffer,0,len);
len = br.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bw != null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
使用readLine():一次读取一行
import java.io.*;
public class Test{
public static void main(String[] args){
BufferedReader br = null;
BufferedWriter bw = null;
try {
//1.文件
File file1 = new File("test1.txt");
File file2 = new File("test2.txt");
//2.节点流
FileReader fr = new FileReader(file1);
FileWriter fw = new FileWriter(file2);
//3.缓冲流
br = new BufferedReader(fr);
bw = new BufferedWriter(fw);
//4.读取和写入
String data = br.readLine();
while(data != null){
bw.write(data);
data = br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bw != null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2.字节流
import java.io.*;
public class Test{
public static void main(String[] args){
//1.文件
File file1 = new File("test1.jpg");
File file2 = new File("test2.jpg");
//2.节点流
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
//3.缓冲流
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
//4.读取和写入
byte[] buffer = new byte[5];
int len = bis.read(buffer);
while(len != -1){
bos.write(buffer,0,len);
len = bis.read(buffer);
}
//5.关闭:关外层流(缓冲流)时会自动关闭内层的流(节点流),因此可以只关缓冲流,关闭节点流的操作可以省去
bos.close();
bis.close();
}
}
import java.io.*;
public class Test{
public static void main(String[] args){
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
//1.文件
File file1 = new File("test1.jpg");
File file2 = new File("test2.jpg");
//2.节点流
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
//3.缓冲流
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//4.读取和写入
byte[] buffer = new byte[5];
int len = bis.read(buffer);
while(len != -1){
bos.write(buffer,0,len);
len = bis.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bos != null){
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bis != null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
三. 转换流
提供字符流与字节流之间的转换;转换流属于字符流
1.字节流 ---> 字符流
InputStreamReader:将一个字节的输入流转换为字符的输入流,相当于将字节解码为字符
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class Test{
public static void main(String[] args){
File file = new File("test.txt");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis); //将字节流按照默认的字符集转换为字符流
//InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
char[] buffer = new char[20];
int len = isr.read(buffer);
while(len != - 1){
String str = new String(buffer,0,len);
System.out.print(str);
len = isr.read(buffer);
}
isr.close();
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test{
public static void main(String[] args){
InputStreamReader isr = null; //将字节流按照默认的字符集转换为字符流
try {
File file = new File("test.txt");
FileInputStream fis = new FileInputStream(file);
isr = new InputStreamReader(fis);
char[] buffer = new char[20];
int len = isr.read(buffer);
while(len != - 1){
String str = new String(buffer,0,len);
System.out.print(str);
len = isr.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(isr != null){
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2.字符流 ---> 字节流
OutputStreamWriter:将一个字符的输出流转换为字节的输出流
import java.io.*;
public class Test{
public static void main(String[] args){
File file1 = new File("test1.txt");
File file2 = new File("test2.txt");
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
InputStreamReader isr = new InputStreamReader(fis);
OutputStreamWriter osw = new OutputStreamWriter(fos);
char[] buffer = new char[20];
int len = isr.read(buffer);
while(len != -1){
osw.write(buffer,0,len);
len = isr.read(buffer);
}
osw.close();
isr.close();
}
}
import java.io.*;
public class Test{
public static void main(String[] args){
InputStreamReader isr = null;
OutputStreamWriter osw = null;
try {
File file1 = new File("test1.txt");
File file2 = new File("test2.txt");
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
isr = new InputStreamReader(fis);
osw = new OutputStreamWriter(fos);
char[] buffer = new char[20];
int len = isr.read(buffer);
while(len != -1){
osw.write(buffer,0,len);
len = isr.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(osw != null){
try {
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(isr != null){
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}