在本文中,我们将探索使用Java写入文件的不同方法。我们将使用BufferedWriter,PrintWriter,FileOutputStream,DataOutputStream,RandomAccessFile,FileChannel和Java 7 Files实用程序类。
让我们开始简单 - 并使用BufferedWriter将String 写入新文件:
public void bufferedWriterTest()
throws IOException {
String str = "Hello";
BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
writer.write(str);
writer.close();
}
文件中的输出将是:
Hello
然后我们可以将String附加到现有文件,需要FileWriter增加一个参数:true,如下:
public void bufferedWriterTest()
throws IOException {
String str = "NowJava.com";
BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));
writer.append(' ');
writer.append(str);
writer.close();
}
该文件将是:
Hello NowJava.com
接下来 - 让我们看看如何使用PrintWriter将格式化文本写入文件:
public void printWriterTest()
throws IOException {
FileWriter fileWriter = new FileWriter(fileName);
PrintWriter printWriter = new PrintWriter(fileWriter);
printWriter.print("Some String,by NowJava.");
printWriter.printf("Product name is %s and its price is %d $", "iPhone", 1000);
printWriter.close();
}
生成的文件将包含:
Some String,by NowJava.
Product name is iPhone and its price is 1000$
请注意我们不仅要将原始String写入文件,还要使用printf方法编写一些带格式的文本。
我们可以使用FileWriter,BufferedWriter甚至System.out创建编写器。
现在,让我们看看我们如何能够利用FileOutputStream中,以二进制数据写入一个文件。以下代码转换String int bytes并使用FileOutputStream将字节写入文件:
public void fileOutputStreamTest()
throws IOException {
String str = "https://NowJava.com";
FileOutputStream outputStream = new FileOutputStream(fileName);
byte[] strToBytes = str.getBytes();
outputStream.write(strToBytes);
outputStream.close();
}
文件中的输出当然是:
https://NowJava.com
接下来 - 让我们看一下如何使用DataOutputStream将String写入文件:
public void dataOutputStreamTest()
throws IOException {
String value = "Hello";
FileOutputStream fos = new FileOutputStream(fileName);
DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos));
outStream.writeUTF(value);
outStream.close();
// verify the results
String result;
FileInputStream fis = new FileInputStream(fileName);
DataInputStream reader = new DataInputStream(fis);
result = reader.readUTF();
reader.close();
assertEquals(value, result);
}
现在让我们说明如何在现有文件中编写和编辑 - 而不是仅仅写入一个全新的文件或附加到现有文件。简单地说 - 我们需要随机访问。
RandomAccessFile使我们能够在给定偏移量的文件中的特定位置写入 - 从文件的开头 - 以字节为单位。以下代码写入一个整数值,其中包含从文件开头给出的偏移量:
private void writeToPosition(String filename, int data, long position)
throws IOException {
RandomAccessFile writer = new RandomAccessFile(filename, "rw");
writer.seek(position);
writer.writeInt(data);
writer.close();
}
如果我们想要读取存储在特定位置的int,我们可以使用以下方法:
private int readFromPosition(String filename, long position)
throws IOException {
int result = 0;
RandomAccessFile reader = new RandomAccessFile(filename, "r");
reader.seek(position);
result = reader.readInt();
reader.close();
return result;
}
为了测试我们的函数,让我们写一个整数 - 编辑它 - 最后,读回来:
public void writeToPositionTest()
throws IOException {
int data1 = 2014;
int data2 = 1500;
writeToPosition(fileName, data1, 4);
assertEquals(data1, readFromPosition(fileName, 4));
writeToPosition(fileName2, data2, 4);
assertEquals(data2, readFromPosition(fileName, 4));
}
如果您正在处理大文件,FileChannel可能比标准IO更快。以下代码使用FileChannel将String写入文件:
public void fileChannelTest()
throws IOException {
RandomAccessFile stream = new RandomAccessFile(fileName, "rw");
FileChannel channel = stream.getChannel();
String value = "Hello";
byte[] strBytes = value.getBytes();
ByteBuffer buffer = ByteBuffer.allocate(strBytes.length);
buffer.put(strBytes);
buffer.flip();
channel.write(buffer);
stream.close();
channel.close();
// verify
RandomAccessFile reader = new RandomAccessFile(fileName, "r");
assertEquals(value, reader.readLine());
reader.close();
}
Java 7引入了一种使用文件系统的新方法,以及一个新的实用程序类 - Files。使用Files类,我们也可以创建,移动,复制,删除文件和目录; 它还可用于读取和写入文件:
public void fileTest()
throws IOException {
String str = "Hello";
Path path = Paths.get(fileName);
byte[] strToBytes = str.getBytes();
Files.write(path, strToBytes);
String read = Files.readAllLines(path).get(0);
assertEquals(str, read);
}
现在,让我们尝试写入临时文件。以下代码创建一个临时文件并将String写入其中:
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。