在本文中,您将学习如何使用 Java 将数据写入文件。
Java 有多种使用各种内置类将数据写入文件的方法,例如 BufferedWriter
、FileWriter
、PrintWriter
、FileOutputStream
、BufferedOutputStream
、DataOutputStream
、RandomAccessFile
、FileChannel
等。
这些类中的每一个都有不同的属性和用例。让我们借助示例来看看它们中的每一个。
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);
}
}
}
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);
}
}
}
您还可以使用 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);
}
}
}
当您需要将文本数据(表示为字符的数据)写入文件时,将使用本文前面给出的示例的 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);
}
}
}
您还可以直接使用 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);
}
}
}
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);
}
}
}
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);
}
}
}
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.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());
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.callicoder.com/java-write-to-file/
内容来源于网络,如有侵权,请联系作者删除!