程序通常包括将数据快速写入文件或其他地方的要求。这就提出了问题:我们应该怎么做?我们应该选择哪个班级?今天我们将了解一个适合这个角色的候选人——BufferedWriter类。
为什么我们需要 BufferedWriter?
BufferedWriter 是一个将缓冲字符写入流的类。它可以让您减少访问物理媒体的次数。也就是说,它不是每次写入一个字符,而是将数据写入缓冲区,然后将所有字符一次性全部写入介质。
这大大提高了写入速度。默认缓冲区大小为 8192 个字符,但这可以通过在构造函数中指定新大小来更改:
BufferedWriter(Writer in, int sz)
在这里,构造函数的第一个参数是一个流,它将接收我们写入的数据。事实证明sz是新缓冲区的大小。
Java 还有一个BufferedReader类:它用于缓冲读取数据。
缓冲区到底是什么?让我们举一个现实生活中的例子。缓冲区就像超市里的篮子或购物车。与其拿着一件商品走到收银台,付钱,把它放在汽车后备箱,然后再回来拿另一件商品,我们可以拿一个购物车,把我们想要的东西放进去,然后付款在结账处。这正是缓冲区的工作原理:它收集数据,然后获取所有内容并将其写入,而不是分别写入每个片段。
BufferedWriter 类的构造函数和方法
现在让我们仔细看看BufferedWriter类。有两个用于创建对象的构造函数:
public BufferedWriter(Writer out)
public BufferedWriter(Writer out, int sz)
两个构造函数中的out是要写入的流,而sz,如前所述,是缓冲区的大小。
BufferedWriter类也有几个方法。今天我们将仔细研究其中的一些:
写(字符[]数组) | 将一个字符数组写入缓冲区 |
write(String s, int off, int len) | 将字符串的一部分写入缓冲区 |
附加(字符c) | 向缓冲区写入一个字符 |
追加(CharSequence csq,int 开始,int 结束) | 将数组的一部分写入缓冲区 |
新队() | 写一个行分隔符 |
冲洗() | 冲洗流 |
让我们编写一个将值写入文件的程序。为了作家参数,我们将传递一个文件写入器给构造函数。它用于编写文本文件,并有几个构造函数来初始化对象:
FileWriter(File file, boolean append)
FileWriter(FileDescriptor fd)
FileWriter(String fileName)
FileWriter(String fileName, boolean append)
对于我们的示例,我们将使用一个带有文件名的构造函数:
try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
String message = "Hello, Amigo! This is a very important message!";
bufferedWriter.write(message);
bufferedWritter.flush();
}
catch(IOException ex){
System.out.println(ex.getMessage());
}
我们的代码将使用write(String str)方法将str写入file.txt文件。
还有其他写法:
-
write(char[] array ) — 此变体接受并写入一个char数组;
-
write(String s, int off, int len) — 这个变体接受一个字符串s;偏移量off,这是开始写入的字符的索引;和len,这是要写入的字符串(子字符串)的长度。
try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
String message = "Hello, Amigo! This is a very important message!";
bufferedWriter.write(message, 0, 11);
bufferedWriter.flush();
} catch(IOException ex) {
System.out.println(ex.getMessage());
}
这段代码会将“Hello, Amig”写入文件,因为我们告诉该方法从索引 0 开始写入 11 个字符。
我们的代码还有一个try-with 资源块:
try(BufferedWriter bufferedWritter = new BufferedWriter(new FileWriter("file.txt")))
这意味着我的close()方法会自动调用缓冲写入器对象,因为它实现了AutoCloseable接口。
代码中的flush ()方法用于刷新输出流,强制写入所有缓冲字节。如果没有此调用,写入可能不会发生,因为它表明必须刷新缓冲区并且必须写入缓冲的字节。
BufferedWriter类还有一个newLine()方法,可以在我们的消息中添加一个新行:
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
String message = "Hello, Amigo! This is a very important message!";
bufferedWriter.write(message, 0, 13);
bufferedWriter.newLine();
bufferedWriter.write(message, 15, 33);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
在文件中,我们得到:
这是一条非常重要的信息!
append()方法的签名如下所示:
public Writer append(CharSequence csq, int start, int end)
它用于添加csq。这里start是第一个字符的索引,end是要插入的字符串(或子字符串)的最后一个字符的索引。不插入索引结束的字符。
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
String message = "Hello, Amigo! This is a very important message!";
bufferedWriter.append(message, 0, 7);
bufferedWriter.flush();
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
此代码将为您提供:
也就是说,使用append方法,您可以指定将字符串的哪一部分添加到缓冲区。
更仔细地观察write()和append()之间的区别,我们首先看到它们在原则上都做同样的事情——它们写入值。
但是,不同之处在于append方法较新,并且将CharSequence作为参数,并且由于String实现了CharSequence,我们可以将Strings和StringBuilders以及StringBuffers传递给append方法。但是write()方法只接受一个String。
就这样吧!今天我们熟悉了缓冲区,如何对文件执行缓冲写入,以及可以用来执行此操作的方法。
GO TO FULL VERSION