程序通常包括将数据快速写入文件或其他地方的要求。这就提出了问题:我们应该怎么做?我们应该选择哪个班级?今天我们将了解一个适合这个角色的候选人——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)
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,我们可以将StringsStringBuilders以及StringBuffers传递给append方法。但是write()方法只接受一个String

就这样吧!今天我们熟悉了缓冲区,如何对文件执行缓冲写入,以及可以用来执行此操作的方法。