节点流,或称文件流,是指直接连接程序与本地文件/网络数据的流,用于在程序直接操作数据。节点流包括:FileReader、FileWriter、FileInputStream和FileOutputStream。
字符流:FileReader和FileWriter:
FileReader的常用方法:
1、int read():返回的是字符对应的int类型的ASCII码,要在控制台打印的话强制转换为char,如果读到文件末尾了,返回值为-1;
2、int read(char [] data):返回的是读取到的字符个数,读取到的字符存储在了data数组中,可以遍历输出,但是要注意遍历的次数要与该方法的返回值相等,否则最后打印的结果会有问题;
3、int read(char [] c, int off, int len):返回的是读取到的字符个数,将读取到的字符从off位置开始的len个字符存储在了data数组中,可以遍历输出,但是要注意遍历的次数要与该方法的返回值相等,否则最后打印的结果会有问题;
4、public void close() throws IOException:JVM不会自动关闭流的连接,所以一定要要注意关闭资源!
FileWriter的常用方法:
1、void write(int c) 写入单个字符;
2、void write(char[] cbuf) 写入字符数组;
3、void write(char[] cbuf,int off,int len) 写入字符数组的某一部分。从off开始,写入len个字符;
4、 void write(String str) 写入字符串;
5、void write(String str,int off,int len) 写入字符串的某一部分;
6、public void close() throws IOException:JVM不会自动关闭流的连接,所以一定要要注意关闭资源!
7、FileWriter(File file, boolean flag):flag如果不传参或传false则为覆盖,如果传true则为追加。
例:拷贝文本文件
测试文件,本项目下的“Hello.txt”:
张伟:123...
You have no ball!
测试类:
package cn.jingpengchong.io;
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) {
//1、创建File类对象
File srcfile = new File("Hello.txt");
File desfile = new File("Hello-copy.txt");
//2、创建FileReader/FileWriter类对象
FileReader reader = null;
FileWriter writer = null;
try {
reader = new FileReader(srcfile);
writer = new FileWriter(desfile);
char[] data = new char[5]; //指定一次读取多少个字符
//3、读入与写出操作
int read = reader.read(data);
while (read != -1){
writer.write(data,0,read);
//在控制台查看
for (int i = 0; i < read; i++) {
System.out.print(data[i]);
}
read = reader.read(data);
}
System.out.println("\n复制成功!!!");
} catch (Exception e) {
e.printStackTrace();
} finally {
//4、关闭资源
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(writer != null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果如下:
本项目下的出现“Hello-copy.txt”文件:
字节流:FileInputStream和FileOutputStream:
FileInputStream的常用方法:
1、int read():从输入流中读取数据的下一个字节。如果因为已经到达流末尾而没有可用的字节,则返回值 -1;
2、int read(byte[] data):从此输入流中将最多 data.length 个字节的数据读入一个 byte 数组中。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。否则以整数形式返回实际读取的字节数;
3、int read(byte[] c, int off, int len):将输入流中最多len个数据字节读入 byte 数组,如果因为已经到达流末尾而没有可用的字节,则返回值 -1。否则以整数形式返回实际读取的字节数;
4、public void close() throws IOException:JVM不会自动关闭流的连接,所以一定要要注意关闭资源!
FileOutputStream的常用方法:
1、void write(int b) 写入单个字节;
2、void write(byte[] cbuf) 写入字节数组;
3、void write(byte[] cbuf,int off,int len) 写入字节数组的某一部分。从off开始,写入len个字节;
4、public void close() throws IOException:JVM不会自动关闭流的连接,所以一定要要注意关闭资源!
例:拷贝桌面上的“01-视频.avi”视频文件到“02-视频.avi”,并计时
package cn.jingpengchong.io;
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) {
//1、创建File类对象
File srcfile = new File("C:\\Users\\lenovo\\Desktop\\01-视频.avi");
File desfile = new File("C:\\Users\\lenovo\\Desktop\\02-视频.avi");
//2、创建FileReader/FileWriter类对象
FileInputStream reader = null;
FileOutputStream writer = null;
try {
reader = new FileInputStream(srcfile);
writer = new FileOutputStream(desfile);
byte[] data = new byte[1024];
//3、读入与写出操作
long start = System.currentTimeMillis();
int read = reader.read(data);
while (read != -1){
writer.write(data,0,read);
read = reader.read(data);
}
long end = System.currentTimeMillis();
System.out.println("复制成功!!!用时(毫秒):"+(end-start));
} catch (Exception e) {
e.printStackTrace();
} finally {
//4、关闭资源
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(writer != null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果如下: