如何在 Java 中写入文件

x33g5p2x  于2021-10-16 转载在 Java  
字(6.8k)|赞(0)|评价(0)|浏览(564)

在本文中,您将学习如何使用 Java 将数据写入文件。

Java 有多种使用各种内置类将数据写入文件的方法,例如 BufferedWriterFileWriter、​​PrintWriterFileOutputStreamBufferedOutputStreamDataOutputStreamRandomAccessFileFileChannel 等。

这些类中的每一个都有不同的属性和用例。让我们借助示例来看看它们中的每一个。

Java 使用 BufferedWriter 写入文件

BufferedWriter 是将 文本数据 写入文件的最简单方法。它将文本写入字符输出流并缓冲字符以提高性能。

通常,您应该始终尝试使用缓冲 I/O,因为它以块的形式写入数据,从而减少 I/O 操作并提高性能。

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;

public class BufferedWriterExample {
    public static void main(String[] args) throws IOException {
        Path filePath = Paths.get("demo.txt");
        Charset charset = StandardCharsets.UTF_8;

        // Instantiate a BufferedWriter
        try(BufferedWriter writer = Files.newBufferedWriter(filePath, charset)) {
            // Write data
            writer.write("Hello, World!");
            writer.newLine();
            writer.write("Learn how to write data to a File efficiently using BufferedWriter");
            writer.newLine();

        } catch (IOException ex) {
            System.out.format("I/O error: %s%n", ex);
        }
    }
}

Java 使用 PrintWriter 写入文件

PrintWriter 类允许您将格式化的文本数据写入文件。它实现了 PrintStream 中的所有打印方法,因此您可以使用

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class PrintWriterExample {
    public static void main(String[] args) {
        Path filePath = Paths.get("demo.txt");
        Charset charset = StandardCharsets.UTF_8;

        // Instantiate a new FileWriter by wrapping a buffered writer for improved performance
        try(BufferedWriter bufferedWriter = Files.newBufferedWriter(filePath, charset)) {
            PrintWriter printWriter = new PrintWriter(bufferedWriter);

            // Write formatted data using print writer
            printWriter.println("Hello, World!");
            printWriter.printf("The value of PI is %d", Math.PI);
            printWriter.print(123456L);
            printWriter.print(true);

        } catch (IOException ex) {
            System.out.format("I/O error: %s%n", ex);
        }
    }

}

Java 使用 FileWriter 写入文件

您还可以使用 FileWriter 将文本数据写入文件。但请注意,它不支持缓冲,因此与 BufferedWriter 相比它会很慢。当您的写入次数较少时,您可以使用它。

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample {
    public static void main(String[] args) {
        // Instantiate a new FileWriter
        try(FileWriter fileWriter = new FileWriter("demo.txt")) {

            // Write data
            fileWriter.write("Hello, World!\n");
            fileWriter.write("Learn how to write data to a File using FileWriter\n");

        } catch (IOException ex) {
            System.out.format("I/O error: %s%n", ex);
        }
    }

}

Java 使用 BufferedOutputStream 写入文件

当您需要将文本数据(表示为字符的数据)写入文件时,将使用本文前面给出的示例的 Writer 类。

但是如果要将二进制数据(或图像数据等原始字节流)写入文件,则需要使用字节流。

由于文本数据也可以被视为字节流,因此您也可以将字节流用于文本数据。

以下示例显示如何使用 BufferedOutputStream 将二进制数据写入文件。

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

public class BufferedOutputStreamExample {
    public static void main(String[] args) {
        String data = "This example shows how to Write data to a File using BufferedOutputStream";

        // Create a BufferedOutputStream by wrapping a FileOutputStream
        try(OutputStream outputStream = Files.newOutputStream(Paths.get("demo.txt"));
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream)) {

            // Write binary data to a file
            bufferedOutputStream.write(data.getBytes());

        } catch (IOException ex) {
            System.out.format("I/O error: %s%n", ex);
        }
    }
}

Java 使用 FileOutputStream 写入文件

您还可以直接使用 FileOutputStream 将二进制数据写入文件。但是它的性能会比 BufferedOutputStream 低,因为它会为每个写入的字节调用底层系统,而不是缓冲数据并将其写入块中。

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamExample {
    public static void main(String[] args) throws IOException {
        String data = "This example shows how to Write data to a File using FileOutputStream";

        // Instantiate a new FileOutputStream
        try(FileOutputStream outputStream = new FileOutputStream("demo.txt")) {

            // Write data in the form of bytes
            outputStream.write(data.getBytes());

        } catch (IOException ex) {
            System.out.format("I/O error: %s%n", ex);
        }
    }
}

Java 使用 DataOutputStream 写入文件

DataOutputStream 允许您以可移植的方式将原始 Java 数据类型写入输出流。

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;

public class DataOutputStreamExample{
    public static void main(String[] args) {
        // Create a DataOutputStream by wrapping a BufferedOutputStream for improved performance
        try(OutputStream outputStream = Files.newOutputStream(Paths.get("demo.txt"));
            DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(outputStream))) {

            // Write primitive Java data types
            dataOutputStream.writeUTF("Hello!");
            dataOutputStream.writeLong(Long.MAX_VALUE);
            dataOutputStream.writeDouble(3.14);
            dataOutputStream.writeBoolean(true);

        } catch (IOException ex) {
            System.out.format("I/O error: %s%n", ex);
        }
    }
}

Java 使用 RandomAccessFile 写入文件

RandomAccessFile 允许您在文件中的特定位置写入数据。它的行为就像存储在文件系统中的大字节数组。它维护一个游标或隐含数组的索引,称为文件指针。

输出操作从文件指针开始写入字节,并将文件指针前进到写入的字节之后。写入超过隐含数组当前末尾的输出操作会导致数组被扩展。

您可以使用 getFilePointer() 方法获取文件指针的当前位置,并使用 seek() 方法设置它。

import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileExample {
    public static void main(String[] args)  {
        try(RandomAccessFile randomAccessFile  = new RandomAccessFile("demo.txt", "rw")) {

            randomAccessFile.seek(10);
            randomAccessFile.writeChar('-');
            randomAccessFile.writeInt(123456);
            randomAccessFile.writeChar('-');

        } catch (IOException ex) {
            System.out.format("I/O error: %s%n", ex);
        }
    }
}

Java 使用 FileChannel 写入文件

FileChannel 支持读取、写入、映射和操作文件。您可以通过调用其 getChannel() 方法从 RandomAccessFile 获取 FileChannel。如果您正在处理大文件,FileChannel 可能比标准 I/O 更快。

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class FileChannelExample {
    public static void main(String[] args) {
        String data = "This example shows how to write to a File using FileChannel. \n" +
                "FileChannel can be faster thant standard I/O if you're dealing with large files";

        try(RandomAccessFile randomAccessFile = new RandomAccessFile("demo.txt", "rw");
            FileChannel fileChannel = randomAccessFile.getChannel()) {

            // Create a byte buffer with sufficient capacity to accommodate the data.
            byte[] byteData = data.getBytes();
            ByteBuffer buffer = ByteBuffer.allocate(byteData.length);

            // Transfer the content of the byte array to the buffer
            buffer.put(byteData);
            // Move to the start position to prepare for channel write
            buffer.flip();

            // Writes a sequence of bytes to the channel from the given buffer.
            fileChannel.write(buffer);

        } catch (IOException ex) {
            System.out.format("I/O error: %s%n", ex);
        }
    }
}

Java 使用 Java NIO 的 Files.Write 写入文件

最后,java.nio.file.Files 类中有一个简单的 Files.write() 方法,可用于将数据写入文件。这通常用于小文件。对于大文件,您应该更喜欢 BufferedWriter 或 BufferedOutputStream。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class FilesWriteExample {
    public static void main(String[] args) throws IOException {
        String data = "This example shows how to write a sequence of bytes to a File using Files.write method.";

        Path path = Paths.get("./demo.txt");

        Files.write(path, data.getBytes());
    }
}

相关文章