1.FileReader/FileWriter的使用:
1.1 FileReader的使用
说明点:
- read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1
- 异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理
- 读入的文件一定要存在,否则就会报FileNotFoundException。
@Test
public void testFileReader1() {
FileReader fr = null;
try {
//1.File类的实例化
File file = new File("hello.txt");//helloworld123
//2.FileReader流的实例化
fr = new FileReader(file);
//3.读入的操作
//read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1
char[] cbuf = new char[5];
int len;
while((len = fr.read(cbuf)) != -1){
//方式一:
//错误的写法cbuf是每次从头开始覆盖原来的数据,
// for(int i = 0;i < cbuf.length;i++){
// System.out.print(cbuf[i]);//helloworld123ld
// }
//正确的写法
// for (int i = 0; i < len; i++) {
// System.out.print(cbuf[i]);
// }
//方式二:
//错误的写法,对应着方式一的错误的写法
// String str = new String(cbuf);
// System.out.print(str);
//正确的写法
String s = new String(cbuf,0,len);
System.out.print(s);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.资源的关闭
if(fr != null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
1.2 FileWriter的使用
从内存中写出数据到硬盘的文件里。
说明:
- 输出操作,对应的File可以不存在的。并不会报异常
- File对应的硬盘中的文件在,在输出文件如果不存出的过程中,会自动创建此文件。
File对应的硬盘中的文件如果存在:
如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原文件的覆盖
如果流使用的构造器是:FileWriter(file,true):不会对原文件覆盖,而是在原文件基础上追加内容
FileWriter fw = null;
try {
//1.提供File类的对象,指明写出到的文件
File file = new File("hello1.txt");
//2.提供FileWriter的对象,用于数据的写出
fw = new FileWriter(file);
//3.写出的操作
fw.write("I hava a dream!\n");
fw.write("You need to hava a dream!");
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fw != null){
//4.流资源的关闭
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.3 文本文件的复制:
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
//1.创建File类的对象,指明读入和写出的文件
File file1 = new File("day26_IO流\\hello.txt");
File file2 = new File("day26_IO流\\hello1.txt");
//不能使用字符流来处理图片等字节数据
// File file1 = new File("day26_IO流\\灿烈.jpg");
// File file2 = new File("day26_IO流\\灿烈1.jpg");
//2.创建输入流和输出流的对象
fr = new FileReader(file1);
fw = new FileWriter(file2);
//3.数据的读入和写出操作
char[] cbuf = new char[5];
int len;//记录每次读入到cbuf数组中的字符的个数
while ((len = fr.read(cbuf)) != -1) {
//每次写出len个字符
fw.write(cbuf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流资源
//方式一:
// try {
// if(fw != null)
// fw.close();
// } catch (IOException e) {
// e.printStackTrace();
// }finally{
// try {
// if(fr != null)
// fr.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
//方式二:
try {
if (fw != null)
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fr != null)
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.FileInputStream / FileOutputStream的使用:
- 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
- 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,…),使用字节流处理
- 对于字节流将文本文件从一个文件复制到另一个文件而不是在控制台输出,则该操作是可以的,不会出现乱码。但字符流即使是复制图片等非文本文件也是不被允许的。
public class FileInputOutputStreamTest {
/*
实现对图片的复制操作
*/
@Test
public void testFileInputOutputStream() {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
File file1 = new File("灿烈.jpg");
File file2 = new File("灿烈1.jpg");
fis = new FileInputStream(file1);
fos = new FileOutputStream(file2);
//复制的过程
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
System.out.println("复制成功!");
} 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();
}
}
}
}
【注意】