字符流:
Reader:
Java中用于字符输入的抽象类,是字符输入流的基类。
FileReader:
用来将文件中的字符数据读取到程序中来。
注:FileReader默认只能读取UTF-8编码格式的文件,如果用它读取GBK格式的文件可能存在乱码,因为FileReader遇到汉字默认按3个字节来读取,而GBK一个汉字占2个字节,所以会乱码
构造方法FileReader(File file) :创建一个新的FileReader,给定File来读取,使用平台的 默认字符集。FileReader(File file, Charset charset) : 创建一个新的FileReader,给定File要读取的和字符集。FileReader(String fileName) : 使用平台的默认字符集创建一个新的FileReader,并指定要读取的文件的名称 。FileReader(String fileName, Charset charset) : FileReader给定要读取的文件名和字符集,创建一个新文件。常用方法:FileReader读取文件的步骤如下:1. 创建 FileReader 对象与要读取的源⽂件接通2.调⽤ read() ⽅法读取⽂件中的字符3. 调⽤ close() ⽅法关闭流
File file=new File("E:/t.txt");
int readlen=0;
char[] chars=new char[9];
try{
FileReader fileReader=new FileReader(file);
while((readlen=fileReader.read(chars))!=-1){
System.out.println(new String(chars,0,readlen));
}
}catch (IOException e){
e.printStackTrace();
}
Wirter:
FileWirter:
构造方法:FileWriter(File file) : 使用给定的要写入的内容File和平台的默认字符集构造FileWriter对象FileWriter(File file, boolean append) : 使用给定的要写入的内容File和平台的默认字符集构造FileWriter对象,append表示是否追加数据。FileWriter(File file, Charset charset) : 使用给定的File和 charset构造FileWriter。FileWriter(File file, Charset charset, boolean append) : 使 用 给 定 的 File 和 charset 构 造FileWriter,append表示是否追加数据。FileWriter(String fileName) : 将给定的文件名使用平台的默认字符集构造FileWriter对象FileWriter(String fileName, boolean append) : 将给定的文件名使用平台的默认charset 构 造FileWriter,append是否附加追加数据 。FileWriter(String fileName, Charset charset) : 构造FileWriter给定的文件名和字符集。FileWriter(String fileName, Charset charset, boolean append) : 构造FileWriter使用给定的文件名、字符集和append是否追加数据。常用方法FileWriter往文件中写字符数据的步骤如下:1.创建 FileWirter 对象与要读取的⽬标⽂件接通2.调⽤ write(字符数据/字符数组/字符串) ⽅法读取⽂件中的字符3.调⽤ close() ⽅法关闭流
注:FileWirter写完数据后必须刷新或者关闭,写出去的数据才能生效
这涉及到文件输出流的缓存机制和资源管理。文件输出流通常会使用内部缓存区来暂时存储要写入文件的数据,而不是每次写入都立即将数据写入文件。这是为了提高性能,因为频繁的磁盘写入操作通常比较慢。以 下是为什么需要刷新或关闭流的原因:1.性能优化:通过使⽤缓存区,多个写操作可以⼀次性写⼊⽂件,减少了磁盘操作的次数,提⾼了写⼊性能。2.数据完整性:将数据存储在缓存区中意味着在调⽤ write ⽅法后,数据实际上还没有写⼊⽂件。如果在数据完全写⼊之前发⽣了程序崩溃或其他异常情况,可能会导致数据丢失或⽂件损坏。3.资源管理:打开的⽂件输出流会占⽤系统资源。如果不及时关闭流,可能会导致资源泄漏。关闭流会释放相关资源,确保它们可⽤于其他操作。
File file=new File("E:/t.txt");
FileWriter fileWriter=null;
try{
fileWriter=new FileWriter(file);
fileWriter.write('c');
fileWriter.write("风雨之后,就是彩虹"); //默认是覆盖
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
fileWriter.close();//要flush或close才能写进去
}
缓存流:
BufferReader、BufferWirter
为了提高流的读写效率,Java提供了缓存流,输入输出流被缓存流包装后,能极大的提高流的读写效率。能提高效率的原因:是因为在缓存流的底层自己封装了一个长度为8KB(8129byte)的字节数组,但是缓存流不能单独使用,它需要依赖于原始流。 读数据时:它先⽤原始字节输⼊流⼀次性读取8KB的数据存⼊缓存流内部的数组中(先⼀次多囤点货),再从8KB的字节数组中读取⼀个字节或者多个字节(消耗屯的货)。 写数据时: 它是先把数据写到缓存流内部的8BK的数组中(先装⼀⻋货),等数组存满了,再通过原始的字节输出流,⼀次性写到⽬标⽂件中去(把囤好的货,⼀次性运⾛)。
String filepath="E:/t.txt";
BufferedReader bufferedReader = new BufferedReader(new FileReader(filepath));
String line;
// line=bufferedReader.readLine();//当返回空时,代表读取完毕
while((line=bufferedReader.readLine())!=null){
System.out.println(line);
}
bufferedReader.close();//因为底层会自动关闭节点流,也就是FileReader
String filepath="E:/b.txt";
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filepath));
bufferedWriter.write("hello");
bufferedWriter.newLine();//插入换行
bufferedWriter.write("world");
bufferedWriter.close();
文件的拷贝:
String filepath="E:/b.txt";
String copyfilepath="E:/bb.txt";
BufferedReader br=null;
BufferedWriter bw=null;
String line;
try{
br=new BufferedReader(new FileReader(filepath));
bw=new BufferedWriter(new FileWriter(copyfilepath));
while((line= br.readLine())!=null){
bw.write(line);
bw.newLine();
}
System.out.println("拷贝完毕");
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
if(br!=null){
br.close();
}
if(bw!=null){
bw.close();
}
}
转换流:
前面提到FileReader读取文件,但因为它默认只能读取UTF-8编码格式的文件,使用它读取GBK格式的文件会出现乱码。
Java给我们提供了另外两种流:InputStreamReader、OutputStreamWriter,这两个流叫做转换流,它们可以将字节流转为字符流,并且可以指定编码方案。
InputStreamReader:
InputStream表示字节输入流,Reader表示字符输入流;合在一起表示可以把InputStream转换为Reader,最终InputStreamReader其实也是Reader的子类,也算是字符输入流。
InputStreamReader不能单独使用,它内部需要封装一个InputStream的子类对象,再指定一个编码表,如果不指定默认按照UTF-8形式进行转换。
构造方法InputStreamReader(InputStream in) : 创建一个使用默认编码集的InputStreamReaderInputStreamReader(InputStream in, String charsetName) : 创建一个使用指定字符集的InputStreamReader。InputStreamReader(InputStream in, Charset cs) : 创建一个使用给定字符集的InputStreamReader。常用方法:String getEncoding() : 返回该流所使用的字符编码的名称。
OutputStreamWriter:
前面是OutputStream表示字节输出流,后面是Writer表示字符输出流,合在一起表示可以把OutputStream转换为Writer,OutputStreamWriter是Writer的子类,所以也算字符输出流。
构造方法OutputStreamWriter(OutputStream out) : 创建使用默认字符编码的 OutputStreamWriter。OutputStreamWriter(OutputStream out, String charsetName) : 创 建 一 个 使 用 指 定 字 符 集的OutputStreamWriter。OutputStreamWriter(OutputStream out, Charset cs) : 创建使用给定字符集的 OutputStreamWriter。常用方法String getEncoding() : 返回该流所使用的字符编码的名称。
打印流:
更方便高效的写数据。有两个:字节打印流PrintStream、字符打印流PrintWriter
重定向输出语句:
try (PrintStream printStream = new PrintStream(new File("io\\print.txt"));) {
printStream.printf("余票还有%d", 12);
System.setOut(printStream);
System.out.print("今天天气不错"); // 直接打印到文件当中
System.out.println();
System.out.printf("余票还有%d", 12);
System.out.println();
System.out.print("123");
} catch (IOException e) {
System.out.println(e.getMessage());
}
数据流:
DataOutputStream:
DataOutputStream类,它也是一种包装流,创建DataOutputStream对象时,底层需要依赖于一个原始的OutputStream流对象。然后调用它的wirteXxx方法,写的是特定类型的数据。
public DataOutputStream(OutputStream out) : 创建数据输出流包装基本的字节输出流常用方法:public final void writeByte(int v) throws IOException : 将byte类型的数据写入基础的字节输出流public final void writeInt(int v) throws IOException : 将int类型的数据写入基础的字节输出流public final void writeDouble(Double v) throws IOExceptio :将double类型的数据写入基础的字节输出流public final void writeUTF(String str) throws IOException :将字符串数据以UTF-8编码成字节写入基础的字节输出流public void write(byte[] bytes) :支持写字节数据出去
DataInputStream:
DataIntputStream类,它也是一种包装流,创建DataInputStream对象时,底层需要依赖于一个原始的InputStream流对象。然后调用它的readXxx()方法就可以读取特定类型的数据。
public DataInputStream(Inputstream is) : 创建新数据输出流包装基础的字节输出流public final void writeByte(int v) throws IOException : 将byte类型的数据写入基础的字节输出流public final void writeInt(int v) throws IOException :将int类型的数据写入基础的字节输出流public final void writeDouble(Double v) throws IOException :将double类型的数据写入基础的字节输出流public final void writeUTF(String str) throws IOException :将字符串数据以UTF-8编码成字节写入基础的字节输出流public void write(byte[] bytes) : 支持写字节数据出去