目录
IO流的概念
字符流
输入流
Reader核心方法
1.close()
2.mark(int readAheadLimit)
3.markSupported()
4.read()
5.read(char[] cbuf)
6.read(char[] cbuf, int off, int len)
7.read(CharBuffer target)
8.ready()
9.reset()
10.skip(long n)
Reader 的常用子类
1.FileReader
2.BufferedReader(高级)
3. StringReader
输出流
Writer 类的核心方法
1.close()
2.flush()
3.append(char c)
4.append(CharSequence csq)
5.append(CharSequence csq, int start, int end)
6.write(char[] cbuf):
7.write(char[] cbuf, int off, int len):
8.write(int c)
9.write(String str)
10.write(String str, int off, int len)
Writer 的常用子类
1.FileWriter
2.BufferedWriter(高级)
3.StringWriter
字符流总结
在一篇帮你搞懂Java输入[内含IO流详解]_java 输入-CSDN博客 中简单介绍了有关IO流中有关字符流基础的一些常用方法,现在在此系统介绍一下有关IO流的概念。
IO流的概念
在 Java 中,流是用于在数据源(如文件、网络连接等)和程序之间传输数据的抽象概念。根据不同的分类标准,流可以分为不同的类型:
- 按数据类型分类
- 字节流:以字节(8 位)为单位进行数据传输,适用于处理所有类型的数据,包括文本、图像、音频、视频等。因为所有的数据在计算机中最终都是以字节形式存储的,所以字节流可以处理任何形式的二进制数据。
- 字符流:以字符为单位进行数据传输,主要用于处理文本数据。字符流会根据指定的字符编码(如 UTF - 8、GBK 等)将字节数据转换为字符,方便对文本进行读写操作。通俗而言,我们能够读懂的都可以被认为是字符流。
- 按输入输出方向分类
- 输入流:用于从数据源(如游戏程序、文件、网络连接等)读取数据到程序中。
- 输出流:用于将程序中的数据写入到目标位置(如游戏程序、文件、网络连接等)。
这里的输入输出流的概念很容易搞混,可以通俗理解成输入输出是针对于“我们的程序”而言的,读取到程序就是输入,由程序提供数据就是输出。
字符流
输入流
Reader核心方法
Reader
:是字符输入流的抽象基类,以下方法是其核心功能:
1.close()
关闭流并释放与之关联的所有资源。
reader.close();
2.mark(int readAheadLimit)
标记流中的当前位置,以便后续可以通过 reset()
方法返回到该位置。
reader.mark(100); // 标记当前位置,允许向前读取最多100个字符
3.markSupported()
判断此流是否支持 mark()
操作,返回 true
或 false
。
if (reader.markSupported()) {reader.mark(100);
}
4.read()
读取单个字符,返回读取的字符的整数值,如果到达流末尾则返回 -1
。
int c = reader.read();
while (c != -1) {System.out.print((char) c);c = reader.read();
}
5.read(char[] cbuf)
将字符读入数组,返回实际读取的字符数。
char[] buffer = new char[1024];
int charsRead = reader.read(buffer);
System.out.println(new String(buffer, 0, charsRead));
6.read(char[] cbuf, int off, int len)
将字符读入数组的某一部分,返回实际读取的字符数。
char[] buffer = new char[1024];
int charsRead = reader.read(buffer, 0, 512);
System.out.println(new String(buffer, 0, charsRead));
7.read(CharBuffer target)
试图将字符读入指定的字符缓冲区。
CharBuffer buffer = CharBuffer.allocate(1024);
reader.read(buffer);
buffer.flip();
System.out.println(buffer.toString());
8.ready()
判断是否可以从此流中读取数据,返回 true
表示可以读取。
if (reader.ready()) {System.out.println("Stream is ready to read.");
}
9.reset()
重置流,使流返回到最近一次调用 mark()
方法时的位置。
reader.reset(); // 返回到标记的位置
10.skip(long n)
跳过指定数量的字符。
reader.skip(10); // 跳过10个字符
Reader
的常用子类
1.FileReader
从文件中读取字符流。
FileReader fileReader = new FileReader("example.txt");
2.BufferedReader(高级)
提供缓冲功能,提高读取效率。
BufferedReader
:是一个高级的字符输入流,它在内部使用了缓冲区来提高读取效率。它提供了一个非常方便的方法 readLine()
用于按行读取文本数据,这在处理文本文件时非常实用。通常会将一个基础的字符输入流(如 FileReader
)包装在 BufferedReader
中使用,示例代码如下:
BufferedReader bufferedReader = new BufferedReader(new FileReader("example.txt"));
String line;
while ((line = bufferedReader.readLine()) != null) {System.out.println(line);
}
3. StringReader
从字符串中读取字符。
StringReader stringReader = new StringReader("Hello, World!");
char[] buffer = new char[10];
int length;
while ((length = stringReader.read(buffer)) != -1) {System.out.write(buffer, 0, length);
}
输出流
Writer
类的核心方法
1.close()
关闭流并释放资源。
writer.close();
2.flush()
刷新缓冲区,确保数据被写入。
writer.flush();
3.append(char c)
追加单个字符。
writer.append('a');
4.append(CharSequence csq)
追加字符序列。
writer.append("Hello");
5.append(CharSequence csq, int start, int end)
将指定字符序列的子序列追加到输出中。
writer.append("HelloWorld", 0, 5); // 只追加 "Hello"
6.write(char[] cbuf)
:
写入字符数组。
char[] buffer = {'a', 'b', 'c'};
writer.write(buffer);
7.write(char[] cbuf, int off, int len)
:
写入字符数组的某一部分。
char[] buffer = {'a', 'b', 'c', 'd', 'e'};
writer.write(buffer, 1, 3); // 只写入 "bcd"
8.write(int c)
写入单个字符。
writer.write('a');
9.write(String str)
写入字符串。
writer.write("Hello World");
10.write(String str, int off, int len)
写入字符串的某一部分。
writer.write("HelloWorld", 0, 5); // 只写入 "Hello"
Writer
的常用子类
1.FileWriter
将字符写入文件。
FileWriter fileWriter = new FileWriter("example.txt");
fileWriter.write("Hello World");
fileWriter.close();
2.BufferedWriter(高级)
提供缓冲功能,提高写入效率。
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("example.txt"));
bufferedWriter.write("Hello");
bufferedWriter.newLine(); // 写入一个换行符
bufferedWriter.write("World");
bufferedWriter.close();
3.StringWriter
将字符写入字符串。
BufferedWriter
:是一个高级的字符输出流,同样使用了缓冲区来提高写入效率。它提供了 newLine()
方法用于写入一个换行符,方便按行写入文本数据。通常会将一个基础的字符输出流(如 FileWriter
)包装在 BufferedWriter
中使用,示例代码如下:
StringWriter stringWriter = new StringWriter();
stringWriter.write("Hello");
stringWriter.write(" World");
System.out.println(stringWriter.toString()); // 输出 "Hello World"
字符流总结
-
Reader
和Writer
是字符流的核心抽象类(基础)。 -
FileReader
和FileWriter
用于文件的字符读写。 -
BufferedReader
和BufferedWriter
提供缓冲功能,优化读写性能(高级)。 -
StringReader
和StringWriter
用于从字符串中读取或写入字符。