如何使用缓冲流附加到 Java 中的文件?
How do I use Buffered streams to append to a file in Java?
我有以下代码,但我不确定我是否在 efficiency/flushing/closing 流方面正确地执行了所有操作。一些建议会很有帮助,谢谢
OutputStream out = null;
try {
out = new BufferedOutputStream(new FileOutputStream(file, true));
byte[] buf = new byte[32 * 1024]; // should this be 32KB?
while ((in.read(buf)) > 0) {
out.write(buf);
}
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null)
out.close();
if (in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
您遇到的最重要的问题是您忽略了读取的字节数。
for(int len; (len = in.read(buf)) > 0;)
out.write(buf, 0, len);
如果您不使用您假设的长度,您将始终正好读取 32 KB,这是一个很大的假设。
当您有大量小写操作时,缓冲区很有用。
BufferedOutputStream 的默认缓冲大小为 8 KB,如果您的写入比这小得多,即 < 512 字节,它们真的可以提供帮助。
但是,如果您写的是 32 KB,他们可能什么都不做,或者没有帮助。我会带他们出去。
顺便说一句,没有缓冲区,你不需要调用 flush();
BTW2
KB = 1024 bytes
kB = 1000 bytes
Kb = 1024 bits
kb = 1000 bits.
从 "does it work" 的角度来看,您的代码似乎还不错...但是您可以通过使用资源尝试 "prettier" 来使它看起来更漂亮。
Try with Resources
您提供的代码基本上将变成以下内容:
try(OutputStream out = new BufferedOutputStream(new FileOutputStream(file, true)) {
byte[] buf = new byte[1024];
while ((in.read(buf)) > 0) {
out.write(buf);
}
out.flush();
}
这是一个 Java7 功能,如果流资源实现了 java.lang.AutoCloseable 那么它将自动关闭。
根据您的尝试,以下内容可能是更简单的解决方案?
PrintStream p = new PrintStream(new BufferedOutputStream(new FileOutputStream(aFile, true)));
我有以下代码,但我不确定我是否在 efficiency/flushing/closing 流方面正确地执行了所有操作。一些建议会很有帮助,谢谢
OutputStream out = null;
try {
out = new BufferedOutputStream(new FileOutputStream(file, true));
byte[] buf = new byte[32 * 1024]; // should this be 32KB?
while ((in.read(buf)) > 0) {
out.write(buf);
}
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null)
out.close();
if (in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
您遇到的最重要的问题是您忽略了读取的字节数。
for(int len; (len = in.read(buf)) > 0;)
out.write(buf, 0, len);
如果您不使用您假设的长度,您将始终正好读取 32 KB,这是一个很大的假设。
当您有大量小写操作时,缓冲区很有用。
BufferedOutputStream 的默认缓冲大小为 8 KB,如果您的写入比这小得多,即 < 512 字节,它们真的可以提供帮助。
但是,如果您写的是 32 KB,他们可能什么都不做,或者没有帮助。我会带他们出去。
顺便说一句,没有缓冲区,你不需要调用 flush();
BTW2
KB = 1024 bytes
kB = 1000 bytes
Kb = 1024 bits
kb = 1000 bits.
从 "does it work" 的角度来看,您的代码似乎还不错...但是您可以通过使用资源尝试 "prettier" 来使它看起来更漂亮。 Try with Resources 您提供的代码基本上将变成以下内容:
try(OutputStream out = new BufferedOutputStream(new FileOutputStream(file, true)) {
byte[] buf = new byte[1024];
while ((in.read(buf)) > 0) {
out.write(buf);
}
out.flush();
}
这是一个 Java7 功能,如果流资源实现了 java.lang.AutoCloseable 那么它将自动关闭。
根据您的尝试,以下内容可能是更简单的解决方案?
PrintStream p = new PrintStream(new BufferedOutputStream(new FileOutputStream(aFile, true)));