“嗨,阿米戈,又来了。”
“你好,Rishi。今天的课程是什么?”
“今天我要给大家介绍一下 Reader 和 Writer。”
“但是,Rishi,我几乎已经了解了他们的一切!”
“重复是学习之母”。
“嗯。嗯,好的。”
“ Reader和Writer类似于InputStream和OutputStream,但它们处理的是字符,而不是字节。有时它们也被称为字符流,而不是 InputStream 和 OutputStream,它们被称为字节流。”
“一个是字符的,另一个是字节的。我记得。”
“不仅如此。这些类是专门为处理文本和字符串而设计的。今天我们将看看这些抽象类的两个经典实现:FileReader和FileWriter。”
“这是FileReader类的方法:”
方法 | 描述 |
---|---|
int read() |
从流中读取一个字符并将其返回。 |
int read(char cbuf[], int offset, int length) |
读取字符数组,返回读取的字符数。 |
boolean ready() |
如果可以从流中读取,则返回 true。 |
void close() |
关闭输入流。 |
int read(java.nio.CharBuffer target) |
将一组字符读入缓冲区。 |
int read(char cbuf[]) |
读取字符数组。 |
long skip(long n) |
跳过流中的 n 个字符。 |
String getEncoding() |
返回流的当前编码。 |
“好吧,这些我几乎都知道。但是 FileWriter 呢?”
方法 | 描述 |
---|---|
void write(int c) |
将一个字符写入流。 |
void write(char cbuf[], int off, int len) |
将字符数组写入流。 |
void write(char cbuf[]) |
将字符数组写入流。 |
void write(String str, int off, int len) |
将字符串的一部分写入流。 |
void write(String str) |
将字符串写入流。 |
void flush() |
将缓存在内存中的所有内容写入磁盘。 |
void close() |
关闭流。 |
String getEncoding() |
返回流的当前编码。 |
“我知道!”
“太好了,那我们再来看一个有趣的例子,等下迭戈会给你布置更多的任务。”
“如何逐行读取文件?你会写代码吗?”
“简单,看:”
代码
// Create a list for storing the lines
List<String> list = new ArrayList<String>();
// Open the file
File file = new File("c:/document.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
// As long as the file isn't empty, read from it
while (reader.ready())
{
list.add(reader.readLine());
}
// Close the file
reader.close();
“嗯。不错。”
“还不错?一切都很简单,也很漂亮。承认吧,Rishi——我已经对 I/O 线程有了很好的掌握。那么这里还有什么可以改进的吗?”
“好吧,例如,你可以这样做:”
Rishi 的代码
File file = new File("c:/document.txt");
List list = Files.readAllLines(file.toPath(), Charset.defaultCharset());
“嗯。那就更短了。就在今天,你把所有这些方法都告诉了我。我会重写它。谢谢你的教训,Rishi。”
“祝你好运,阿米戈。”
GO TO FULL VERSION