字符流
FileReader()
读取字节
package JAVA.JAVASE.IO流;
import java.io.*;
public class 字符流_test {
public static void main(String[] args) throws IOException {
//需求 通过字符流读取文件
//1.创建字符输入流对象
Reader Reader = new FileReader("F:\\JAVA的学习\\java note\\10.IO流\\test1.txt");为了防止用户给的路径是错误的 这里必须给报异常throws 或者用try catch去处理
//2.读取
// int ch1=Reader.read();//49 因为1的asc码就是49 read()读取的就是第1个字符 1 每次程序调用read都会读取下一个字符
// System.out.println(ch1);
// int ch2=Reader.read();//50 因为2的asc码就是50 read()读取的就是第2个字符 2
// System.out.println(ch2);
// int ch3=Reader.read();//51 因为3的asc码就是51 read()读取的就是第3个字符 3
// System.out.println(ch3);
// int ch4=Reader.read();//-1 文件里就123 读取第四次的时候没有读取到就会返回-1
// System.out.println(ch4);
//优化上述的读法 用循环改进 不知道循环次数 使用while循环
// int ch;//用来接收读取到的字符
// while (Reader.read()!=-1){//因为Reader.read()这个方法会直接读取 如果用来判断 他会直接读取完成 方法中的Reader.read()已经是第二次读取了
// ch=Reader.read();
// System.out.println(ch);
// }
//应该这样写
int ch;//用来接收读取到的字符
while ((ch=Reader.read())!=-1){//直接把ch在条件里赋值 这样的话 就不会每次跳过一个了 同时当读取到-1的时候就不会进入循环也不会打印那个-1
System.out.println(ch);
}
//3.释放资源
Reader.close();
}
}
读取字节数组
FileWriter()
写字节和数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJPUEqwR-1597561475502)(F:\JAVA的学习\java note\图片\image-20200722154103362.png)]
package JAVA.JAVASE.IO流.字符流;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriter_test1 {
public static void main(String[] args) throws IOException {
//1.创建字符输出流对象
FileWriter fileWriter = new FileWriter("F:\\JAVA的学习\\java note\\10.IO流\\test1.txt");
//2.写入
char[] chs = {'A','B','C','D','E','F','G',};
fileWriter.write(chs);//字符数组全部写入
fileWriter.write(chs,0,2);//字符数组下标从0开始 写2个
fileWriter.write("ABCDEFG");//字符串写入
fileWriter.write('A');//字符写入
//3.释放资源
fileWriter.close();
}
}
FileReader()和FileWriter()字符读写
IO流拷贝文件核心6步
- 创建字符输入流对象 关联数据源文件
- 创建字符输出流对象 关联目的地文件
- 定义变量 记录读取到的内容
- 循环读数 直到结束
- 把读取到的写入目的地文件中
- 释放资源
package JAVA.JAVASE.IO流.字符流;
import java.io.*;
public class FileReaderandFileWriter_test {
public static void main(String[] args) throws IOException {
//通过字符流拷贝文件 一次读写一个字符
//将test1.txt内容复制到test2.txt内
// 1. 创建字符输入流对象 关联数据源文件
FileReader fileReader = new FileReader("F:\\JAVA的学习\\java note\\10.IO流\\test1.txt");
// 2. 创建字符输出流对象 关联目的地文件
FileWriter fileWriter = new FileWriter("F:\\JAVA的学习\\java note\\10.IO流\\test2.txt");
// 3. 定义变量 记录读取到的内容
int ch;
// 4. 循环读数 直到结束
while ((ch=fileReader.read())!=-1){//fileReader.read()在括号内写入字符数组 返回的才是长度 fileReader.read()不写直接返回读到的数据
// 5. 把读取到的写入目的地文件中
fileWriter.write(ch);
}
// 6. 释放资源
fileWriter.close();
fileReader.close();
}
}
FileReader()和FileWriter()字符数组读写
package JAVA.JAVASE.IO流.字符流;
import java.io.FileReader;
import java.io.IOException;
import java.io.*;
public class FileReaderandFileWriter_test2 {
public static void main(String[] args) throws IOException {
//通过字符流拷贝文件 一次读写一个字符
//将test1.txt内容复制到test2.txt内
// 1. 创建字符输入流对象 关联数据源文件
FileReader fileReader = new FileReader("F:\\JAVA的学习\\java note\\10.IO流\\test1.txt");
// 2. 创建字符输出流对象 关联目的地文件
FileWriter fileWriter = new FileWriter("F:\\JAVA的学习\\java note\\10.IO流\\test2.txt");
// 3. 定义变量 记录读取到的内容
char[] chs = new char[2048];
int len;
// 4. 循环读数 直到结束
while ((len=fileReader.read(chs))>0){//fileReader.read()在括号内写入字符数组 返回的才是长度 fileReader.read()不写直接返回读到的数据
// 5. 把读取到的写入目的地文件中
fileWriter.write(chs,0,len);
}
// 6. 释放资源
fileWriter.close();
fileReader.close();
}
}
BufferReader()和BufferWriter()读写
IO流拷贝文件核心6步
- 创建字符缓冲输入流对象 关联数据源文件
- 创建字符缓冲输出流对象 关联目的地文件
- 定义变量 记录读取到的内容
- 循环读数 直到结束
- 把读取到的写入目的地文件中
- 释放资源
这个方法在底层实现其实还是按照数组 一次是16kb的读写 和上面的数组读写差不多 但是这个已经帮你规定了一次数组的大小
这个数组相当于缓冲区
package JAVA.JAVASE.IO流.字符流;
import java.io.*;
public class BufferReaderAndBufferWriter_test1 {
public static void main(String[] args) throws IOException {
//通过字符流拷贝文件 一次读写一个字符
//将test1.txt内容复制到test2.txt内
// 1. 创建字符缓冲输入流对象 关联数据源文件 里面需要放入new FileReader() 作为构造方法
BufferedReader br = new BufferedReader(new FileReader("F:\\JAVA的学习\\java note\\10.IO流\\test1.txt"));
// 2. 创建字符缓冲输出流对象 关联目的地文件 里面需要放入new FileWriter() 作为构造方法
BufferedWriter bw = new BufferedWriter(new FileWriter("F:\\JAVA的学习\\java note\\10.IO流\\test2.txt"));
// 3. 定义变量 记录读取到的内容
int ch;
// 4. 循环读数 直到结束
while ((ch=br.read())!=-1){//fileReader.read()在括号内写入字符数组 返回的才是长度 fileReader.read()不写直接返回读到的数据
// 5. 把读取到的写入目的地文件中
bw.write(ch);
}
// 6. 释放资源
br.close();
bw.close();
}
}
BufferReader()和BufferWriter()读写一行
注意:字符流只能拷贝纯文本文件 比如不能拷贝图片文件 这个时候就必须使用字节流
package JAVA.JAVASE.IO流.字符流;
import java.io.*;
public class BufferReaderAndBufferWriter_test2 {
public static void main(String[] args) throws IOException {
//通过字符流拷贝文件 一次读写一个字符
//将test1.txt内容复制到test2.txt内
// 1. 创建字符缓冲输入流对象 关联数据源文件 里面需要放入new FileReader() 作为构造方法
BufferedReader br = new BufferedReader(new FileReader("F:\\JAVA的学习\\java note\\10.IO流\\test1.txt"));
// 2. 创建字符缓冲输出流对象 关联目的地文件 里面需要放入new FileWriter() 作为构造方法
BufferedWriter bw = new BufferedWriter(new FileWriter("F:\\JAVA的学习\\java note\\10.IO流\\test2.txt"));
// 3. 定义变量 记录读取到的内容
String str;
// 4. 循环读数 直到结束
while ((str = br.readLine()) != null) {//br.readLine()可以读取到一行的字符串 读不到的时候返回的是null 不是-1
//5. 把读取到的写入目的地文件中
//注意一个细节 直接写 bw.write(str) 会让复制的字符串少了回车
//千万别忘记换行 windows系统中换行是/n /r linux系统 /n mac系统/r
bw.newLine();//所以java才写了一个newLine() 来根据当前系统给出对应的换行符
bw.write(str);
}
// 6. 释放资源
br.close();
bw.close();
}
}