Java 进阶IO流(二)
把磁盘中的数据以字符的形式读入到内存中
构造器
解释
public FileReader(File file)
创建字符输入流管道与源文件对象接通
public FileReader(String pathname)
创建字符输入流管道与源文件路径接通
方法名
解释
public int read()
每次读取一个字符,没有字符返回-1
public int read(char[] buffer)
每次读取一个字符数组,没有字符返回-1
import java.io.FileReader;2、FIleWriter文件字符输出流
import java.io.IOException;
public class ClassStructure {
public static void main(String[] args) throws IOException {
int read = 0;
//创建一个读入数据的相对路径的流
FileReader fileReader = new FileReader("data/access.log");
//直接读取字符输出
// while((read = fileReader.read()) != -1){
// System.out.printf("%c",read);
// }
//根据数组存储要求输出
char[] by = new char[8];
while((read = fileReader.read(by)) != -1){
System.out.println(by);
}
//关闭读入流
fileReader.close();
}
}
把内存中的数据以字符的形式写出到磁盘中
构造器构造器
解释
public FileWriter(File file)
创建字符输出流管道与源文件对象接通
public FileWriter(File file,boolean append)
创建字符输出流管道与源文件对象接通,
可追加数据
public FileWriter(String filepath)
创建字符输出流管道与源文件路径接通
public FileWriter(String filepath,boolean append)
创建字符输出流管道与源文件路径接通,
可追加数据
方法名
解释
void write(int c)
写一个字符
void write(char[] cbuf)
写入一个字符数组
void write(char[] cbuf, int off, int len)
写入字符数组的一部分
void write(String str)
写一个字符串
void write(String str, int off, int len)
写一个字符串的一部分
flush()
刷新流,可以继续写数据
close()
关闭流,释放资源,但是在关闭之前会先刷新流;
一旦关闭,就不能再写数据
[图片上传失败...(image-b266f3-1662427703591)]
import java.io.*;场景
public class ClassStructure {
public static void main(String[] args) throws IOException {
int read = 0;
//创建一个读入数据的相对路径的流
FileReader fileReader = new FileReader("data/access.log");
FileWriter fileWriter = new FileWriter("data/access1.log");
//直接读取字符输出
while((read = fileReader.read()) != -1){
fileWriter.write(read);
}
//根据数组存储要求输出
char[] ch = new char[8];
while ((read = fileReader.read(ch)) != -1) {
fileWriter.write(new String(ch, 0, read));
}
System.out.println("复制OK");
fileWriter.flush();
//关闭读入流
fileReader.close();
//关闭写出
fileWriter.close();
}
}
字节流适合做文件数据的拷贝(音视频,文本)
字节流不适合读取中文内容输出
字符流适合做文本文件的操作(读,写)
二、缓冲流缓冲流是高效流或者高级流,前面学习的字节流算原始流
作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写性能
2、优化原理字节缓冲输入流默认有8KB缓冲池,直接从缓冲池读取数据,性能较好。
字节缓冲输入流默认有8KB缓冲池,数据直接写入缓冲池中,提高写数据性能
3、体系图4、字节缓冲流1)BufferedInputStream字节缓冲输入流提高字节输入流读取数据的性能
2)BufferedOutputStream字节缓存输出流提高字节输出流读取数据的性能
构造器
解释
public BufferedInputStream(InputStream is)
创建一个新的缓冲输入流
public BufferedOutputStream(OutputStream os)
创建一个新的缓冲输出流
import java.io.*;5、字符缓冲流1)BufferedReader字符缓冲输入流
import java.nio.charset.StandardCharsets;
public class ClassStructure {
public static void main(String[] args) throws IOException {
int read = 0;
//创建一个读入数据的相对路径的流
InputStream inputStream = new FileInputStream("data/access.log");
//创建带有缓存的输入流
BufferedInputStream bis = new BufferedInputStream(inputStream);
//创建一个数组
byte[] by = new byte[1024];
//判断是否还有数据
while ((read = bis.read(by)) != -1) {
//转换字符串
String str = new String(by, 0, read);
System.out.println(str);
}
//关闭写出
bis.close();
//关闭读入流
inputStream.close();
//创建一个输出数据的相对路径的流
OutputStream outputStream = new FileOutputStream("data/access1.log");
//创建带有缓存的输出流
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
//直接写入内容,设置编码格式
bos.write("helloworld".getBytes(StandardCharsets.UTF_8));
bos.close();
outputStream.close();
}
}
提高字符输入流读取数据的性能,可以按行读取数据
构造器
解释
public BufferedReader(Reader r)
创建一个新的字符缓冲输入流
方法
解释
public String readLine()
读取一行数据,没有数据返回null
提高字符输出流写取数据的性能,可以换行
构造器
解释
public BufferedWriter(Writer w)
写入一行数据
方法
解释
public void newLine()
换行
[图片上传失败...(image-a40dc7-1662427703590)]
import java.io.*;三、转换流
public class ClassStructure {
public static void main(String[] args) throws IOException {
String msg = null;
//创建一个字符输入流
FileReader fr = new FileReader("data/access.log");
//创建一个字符输入缓冲流
BufferedReader br = new BufferedReader(fr);
//判断是不是最后一行
while ((msg = br.readLine()) != null) {
System.out.println(msg);
}
//关闭输入缓冲流
br.close();
//创建一个字符输出流
FileWriter fw = new FileWriter("data/access1.log");
//创建一个字符输出缓冲流
BufferedWriter bw = new BufferedWriter(fw);
//字符写入的内容
bw.write("china");
//关闭字符缓冲流
bw.close();
}
}
文件和代码编码不一致,会出现乱码
1、InputStreamReader字符输入转换流把原始的字节流按照指定编码转换成字符输入流
构造器
解释
public InputStreamReader(InputStream is)
字节流按照代码默认编码转换成字符输入流
public InputStreamReader(InputStream is ,String charset)
原始的字节流按照指定编码转换成字符输入流,不会出现乱码
import java.io.*;2、OutputStreamWriter字符输出转换流
public class ClassStructure {
public static void main(String[] args) throws IOException {
int len = 0;
//创建一个InputStreamReader对象,FileInputStream构造一个原始的字节流按照指定编码转换成字符输入流
InputStreamReader gbk = new InputStreamReader(new FileInputStream("data/access1.log"),"GBK");
//判断是不是最后一行
while ((len = gbk.read()) != -1) {
System.out.print((char)len);
}
System.out.println();
//释放资源
gbk.close();
InputStreamReader utf = new InputStreamReader(new FileInputStream("data/access1.log"),"utf8");
while ((len = utf.read()) != -1) {
System.out.print((char)len);
}
utf.close();
}
}
把字节输出流按照指定编码转换成字符输出流
构造器
解释
public OutputStreamWriter(OutputStream os)
原始的字节输出流按照代码默认编码转换成字符输出流
public OutputStreamWriter(OutputStream os,String charset)
原始的字节输出流按照指定编码转换成字符输出流,不会出现乱码
import java.io.*;
public class ClassStructure {
public static void main(String[] args) throws IOException {
//字节输出流指定编码格式
OutputStreamWriter gbk = new OutputStreamWriter(new FileOutputStream("data/access1.log"), "GBK");
//写入内容
gbk.write("china,我爱你!!!");
//释放资源
gbk.close();
OutputStreamWriter gbk1 = new OutputStreamWriter(new FileOutputStream("data/access2.log"), "utf-8");
gbk1.write("china,我爱你!!!");
gbk1.close();
}
}
版权声明
本文仅代表作者观点,不代表博信信息网立场。