new PrintWriter(new BufferedWriter(new FileWriter("output.txt", true))) 不打印
new PrintWriter(new BufferedWriter(new FileWriter("output.txt", true))) is not printing
我希望将其写入 output.txt 而不清除它 - 只是附加到末尾。但是,当我使用以下两种方法时:
public void addEmails(ArrayList<String> emails){
for (int i = 0; i < emails.size(); i++){
System.out.println(emails.get(i));
writer.println(emails.get(i));
if (i == emails.size() - 1){
System.out.println();
System.out.println();
writer.println();
writer.println();
}
}
}
public void addFileName(String fn){
String fileName = fn.replace("%DATE%.%FORMAT%", "");
writer.println(fileName);
writer.println();
System.out.println(fileName);
System.out.println();
}
这些是通过以下方法调用的:
public void analyze(String path){
try {
System.out.println(path);
File inputFile = new File(path);
InputStream inputStream= new FileInputStream(inputFile);
Reader reader = new InputStreamReader(inputStream,"UTF-8");
InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DescriptorHandler descHandler = new DescriptorHandler(this);
saxParser.parse(is, descHandler);
reader.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Saxparser.parse 为 DefaultHandler 使用以下重载方法:
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// if (qName.equalsIgnoreCase("student")) {
// String rollNo = attributes.getValue("rollno");
// System.out.println("Roll No : " + rollNo);
if (qName.equalsIgnoreCase("DestinationGroup")) {
bDestinationGroup = true;
} else if (qName.equalsIgnoreCase("EmailDestination")) {
bEmailDestination = true;
} else if (qName.equalsIgnoreCase("Filename")) {
bFileName = true;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equalsIgnoreCase("DestinationGroup")) {
descriptorAnalyzer.addFileName(filename);
descriptorAnalyzer.addEmails(emails);
emails.clear();
bDestinationGroup = false;
}
}
@Override
public void characters(char ch[], int start, int length)
throws SAXException {
if (bEmailDestination) {
String s = new String(ch, start, length);
emails.add(s);
bEmailDestination = false;
}
else if (bFileName) {
filename = new String(ch, start, length);
bFileName = false;
}
}
声明(在程序启动时调用):
writer = new PrintWriter(new BufferedWriter(new FileWriter("output.txt", true)));
System.out.println() 正在做我想要的。但是,output.txt保持不变。
编辑:它现在写入文件,但不是附加它,而是清除它并再次写入。
再次编辑:我理解错了。经过更多测试后,它只在第一次调用 analyze() 时写入文件。在随后的调用中,它什么都不做。
编辑 3:解决了问题,但使用 flush() 而不是 close(),因此打印器不会关闭。我相信 printwriter 关闭是导致后续写入失败的原因。
我写了一个简单的class,主要方法如下
public class Test {
public static void main(String[] args) {
PrintWriter writer = null;
try {
writer = new PrintWriter(new BufferedWriter(new FileWriter("output.txt", true)));
} catch (IOException e) {
e.printStackTrace();
}
writer.println("Hello World!");
writer.close();
}
}
除非我在完成写入文件后添加 writer.close()
方法,否则此代码不会附加到 output.txt
文件。或者,添加对 writer.flush()
的调用对我也有效(无需调用 close()
)。可能是,您可以尝试在完成编写后添加对 writer.flush()
的调用。
BufferedWritter 不会在您每次使用 println 时都将数据写入文件。
它的重点是将它保存在一个缓冲区中,然后当缓冲区已满时它会写入。当您从未达到缓冲区最大大小时并且不在您的编写器上调用 flush 时,就会出现问题。
BufferedOutputStream 也一样。
所以你应该在关闭它之前调用 writer.flush()。
我希望将其写入 output.txt 而不清除它 - 只是附加到末尾。但是,当我使用以下两种方法时:
public void addEmails(ArrayList<String> emails){
for (int i = 0; i < emails.size(); i++){
System.out.println(emails.get(i));
writer.println(emails.get(i));
if (i == emails.size() - 1){
System.out.println();
System.out.println();
writer.println();
writer.println();
}
}
}
public void addFileName(String fn){
String fileName = fn.replace("%DATE%.%FORMAT%", "");
writer.println(fileName);
writer.println();
System.out.println(fileName);
System.out.println();
}
这些是通过以下方法调用的:
public void analyze(String path){
try {
System.out.println(path);
File inputFile = new File(path);
InputStream inputStream= new FileInputStream(inputFile);
Reader reader = new InputStreamReader(inputStream,"UTF-8");
InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DescriptorHandler descHandler = new DescriptorHandler(this);
saxParser.parse(is, descHandler);
reader.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Saxparser.parse 为 DefaultHandler 使用以下重载方法:
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// if (qName.equalsIgnoreCase("student")) {
// String rollNo = attributes.getValue("rollno");
// System.out.println("Roll No : " + rollNo);
if (qName.equalsIgnoreCase("DestinationGroup")) {
bDestinationGroup = true;
} else if (qName.equalsIgnoreCase("EmailDestination")) {
bEmailDestination = true;
} else if (qName.equalsIgnoreCase("Filename")) {
bFileName = true;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equalsIgnoreCase("DestinationGroup")) {
descriptorAnalyzer.addFileName(filename);
descriptorAnalyzer.addEmails(emails);
emails.clear();
bDestinationGroup = false;
}
}
@Override
public void characters(char ch[], int start, int length)
throws SAXException {
if (bEmailDestination) {
String s = new String(ch, start, length);
emails.add(s);
bEmailDestination = false;
}
else if (bFileName) {
filename = new String(ch, start, length);
bFileName = false;
}
}
声明(在程序启动时调用):
writer = new PrintWriter(new BufferedWriter(new FileWriter("output.txt", true)));
System.out.println() 正在做我想要的。但是,output.txt保持不变。
编辑:它现在写入文件,但不是附加它,而是清除它并再次写入。
再次编辑:我理解错了。经过更多测试后,它只在第一次调用 analyze() 时写入文件。在随后的调用中,它什么都不做。
编辑 3:解决了问题,但使用 flush() 而不是 close(),因此打印器不会关闭。我相信 printwriter 关闭是导致后续写入失败的原因。
我写了一个简单的class,主要方法如下
public class Test {
public static void main(String[] args) {
PrintWriter writer = null;
try {
writer = new PrintWriter(new BufferedWriter(new FileWriter("output.txt", true)));
} catch (IOException e) {
e.printStackTrace();
}
writer.println("Hello World!");
writer.close();
}
}
除非我在完成写入文件后添加 writer.close()
方法,否则此代码不会附加到 output.txt
文件。或者,添加对 writer.flush()
的调用对我也有效(无需调用 close()
)。可能是,您可以尝试在完成编写后添加对 writer.flush()
的调用。
BufferedWritter 不会在您每次使用 println 时都将数据写入文件。 它的重点是将它保存在一个缓冲区中,然后当缓冲区已满时它会写入。当您从未达到缓冲区最大大小时并且不在您的编写器上调用 flush 时,就会出现问题。 BufferedOutputStream 也一样。
所以你应该在关闭它之前调用 writer.flush()。