Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Writer不在文件中写入,只创建它_Java_File_File Io - Fatal编程技术网

Java Writer不在文件中写入,只创建它

Java Writer不在文件中写入,只创建它,java,file,file-io,Java,File,File Io,我在做转换器。我加载文件,开始从中读取日期,并按年、月、日创建目录(+另一个目录),最后是那些转换后的文本文件。创建这些目录时一切都很好,但在文本文件中什么都不是,或者只是其中的一部分 public static void convertFile(File fileToConvert, File whereToSave, long shift) { BufferedReader reader = null; BufferedWriter writer = null; St

我在做转换器。我加载文件,开始从中读取日期,并按年、月、日创建目录(+另一个目录),最后是那些转换后的文本文件。创建这些目录时一切都很好,但在文本文件中什么都不是,或者只是其中的一部分

public static void convertFile(File fileToConvert, File whereToSave, long shift) {
    BufferedReader reader = null;
    BufferedWriter writer = null;
    String oldDate = "";
    String newDate = "";
    boolean boolDate = true;

    try {

        for (File file : fileToConvert.listFiles()) {
            reader = new BufferedReader(new FileReader(file));

            boolean block = true;
            String line = "";
            int lineCounter = 0;
            while ((line = reader.readLine()) != null) {
                if (lineCounter==0) {
                    block = true;
                } else {
                    block = false;
                }

                line = line.replaceAll("[^0-9-,:+NaN.]", "");
                String[] data = line.split(",");

                if (block) {
                    data[0] = data[0].substring(0, 10) + " " + data[0].substring(10);
                    data[0] = SimulatorForRealData.timeShift(data[0], shift);
                    // ====================================================================================
                    newDate = data[0].substring(0, 4) + " " + data[0].substring(5, 7) + " "
                            + data[0].substring(8, 10);

                    String savingIn = SimulatorForRealData.createDirs(whereToSave.toString(),
                            data[0].substring(0, 4), data[0].substring(5, 7), data[0].substring(8, 10));

                    File f = new File(savingIn + "\\" + FILE_NAME + ".log");

                    if (!newDate.equals(oldDate) && boolDate == false) {
                        writer.close();
                        boolDate = true;

                    } else {
                        oldDate = newDate;
                        boolDate = false;

                    }

                    writer = new BufferedWriter(new FileWriter(f));



                    // =====================================================================================
                    writer.write("<in date=\"" + data[0].substring(0, 10) + "T" + data[0].substring(11)
                            + "\" t=\"1\" >\n");
                    writer.write(data[0] + "\n");
                    writer.write(0 + " " + 0 + " " + 0 + "\n");
                    for (int x = 0; x <= 10; x++) {
                        writer.write("NaN" + " ");
                    }
                    writer.write("\n");

                    for (String s : data) {
                        if (s.equals(data[0])) {
                            continue;
                        }
                        writer.write(s + ";");
                    }
                    writer.write("\n");
                } else {
                    for (String s : data) {
                        writer.write(s + ";");
                    }
                    writer.write("\n");
                }
                lineCounter++;
                if (lineCounter == 118) {
                    lineCounter = 0;
                    writer.write("</in>\n\n");
                }

            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            writer.close();
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
publicstaticvoidconvertfile(文件fileToConvert,文件存放位置,长移位){
BufferedReader reader=null;
BufferedWriter=null;
字符串oldDate=“”;
字符串newDate=“”;
布尔布尔布尔值=true;
试一试{
对于(文件:fileToConvert.listFiles()){
reader=newbufferedreader(newfilereader(file));
布尔块=真;
字符串行=”;
int lineCounter=0;
而((line=reader.readLine())!=null){
如果(lineCounter==0){
block=true;
}否则{
block=false;
}
line=line.replaceAll(“[^0-9-,:+NaN.]”,“”);
String[]data=line.split(“,”);
如果(块){
数据[0]=数据[0]。子字符串(0,10)+“”+数据[0]。子字符串(10);
数据[0]=模拟器ForRealData.timeShift(数据[0],shift);
// ====================================================================================
newDate=数据[0]。子字符串(0,4)+“”+数据[0]。子字符串(5,7)+“”
+数据[0]。子串(8,10);
String savingIn=SimulatorForRealData.createDirs(whereToSave.toString(),
数据[0]。子字符串(0,4),数据[0]。子字符串(5,7),数据[0]。子字符串(8,10));
文件f=新文件(savingIn+“\\”+文件名+”.log”);
如果(!newDate.equals(oldDate)&&boolDate==false){
writer.close();
boolDate=true;
}否则{
oldDate=newDate;
boolDate=false;
}
writer=newbufferedwriter(newfilewriter(f));
// =====================================================================================
writer.write(“\n”);
writer.write(数据[0]+“\n”);
writer.write(0+“”+0+“”+0+“\n”);

对于(int x=0;x,我看到两个主要问题:

  • 每次读取一行时都会创建一个文件。应该将其放在循环之外(如果只需要一个文件,则可以将其放在循环之外)
  • 始终使用相同的文件名写入数据。如果为每次读取的文件创建一个文件,则该文件应具有不同的文件名

  • 我认为你应该关闭你创造的每一位作家,而不仅仅是最后一位

    for (File file : fileToConvert.listFiles()) {
       reader = new BufferedReader(new FileReader(file));
       ...
       writer = new BufferedWriter(new FileWriter(f));
       while ((line = reader.readLine()) != null) {
           ....
       }
       writer.close();
    }
    

    writer仅在缓冲区溢出或关闭时才刷新磁盘上的所有更改。

    在Java 7之后,您应该始终使用try with resources来处理我的BufferedReader的iomaybe,但我不能将BufferedWriter放在那里,因为我需要为它添加新路径files@Jacob,不,不应该,但这是一个更好的方法,也是你想尝试的方法使用resource,类应该实现
    自动关闭
    可关闭
    interfaces@JojoFranek,您有机会调试代码吗?因为它还有另一个问题,即如果(!newDate.equals(oldDate)和&boolDate==false)writer.close()它可以在
    处抛出nullPointerException
    谢谢。我将调用BufferedWriter的构造函数包装为if语句:if((lineCounter==0&&blockCounter==48)| | firstTime){firstTime=false;blockCounter=0;writer=new BufferedWriter(new FileWriter(f));}