字节流:适合复制文件,不适合读写文本文件
字符流:适合读写文本文件内容


- 字节(Byte):
字节是计算机信息技术用于计量存储容量和传输容量的一种计量单位,是计算机中基本的存储单位。一个字节等于 8 位(bit),每一位可以表示 0 或 1 这两种状态,字节通常用来衡量文件大小、内存空间占用等情况。例如,一个简单的文本文件大小为 1024 字节,意味着这个文件在存储介质中占用了 1024 个字节的存储空间。 - 字符(Character):
字符是各种文字和符号的统称,用于表示和传递信息,像常见的英文字母(如 ‘A’、’b’ 等)、数字(如 ‘1’、’2′ 等)、标点符号(如 ‘.’、’,’ 等)以及汉字(如 “你”“好” 等)、特殊字符(如 ‘$’、’@’ 等)都属于字符的范畴。字符是人们在使用计算机进行信息交流、文本编辑等过程中直观看到和使用的内容单元
FileReader(文件字符输入流):

try-catch代码块中异常信息输出:
e.printStackTrace();
在 Java 编程中,当程序出现异常(例如运行时遇到错误情况,像空指针异常 NullPointerException、数组越界异常 ArrayIndexOutOfBoundsException 等)时,如果不进行适当处理,程序会直接终止运行,并在控制台输出异常相关的简短错误信息。而 e.printStackTrace(); 语句通常放在 catch 块中,用于打印出异常发生时详细的堆栈跟踪信息(Stack Trace),方便开发者了解异常产生的根源、在代码中的传播路径以及具体在哪个方法、哪一行代码出现了问题,有助于定位和修复代码中的错误
package com.file.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import java.util.Arrays;
public class FileReader {
public static void main(String[] args) {
try {
java.io.FileReader file = new java.io.FileReader("FileStudy\\src\\main\\java\\com\\file\\test\\OutPutStreamtest.txt");
//读取文件内容
//使用文件字节输入流读取文件,一次读取一个字符
// int c ;//每次读取文本的字符编号
// while ((c=file.read())!=-1){
// System.out.print((char) c);
// }
/**
* 使用文件字节输入流读取文件,一次读取多个字符,利用数组、
*/
File file1 = new File("FileStudy\\src\\main\\java\\com\\file\\test\\OutPutStreamtest.txt");
char[] chars = new char[3];
int len;
java.io.FileReader fileReader = new java.io.FileReader("FileStudy\\src\\main\\java\\com\\file\\test\\OutPutStreamtest.txt");
while ((len=fileReader.read(chars)) != -1) {
System.out.print(new String(chars));
}
//缺点:每次读取一个字符性能比较差
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
}
}
}
代码分别演示了一次读取一个字节和使用数组读取字节的两种方式,使用数组读取字节时要注意定义数组的大小,如果定义的数组较大,就会出现空的符号,
不管是两种方式的哪一种,都要事先定义一个int类型的变量,用来表示每次读取的字符数量,这样就可以保证当数组为空时,停止读取,读取完毕
使用文件输入流能更好的读取文本文件,不会出现乱码;
文本文件是由字符组成的,而字符在计算机中存储需要通过特定的编码方式转换为字节序列。字符输入流内部默认会根据系统默认的字符编码(例如在很多系统中是 UTF-8 编码)或者可以指定特定的编码(如 InputStreamReader 可指定编码)来自动处理字符和字节之间的转换工作。它能够将读取到的字节按照相应编码规则正确解析成字符,使得开发者在读取文本文件时可以直接操作字符,无需关心底层字节以及复杂的编码解码细节。
(文件字节出流)FileWriter

文件字节输出流就是写内存字符到磁盘文件中去

package com.file.test;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
public class FileWriterTest01 {
public static void main(String[] args) {
//创建字符输出流管道
try(Writer file= new FileWriter("FileStudy\\src\\main\\java\\com\\file\\test\\itaa.txt");
) {
//public void writer(int c);写一个字符出去
// file.write(97);
File file1 = new File("FileStudy\\src\\main\\java\\com\\file\\test\\ita.txt");
System.out.println(file1.getAbsolutePath());
byte[] bytes = "\r\n".getBytes();
//public void write(String) 一次写出一个字符串
// String str="我爱你中国abc123;;;;";
// file.write(str);
// file.write(Arrays.toString(bytes));
/**
* public void write(String c,int pos,int len) 写字符串的一部分出去
*/
// String str="我爱你中国ABC 1111";
// file.write(str,0,4);
/**
* public void write(char[] buffer) 写一个字符数组出去
*
*/
//换行符:
//file.write("\r\n");
// 可以直接换行
//用字符数组进行文件copy
int len;
File file2 = new File("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
char[] chars = new char[3];
FileReader fileReader = new FileReader("FileStudy\\src\\main\\java\\com\\file\\test\\ita.txt");
while ((len=fileReader.read(chars))!=-1){
file.write(chars,0,len);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
实现
换行:file.weite(“\r\n”);

如果在想改造为追加管道,那么就在创建管道时后面加一个参数:true 默认是覆盖管道,加一个参数true改为追加管道
注意:字符输出流输出数据后,必须刷新流,写出去的数据才能生效
我们在使用字符输出流时,使用后要记得把流刷新或者关闭,因为我们写字符时,其实是进入到一个缓冲区,我们要通过刷新或者关闭流来通知它把这个缓冲区内容放到文件中去,当这个缓冲区被挤满时,他会自动把内容写入到文件中去;
package com.file.test;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriter03 {
public static void main(String[] args) {
try ( FileWriter fileWriter = new FileWriter("FileStudy\\src\\main\\java\\com\\file\\test\\itaa.txt");
){
fileWriter.write('我');
fileWriter.write('我');
fileWriter.write('我');
fileWriter.write("\r\n");
fileWriter.write('我');
fileWriter.write('我');
fileWriter.write('我');
fileWriter.write('我');
// fileWriter.flush();
//关闭流包含刷新操作,关闭后就不可以继续使用这个流
fileWriter.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}