【问题标题】:FileOutputStream writing less than it shouldFileOutputStream 写入少于应有的内容
【发布时间】:2015-08-16 01:07:19
【问题描述】:

我正在尝试编写一个程序,将正弦波的数据保存到 .txt 中,但是当我执行该程序时,它写入的内容少于应有的内容(有时甚至什么也不写)。这是代码:

public static void main(String[] args) {
    GeneradorSeñal gs = new GeneradorSeñalSinusoidal("sgsg");
    Double salida;
    try{
        FileOutputStream out = new FileOutputStream("out.txt"); 
        OutputStreamWriter muestras = new OutputStreamWriter(out);

        for(int i=0; i<500; i++){
            salida=gs.getSalida();
            muestras.write(String.valueOf(salida)+"\n");
            System.out.println(i+"\t"+salida);
        }
    }catch(Exception e){
        e.getStackTrace();
    }
}

GeneradorSeñal 和 GeneradorSeñalSinusoidal 是创建正弦曲线的类。 gs.getSalida()返回sinusoidal的值,sinusoidal类效果很好,不是问题。

【问题讨论】:

  • 在末尾添加muestras.flush()muestras.clos()

标签: java file file-io fileoutputstream


【解决方案1】:

确保始终调用输出流的close() 方法。这样可以确保所有缓冲的数据都写入流中。

此外,如果您正在编写字符,则改用FileWriter 会更方便。

【讨论】:

  • 当我添加:finally{muestras.close(); } 我得到一个错误。
  • @Cypert 你能发布你在问题中遇到的错误吗?
  • @Cypert 对于您的错误,请在您的 try 子句之外声明 OutputStreamWriter muestras
【解决方案2】:

试试这个..

try{
 for(int i=0; i<500; i++){
        salida=gs.getSalida();
        muestras.write(String.valueOf(salida)+"\n");
        muestras.flush();
        System.out.println(i+"\t"+salida);
    }
}catch(IOException ioe){
    ioe.printStackTrace();
}finally{
    try{
       muestras.close();
    }finally{}
}

【讨论】:

    【解决方案3】:

    我稍微改进了你的代码:

    ... ...
    try{
        FileOutputStream out = new FileOutputStream("out.txt"); 
        OutputStreamWriter muestras = new OutputStreamWriter(out);
    
        for(int i=0; i<500; i++){
            salida=gs.getSalida();
            muestras.write(String.valueOf(salida)+"\n");
            System.out.println(i+"\t"+salida);
        }
        muestras.flush();
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        if(out!=null){
            try{out.close();}
            catch(Throwable e){
                 e.printStackTrace();
            }
    
        }
    }
    

    使用 finally 确保输出流 100% 关闭。如果 out 未初始化,请使用 "out!=null"。关闭“out”而不是关闭“muestras”,以防 out 已打开但“muestras”未打开。

    【讨论】:

    • 我不知道我是否应该为此创建一个新问题,所以我问你,如果我想对多个文件进行分类,我该怎么做?我有多次尝试捕获并最终嵌套,但我知道它不会每次关闭。非常感谢您的回复。
    • 编写一个 util 类/方法,该类/方法接受您要附加的文件名和文件内容作为输入参数。为每个文件调用该方法。
    • 谢谢,我会试试的。
    猜你喜欢
    • 2019-09-06
    • 2015-03-07
    • 2019-04-25
    • 2014-01-17
    • 2015-02-21
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多