我需要在Java中反复向现有文件追加文本。我怎么做呢?
当前回答
在Java-7中也可以这样做:
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
//---------------------
Path filePath = Paths.get("someFile.txt");
if (!Files.exists(filePath)) {
Files.createFile(filePath);
}
Files.write(filePath, "Text to be added".getBytes(), StandardOpenOption.APPEND);
其他回答
在项目的任何地方创建一个函数,并在任何需要的地方简单地调用该函数。
伙计们,你们要记住,你们调用的是活动线程,而不是异步调用,因为它可能需要5到10页才能完成。 为什么不花更多的时间在你的项目上,忘掉已经写好的东西。 正确
//Adding a static modifier would make this accessible anywhere in your app
public Logger getLogger()
{
return java.util.logging.Logger.getLogger("MyLogFileName");
}
//call the method anywhere and append what you want to log
//Logger class will take care of putting timestamps for you
//plus the are ansychronously done so more of the
//processing power will go into your application
//from inside a function body in the same class ...{...
getLogger().log(Level.INFO,"the text you want to append");
...}...
/*********log file resides in server root log files********/
三行代码,实际上是两行,因为第三行实际上是追加文本。: P
确保流在所有场景中都正确关闭。
有些令人担忧的是,这些答案中有许多在出现错误时将文件句柄保持打开状态。https://stackoverflow.com/a/15053443/2498188的答案是正确的,但只是因为BufferedWriter()不能抛出。如果可以,则异常将使FileWriter对象打开。
一种更通用的方法,它不关心BufferedWriter()是否会抛出:
PrintWriter out = null;
BufferedWriter bw = null;
FileWriter fw = null;
try{
fw = new FileWriter("outfilename", true);
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
}
catch( IOException e ){
// File writing/opening failed at some stage.
}
finally{
try{
if( out != null ){
out.close(); // Will close bw and fw too
}
else if( bw != null ){
bw.close(); // Will close fw too
}
else if( fw != null ){
fw.close();
}
else{
// Oh boy did it fail hard! :3
}
}
catch( IOException e ){
// Closing the file writers failed for some obscure reason
}
}
编辑:
从Java 7开始,推荐的方法是使用“try with resources”,让JVM来处理:
try( FileWriter fw = new FileWriter("outfilename", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw)){
out.println("the text");
}
catch( IOException e ){
// File writing/opening failed at some stage.
}
FileOutputStream fos = new FileOutputStream("File_Name", true);
fos.write(data);
true允许在现有文件中追加数据。如果我们写
FileOutputStream fos = new FileOutputStream("File_Name");
它将覆盖现有文件。所以选择第一种方法。
String str;
String path = "C:/Users/...the path..../iin.txt"; // you can input also..i created this way :P
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new FileWriter(path, true));
try
{
while(true)
{
System.out.println("Enter the text : ");
str = br.readLine();
if(str.equalsIgnoreCase("exit"))
break;
else
pw.println(str);
}
}
catch (Exception e)
{
//oh noes!
}
finally
{
pw.close();
}
这将达到你的目的。
java 7 +
在我看来,因为我是普通java的粉丝,我会建议它是上述答案的组合。也许我派对迟到了。代码如下:
String sampleText = "test" + System.getProperty("line.separator");
Files.write(Paths.get(filePath), sampleText.getBytes(StandardCharsets.UTF_8),
StandardOpenOption.CREATE, StandardOpenOption.APPEND);
如果文件不存在,则创建该文件;如果文件已经存在,则追加 sampleText到现有文件。使用它,可以避免向类路径添加不必要的库。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap