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));}