文章目录
Reader
Reader
是一个抽象类,用于读取字符流。它是所有字符输入流的基类。Reader
提供了一些基本的方法来读取字符数据
int read() //读取单个字符,并返回一个整数。如果到达流末尾,返回-1
int read(char[] c) //将字符读入数组中,返回实际读取的字符数
read(char[] c,int off,int len)
void close() //关闭流,并释放与流相关的资源
子类 InputStreamReader
常用的构造方法
InputStreamReader(InputStream in)
InputStreamReader(InputStream in,String charsetName)
FileReader
FileReader
是 Reader
的一个具体实现,用于从文件中读取字符数据。它简单地将文件内容读取为字符流。
FileReader
类是 InputStreamReader
的子类。
构造方法
FileReader(File file) //通过 File 对象创建 FileReader 对象
FileReader(String fileName) //通过文件名创建 FileReader 对象
该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类型
System.out.println(System.getProperty("file.encoding"));
// 获得本地平台的字符编码类型
关系概述
Reader
==> InputStreamReader(字节流InputStream, 编码)
==> FileReader(路径 || File对象)
读取文件
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.IOException;
public class InputReaderTest {
public static void main(String[] args) {
Reader reader = null; // 声明reader变量
try {
// 使用正确的文件路径和编码初始化reader
reader = new InputStreamReader(new FileInputStream("D:\\..."), "GBK");
// 创建一个缓冲区
char[] buffer = new char[100];
// 从文件中读取字符
int length = reader.read(buffer);
// 将读取的字符转换为字符串
String msg = new String(buffer, 0, length);
// 打印字符串
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
BufferedReader
BufferedReader
是 Reader
的一个装饰类,它在 Reader
的基础上提供了缓冲功能。缓冲区的存在减少了对底层读取操作的调用次数,从而提高了性能。它提供了额外的方法,如按行读取内容的 readLine()
方法来更方便地读取文本数据。
构造方法
BufferedReader(Reader in) //使用 Reader 对象构造 BufferedReader
子类 BufferedReader
特有的方法
String readLine() //读取一行文本(不包括行结束符),返回一行的内容。如果到达流的末尾,返回 null
读文本文件
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderTest {
public static void main(String[] args) {
// 创建读取器和缓冲读取器
FileReader reader = null;
BufferedReader br = null;
try {
reader = new FileReader("D:\\...");
br = new BufferedReader(reader);
String msg = null;
// 逐行读取文件
while ((msg = br.readLine()) != null) {
System.out.println(msg);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (br != null) {
br.close();
}
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
解决读取时中文乱码
// 直接使用 FileReader 读取文件字符,但不指定编码。
FileReader fr = new FileReader("c:\\myDoc\\hello.txt");
BufferedReader br = new BufferedReader(fr);
// 使用 FileInputStream 读取文件字节,再通过 InputStreamReader 转换为字符流,并指定编码UTF-8
FileInputStream fis = new FileInputStream("c:\\myDoc\\hello.txt");
InputStreamReader fr = new InputStreamReader(fis,"UTF-8");
BufferedReader br = new BufferedReader(fr);
Writer
Writer
是 Java I/O 系统中处理字符流的抽象基类。它定义了写入字符的方法,并且提供了子类实现这些方法的基础。Writer
类的主要方法包括:
write(String str) //写入单个字符
write(String str, int off, int len)
void close() //关闭流,并释放与流相关的系统资源
void flush() //刷新流,确保所有缓冲的数据都被写出
OutputStreamWriter
是 Writer
的一个具体子类,它是一个桥接类,用于将字节流(OutputStream
)转换成字符流(Writer
)。它将字符数据编码成字节数据,并将其写入底层的字节流。
OutputStreamWriter
常用的构造方法
OutputStreamWriter(OutputStream out) // 使用默认字符编码
OutputStreamWriter(OutputStream out,String charsetName) //使用指定的字符编码
使用示例
public static void main(String[] args) {
try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("example.txt"), "UTF-8")) {
osw.write("Hello, World!");
} catch (IOException e) {
e.printStackTrace();
}
}
FileWriter
FileWriter
是 OutputStreamWriter
的一个子类,用于将字符数据直接写入文件
FileWriter (File file) //将字符写入指定的文件
FileWriter (String fileName) //将字符写入指定的文件(通过文件名)
该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型
public static void main(String[] args) {
try (FileWriter fw = new FileWriter("example.txt")) {
fw.write("Hello, FileWriter!");
} catch (IOException e) {
e.printStackTrace();
}
}
关系概述
Writer
==> OutputStreamWriter(字节流OutputStream, 编码)
==> FileWriter(路径 || File对象, 是否追加)
写入文件
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class OutputWriter {
public static void main(String[] args) {
Writer writer = null;
try {
// 创建 FileWriter 实例,指定文件路径和是否追加
writer = new FileWriter("D:\\...", true);
// 写入内容
writer.write("\n123");
System.out.println("写入成功!!!");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 确保资源被关闭
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
BufferedWriter
BufferedWriter
是 Writer
的一个装饰类,用于在写入字符数据时提供缓冲功能。BufferedWriter
在内部维护一个缓冲区,将数据先写入缓冲区,而不是直接写入目标流,从而减少实际写入操作的次数。
使用 FileWriter
类与 BufferedWriter
类提高字符流写文本文件的效率
构造方法
BufferedWriter(Writer out) //使用指定的 Writer 对象作为基础流
使用 BufferedWriter
写入文件
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class BufferedWriterTest {
public static void main(String[] args) {
Writer writer = null;
BufferedWriter bw = null;
try {
// 创建 FileWriter 实例,指定文件路径和是否追加
writer = new FileWriter("D:\\...", true);
// 创建 BufferedWriter 实例
bw = new BufferedWriter(writer);
// 写入信息到缓冲区
bw.write("数据结构");
bw.newLine(); // 换行
bw.write("软件名词解释");
bw.newLine(); // 换行
bw.write("Linux虚拟机安装vmware");
// 将缓冲区数据刷新到字符流中
bw.flush();
System.out.println("写入成功!!!!");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 确保资源被关闭
try {
if (bw != null) {
bw.close();
}
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
读写二进制文件
流之间的关系概述
读取:InputStream
==> FilelnputStream
==> DatalnputStream(InputStream)
写入:0utputStream
==> FileOutputStream
==> DatalnputStream(OutputStream)
需求说明
使用 DataInputStream DataOutputStream 读写二进制文件 完成复制过程
public class DatastreamTest {
public static void main(String[] args) {
DataInputStream dis = null;
DataOutputStream dos = null;
try {
dis = new DataInputStream(new FileInputStream("D:\\star.jpg"));
dos = new DataOutputStream(new FileOutputStream("D:\\test\\1.jpg"));
int b = -1;
while ((b = dis.read()) != -1) {
dos.write(b);
}
System.out.println("复制成功!!!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (dos != null) dos.close();
if (dis != null) dis.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
标签:字符,Java,String,Writer,IOException,IO,new,null,读取
From: https://blog.csdn.net/m0_66584716/article/details/142098576