首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >new PrintWriter(new BufferedWriter(new FileWriter("output.txt",true))没有打印

new PrintWriter(new BufferedWriter(new FileWriter("output.txt",true))没有打印
EN

Stack Overflow用户
提问于 2015-07-22 16:12:30
回答 2查看 2.7K关注 0票数 1

我希望这样写到output.txt,而不是清除它-只是附加到最后。但是,当我使用以下两种方法时:

代码语言:javascript
运行
复制
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();
}

这些是从以下方法调用的:

代码语言:javascript
运行
复制
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使用以下重载方法:

代码语言:javascript
运行
复制
@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;
    }

}

声明(在启动程序时调用):

代码语言:javascript
运行
复制
    writer = new PrintWriter(new BufferedWriter(new FileWriter("output.txt", true)));

System.out.println()正在做我想做的事情。然而,output.txt保持不变。

编辑:它现在写到文件,但它没有附加它,它清除它并再次写入。

再次编辑:我误解了。经过一些更多的测试后,它只在首次调用analyze()时写入文件。在随后的呼叫中,它什么也不做。

编辑3:解决了这个问题,但是使用flush()而不是close(),因此printwriter不关闭。我认为,打印程序的关闭是导致后续写作失败的原因。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-22 16:40:29

每次使用println时,BufferedWritter都不会将数据写入文件。它的全部目的是将其保存在缓冲区中,然后当缓冲区已满时,它将写入。当你从来没有达到缓冲区的最大大小,并且不对你的作者调用刷新时,问题就会发生。BufferedOutputStream的情况也是一样。

因此,您应该在关闭writer.flush()之前调用它。

票数 1
EN

Stack Overflow用户

发布于 2015-07-22 16:38:45

我用以下主要方法编写了一个简单的类

代码语言:javascript
运行
复制
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();
    }
}

这段代码没有附加到output.txt文件中,除非我在写入该文件之后添加了writer.close()方法。或者,向writer.flush()添加一个调用对我也有效(不调用close())。也许,您可以在完成编写之后尝试添加一个对writer.flush()的调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31568548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档