流的分类:

  • 按操作数据单位不同分为:字节流、字符流
  • 按数据流的流向不同:输入流、输出流
  • 按流的角色不同分为:节点流、处理流/包装流
抽象基类 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer

FileInputStream:文件输入流

构造方法

  • FileInputStream(File file)该文件通过文件系统中的 File 对象 file 指定。
  • FileInputStream(String path)该文件通过文件系统中的路径名 path 指定。
  • FileInputStream(FileDescriptor fdObj)通过使用文件描述符 fdObj 创建一个 FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。

方法摘要

返回值类型 方法名及形参列表 说明
void close() 关闭此文件输入流并释放与此流有关的所有系统资源。
int read() 从此输入流中读取一个数据字节。
int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个byte数组中。
int read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。

public int read()

  • 返回:
    • 下一个数据字节,如果到达文件末尾则返回 -1
1
2
3
4
5
6
7
8
9
10
public class FileInputStram01 {
public static void main(String[] args) throws Exception{
int read;
InputStream input = null;
input = new FileInputStream("e:\\hello.txt");
while ((read = input.read()) != -1)
System.out.print((char) read);
input.close();
}
}

public int read(byte[] b)

  • 参数:
    • b:存储读取数据的缓冲区
  • 返回:
    • 读入缓冲区的字节总数,如果因为已经到达文件末尾则返回 -1
1
2
3
4
5
6
7
8
9
10
11
public class FileInputStram02 {
public static void main(String[] args) throws Exception{
int readLen = 0;
byte[] buf = new byte[8];
FileInputStream input = null;
input = new FileInputStream("e:\\hello.txt");
while((readLen=input.read(buf)) != -1)
System.out.print(new String(buf,0,readLen));
input.close();
}
}

public int read(byte[] b, int off, int len)

  • 参数:

    • b:存储读取数据的缓冲区

    • off:目标数组 b 中的起始偏移量

    • len:读取的最大字节数

  • 返回:

    • 读入缓冲区的字节总数,如果因为已经到达文件末尾则返回 -1。

FileOutputStream:文件输出流

构造方法

  • FileOutputStream(File file)该文件通过文件系统中的 File 对象 file 指定。
  • FileOutputStream(File file, boolean append)该文件通过文件系统中的 File 对象 file 指定。
  • FileOutputStream(String path)该文件通过文件系统中的路径名 path 指定。
  • FileOutputStream(String path, boolean append)该文件通过文件系统中的路径名 path 指定。
  • FileOutputStream(FileDescriptor fdObj)通过使用文件描述符 fdObj 创建一个 FileOutputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。

方法摘要

返回值类型 方法名及形参列表 说明
void close() 关闭此文件输出流并释放与此流有关的所有系统资源。
void write(int b) 将指定字节写入此文件输出流。
void write(byte[] b) b.length 个字节从指定 byte 数组写入此文件输出流中。
void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
1
2
3
4
5
6
7
8
9
10
11
12
public class FileOutputStream01 {
public static void main(String[] args) throws Exception{
FileOutputStream out = null;
out = new FileOutputStream("e:\\output.txt");
//写入一个字节
out.write('A');
//写入多个字节
String str = new String("Hello World!王勤磊");
out.write(str.getBytes());
out.close();
}
}

文件拷贝

思路分析:

  1. 创建文件的输入流,将文件读入到程序
  2. 创建文件输出流,将读取到的文件数据,写入到指定文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class FileCopy {
public static void main(String[] args) throws Exception {
//将C:\Users\wq3stone\Pictures\tx.jpg拷贝到e:\JavaFileBuf\copy.jpg
// 思路分析:
// 1. 创建文件的输入流,将文件读入到程序
// 2. 创建文件输出流,将读取到的文件数据,写入到指定文件
FileInputStream in = new FileInputStream("C:\\Users\\wq3stone\\Pictures\\tx.jpg");
FileOutputStream out = new FileOutputStream("e:\\JavaFileBuf\\copy.jpg",false);
byte[] buf = new byte[5096];
int readLen = 0;
while((readLen=in.read(buf)) != -1)
out.write(buf,0,readLen);
in.close();
out.close();
}
}

FileReader:字符输入流

构造方法

  • new FileReader(File file)在给定从中读取数据的 File 的情况下创建一个新 FileReader
  • new FileReader(String fileName)在给定从中读取数据的文件名的情况下创建一个新 FileReader

方法摘要

返回值类型 方法名及形参列表 说明
int read() 读取单个字符。
int read(char[] cbuf) 批量读取多个字符到数组,返回读取到的字符数
int read(char[] cbuf, int offset, int length) 将字符读入数组中的某一部分。

相关API:

  • new String(char[])char[]转换成String
  • new String(char[],off,len)char[]指定部分转换成String
错误的读取方式:
1
hello world!wangqinlei王勤磊
1
2
3
4
5
6
7
8
9
public class Reader01 {
public static void main(String[] args) throws Exception {
FileReader file = new FileReader("e:\\JavaFileBuf\\hello.txt");
char c[] = new char[8];
while(file.read(c)!=-1)
System.out.print(new String(c));
}
}
// 输出内容为:hello world!wangqinlei王勤磊inlei王勤

错误分析: 每次均读取缓冲数组char[]中所有内容,存在上次读取后未清除的部分 第一次读取:

0 1 2 3 4 5 6 7
h e l l o w o

第二次读取:

0 1 2 3 4 5 6 7
r l d ! w a n g

第三次读取:

0 1 2 3 4 5 6 7
q i n l e i

第四次读取:

0 1 2 3 4 5 6 7
i n l e i

因此输出结果为:hello world!wangqinlei王勤磊inlei王勤

正确的读取方式
  1. 使用read()逐个字符读取
1
2
3
4
5
6
7
8
public class Reader02 {
public static void main(String[] args) throws Exception {
int data;
FileReader fileReader = new FileReader("e:\\JavaFileBuf\\hello.txt");
while((data=fileReader.read())!=-1)
System.out.print((char)data);
}
}
  1. 使用read(char[] buf)批量读取
1
2
3
4
5
6
7
8
9
10
public class Reader03 {
public static void main(String[] args) throws Exception {
FileReader fileReader = new FileReader("e:\\JavaFileBuf\\hello.txt");
char[] buf = new char[8];
int readLen;
while((readLen=fileReader.read(buf))!=-1)
System.out.print(new String(buf,0,readLen));

}
}

FileWriter:字符输出流

构造方法

  • new FileWriter(File file/String fileName)覆盖模式
  • new FileWriter(File file/String fileName , true)追加模式

方法摘要

返回值类型 方法名及形参列表 说明
void close() 关闭此流,但要先刷新它
void flush() 刷新该流的缓冲。
String getEncoding() 返回此流使用的字符编码的名称
void write(int c) 写入单个字符
void write(char[] cbuf) 写入整个字符数组
void write(char[] cbuf, int off, int len) 写入字符数组的某一部分
void write(String str, int off, int len) 写入字符串的某一部分
void write(String str) 写入整个字符串

相关API:

  • toCharArray可将String转成char[]

FileWriter使用后,必须要关闭(close)或刷新(close),否则写入不到指定文件

1
2
3
4
5
6
7
8
9
10
11
12
public class Writer01 {
public static void main(String[] args) throws Exception{
FileWriter fileWriter = new FileWriter("e:\\JavaFileBuf\\writer.txt");
String str = new String("Java你好123");
fileWriter.write(97); //a
fileWriter.write("你好"); //你好
fileWriter.write(str,0,4); //Java
fileWriter.write(str.toCharArray()); //Java你好123
fileWriter.write(str.toCharArray(),0,5); //Java你
fileWriter.close();
}
}