字符流:
字符流适合做文本文件的操作(读,写)
FileReader:
FileReader:文件字符输入流。
作用:以内存为基准,可以把文件中的数据以字符的形式读入到内存中去。
方法:
构造器 | 说明 |
---|---|
public FileReader(File file) | 创建字符输入流管道与源文件接通 |
public FileReader (String pathname) | 创建字符输入流管道与源文件接通 |
方法名称 | 说明 |
---|---|
public int read() | 每次读取一个字符返回,如果发现没有数据可读会返回-1. |
public int read(char[] buffer) | 每次用一个字符数组去读取数据,返回字符数组读取了多少个字符,如果发现没有数据可读会返回-1. |
package com.itheima.demo00_1字符输入流;
import java.io.FileReader;
import java.io.IOException;
/*
目标: 使用字符流读取字符数据
*/
public class Demo082 {
public static void main(String[] args) throws IOException {
//目标:读取 day10-io\abc\4.txt 文件内容,打印到控制台上
FileReader fr=new FileReader("day10\\abc\\4.txt");
//1.每次读取一个字符
int len=-1;
while((len= fr.read())!=-1){
System.out.println((char)len);
}
System.out.println("--------------");
//2.每次读取多个字符
//输入流没保存,第二次使用输入流无效
char[] chars = new char[2];
while((len=fr.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
fr.close();
}
}
FileWriter:
FileWriter:文件字符输出流。
作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去。
方法:
构造器 | 说明 |
---|---|
public FileWriter(File file) | 创建字节输出流管道与源文件对象接通 |
public FileWriter(String filepath) | 创建字节输出流管道与源文件路径接通 |
public FileWriter(File file,boolean append) | 创建字节输出流管道与源文件对象接通,可追加数据 |
public FileWriter(String filepath,boolean append) | 创建字节输出流管道与源文件路径接通,可追加数据 |
方法名称 | 说明 |
---|---|
void write(int c) | 写一个字符 |
void write(String str) | 写一个字符串 |
void write(String str, int off, int len) | 写一个字符串的一部分 |
void write(char[] cbuf) | 写入一个字符数组 |
void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
package com.itheima.demo00_2字符输出流;
import java.io.FileWriter;
import java.io.IOException;
/*
目标: 使用字符输出流写字符数据到文件
关于换行
Linux换行: \n
MacOS换行: \r
Windows换行: \r\n 为了兼容其他系统 \n, \r
*/
public class Demo091 {
public static void main(String[] args) throws IOException {
// 1.创建文件字符输出流
// FileWriter fw=new FileWriter("day10\\abc\\5.txt");
//末尾追加
FileWriter fw=new FileWriter("day10\\abc\\5.txt",true);
// 2.调用write方法写字符数据到文件
// public void write(char c): 写一个字符到流中
fw.write(97);
fw.write('你');
char[] chs = new char[] {'我', '想', '要', '个', '同', '桌'};
// public void write(char[] cbuf): 写一个字符数组到流中
fw.write("\r\n");
fw.write(chs);
// public void write(char[] cbuf, int off, int len) : 写字符数组的一部分到流中
// char cbuf[]: 字符数组
// int off: 从哪个索引开始写
// int len: 数量
fw.write("\r\n");
fw.write(chs,1,2);
String str = "寒冷的天气使人年轻,冻的像个孙子似的";
// public void write(String str): 写字符串到流中
fw.write("\r\n");
fw.write(str);
// public void write(String str, int off, int len)
// String str: 字符串
// int off: 从哪个索引开始写
// int len: 数量
fw.write("\r\n");
fw.write(str,7,2);
// 3.关闭流
fw.close();
}
}
注意:
字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效。
方法名称 | 说明 |
---|---|
public void flush() throws IOException | 刷新流,就是将内存中缓存的数据立即写到文件中去生效! |
public void close() throws IOException | 关闭流的操作,包含了刷新! |
flush: 刷新缓冲区, 刷新后还能再写
close: 关闭流, 关闭后不能再写 (一定要close)
package com.itheima.demo00_2字符输出流;
import java.io.FileWriter;
import java.io.IOException;
/*
flush: 刷新缓冲区, 刷新后还能再写
close: 关闭流, 关闭后不能再写 (一定要close)
*/
public class Demo092 {
public static void main(String[] args) throws IOException {
// 字节流: 写数据时,字节数据会直接写到文件中, 文件中本质就是字节数据
// FileOutputStream fos = new FileOutputStream("day10-io\\abc\\6.txt");
// fos.write(97);
// 字节流写的是字节数据, 文件底层也是保存字节数据, 字节流不close, 写的数据会直接到文件
// 字符流: 写数据时,字符数据不会直接写到文件中
FileWriter fw = new FileWriter("day10-io\\abc\\7.txt");
fw.write("你好呀,记住我了吗?11");
// 字符流写的是字符数据, 文件底层是保存字节数据, 字符流不close, 写的字符数据不会直接到文件
// fw.flush(); // 刷新 字符流的缓冲区, 让文字保存到文件中(类似文件的保存), flush后还可以再写
fw.close(); // 关闭流, 在关闭之前会自动flush刷新一下,(类似文件的退出) close不能再写
// fw.write("呵呵");
}
}
案例:
案例:
使用键盘输入一个字符串
使用键盘输入源文件名
使用键盘输入目的地文件名
把键盘输入的字符串保存到源文件中
再把源文件的内容复制到目的地文件中
package com.itheima.demo00_2字符输出流;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws IOException {
//创建控制台输入输出对象
Scanner sc = new Scanner(System.in);
// 使用键盘输入一个字符串
String content = sc.next();
// 使用键盘输入源文件名
String sourceFile = sc.next();
// 使用键盘输入目的地文件名
String targetFile = sc.next();
// 把键盘输入的字符串保存到源文件中 (使用文件字符输出流)
FileWriter fw=new FileWriter(sourceFile);
fw.write(content);
fw.close();
// 字符流只能复制文本文件,不能复制视频,音频图片
// 再把源文件的内容复制到目的地文件中 (因为是纯文本使用字符流复制也可以, 推荐看到复制就使用字节流, 文件复制)
FileOutputStream fos=new FileOutputStream(targetFile);
FileInputStream fis=new FileInputStream(sourceFile);
// 循环读写
int len=-1;
while((len=fis.read())!=-1){
fos.write(len);
}
//关闭资源
fis.close();
fos.close();
}
}