2016-04-27 84 views
2

我试图从现有文件的每行第100个字符处引入一个换行符,但它不会写入任何内容。下面是用java编写的代码,用于读取现有文件并用临时文件写入它。从Java读取并编辑文件

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 

public class ReplaceFileContents { 
    public static void main(String[] args) { 
    new ReplaceFileContents().replace(); 
    } 

    public void replace() { 
     String oldFileName = "Changed1.ldif"; 
     String tmpFileName = "Changed2.ldif"; 

     BufferedReader br = null; 
     BufferedWriter bw = null; 
     try { 
     br = new BufferedReader(new FileReader(oldFileName)); 
     bw = new BufferedWriter(new FileWriter(tmpFileName)); 
     String line; 
     while ((line = br.readLine()) != null) {  
       line.replaceAll("(.{100})", "$1\n");  
     } 
     } catch (Exception e) { 
     return; 
     } finally { 
     try { 
      if(br != null) 
       br.close(); 
     } catch (IOException e) { 
      // 
     } 
     try { 
      if(bw != null) 
       bw.close(); 
     } catch (IOException e) { 
      // 
     } 
     } 
     // Once everything is complete, delete old file.. 
     File oldFile = new File(oldFileName); 
     oldFile.delete(); 

     // And rename tmp file's name to old file name 
     File newFile = new File(tmpFileName); 
     newFile.renameTo(oldFile); 

    } 
} 
+1

请勿沉默'例外'!尝试在控制台上输出它们。 – ortis

+5

你不是写信给'bw'的任何地方 –

+0

而不是逐行读取和处理文件,为什么不一次只读一个字节,同时跟踪消耗的字节数,一旦计数达到100就追加一个新行。 –

回答

7
while ((line = br.readLine()) != null) {  
    line.replaceAll("(.{100})", "$1\n");  
} 

首先,line.replaceAll不与结果替换你的行变量。因为Strings是不可变的,所以这个方法返回新的字符串,所以你的行应该是line = line.replaceAll(...

其次,你永远不会将新的String写回到文件中。使用replaceAll不会以任何方式更改文件本身。请尝试使用您的bw对象将新的String写入同一行。

+0

感谢它写道。但是我真正期望的是在第四个字符之后有一个换行符。 输入 ----- ABCDEF GH ijklmn 输出 ------ ABCD EF GH IJKL MN 但上述代码写入所有在一个单一的线路。 – user1650864

+0

'BufferedReader.read'将一次读取一个字符。 'BufferedWriter.write'将在写入之后不会新建一行。 – Zircon

1

从您在这里发表的内容中,您永远不会尝试写line返回到bw。试试这个:

package hello; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 

public class Test { 
    public static void main(String[] args) { 
     new Test().replace(); 
    } 

    public void replace() { 
     String oldFileName = "d:\\1.txt"; 
     String tmpFileName = "d:\\2.txt"; 

     BufferedReader br = null; 
     BufferedWriter bw = null; 
     try { 
      br = new BufferedReader(new FileReader(oldFileName)); 
      bw = new BufferedWriter(new FileWriter(tmpFileName)); 
      String line; 
      while ((line = br.readLine()) != null) { 
       line = line.replaceAll("(.{100})", "$1\n"); 
       bw.write(line); 
      } 
     } catch (Exception e) { 
      return; 
     } finally { 
      try { 
       if(br != null) 
        br.close(); 
      } catch (IOException e) { 
       // 
      } 
      try { 
       if(bw != null) 
        bw.close(); 
      } catch (IOException e) { 
       // 
      } 
     } 
     // Once everything is complete, delete old file.. 
     File oldFile = new File(oldFileName); 
     oldFile.delete(); 

     // And rename tmp file's name to old file name 
     File newFile = new File(tmpFileName); 
     newFile.renameTo(oldFile); 

    } 
} 
  1. 你没有尝试过写行回bw;
  2. String#replaceAll将返回源的副本不是原始的String;