2013-03-17 75 views
1

我的示例代码后,一些文本demo.txt前插入文本删除了

String line = null; 
    RandomAccessFile file = new RandomAccessFile("D:/mahtew.txt", "rw"); 
    System.out.println(file.getFilePointer()); 
    while((line = file.readLine()) != null){ 
     System.out.println(line); 
     System.out.println(file.getFilePointer()); 

     if(line.contains("Text to be appended with")){ 
      file.seek(file.getFilePointer()); 
      file.write(" new text has been appended".getBytes()); 
      break; 
     } 
    } 
    file.close(); 

执行

one two three 
Text to be appended with 
five six seven 
eight nine ten 

demo.txt执行后

one two three 
Text to be appended with 
new text has been appendedten 

此外,我尝试使用setLength在添加新文本之前更改文件的长度。但仍有一些文本正在从输出文件中修剪。任何帮助将不胜感激

感谢 马修

+0

你为什么要使用RandomAccessFile的这个?为什么不简单地使用包装在BufferedReader中的FileReader读取文件,更改字符串,然后使用包装在PrintWriter中的FileWriter写入新文件? – 2013-03-17 13:59:53

回答

2

RandomAccessFile

随机存取文件的行为类似于大阵列存储在 文件系统的字节。

实际上它并不关心在写操作的情况下(仅指针是先进)移位的数组元素。这样的操作将覆盖现有值:

输出操作写入从文件指针开始的字节,并提前 文件指针超过写入的字节。

+0

哦,我不知道randomaccessfile是这样工作的。有什么办法可以做到这一点。通过使用像fileoutputstream,filewriter等任何东西我不想创建一个新的临时文件做这个操作或存储数据到一个数组列表或映射,并在另一个文件中更新它。 – user671646 2013-03-17 16:20:05

1

明白,当你在用RAF写,你在写数据这是以前在文件指针位置举行。如果你想插入文本到一个文件,我建议你不要使用英国皇家空军,而是简单地读取文件的文本字符串或ArrayList<String>或StringBuilder的,使用包裹在一个BufferedReader或一个的FileReader保持的文件将文件包装在扫描仪中,更改存储器中保存的字符串或StringBuilder,然后使用包装在PrintWriter中的FileWriter将已更改的数据写入新文件。

例如,

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.PrintWriter; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Scanner; 

public class AppendLine { 
    private static final String FILE_PATH = "src/tetris/mahtew.txt"; 
    private static final String MARKER_LINE = "Text to be appended with"; 
    private static final String TEXT_TO_ADD = "new text has been appended"; 

    public static void main(String[] args) { 
     List<String> fileLines = new ArrayList<String>(); 
     Scanner scanner = null; 
     try { 
     scanner = new Scanner(new File(FILE_PATH)); 
     while (scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 
      fileLines.add(line); 
      if (line.trim().equalsIgnoreCase(MARKER_LINE)) { 
       fileLines.add(TEXT_TO_ADD); 
      } 
     } 

     } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     } finally { 
     if (scanner != null) { 
      scanner.close(); 
     } 
     } 

     PrintWriter pw = null; 
     try { 
     pw = new PrintWriter(new File(FILE_PATH)); 
     for (String line : fileLines) { 
      pw.println(line); 
     } 
     } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     } finally { 
     if (pw != null) { 
      pw.close(); 
     } 
     } 
    } 
} 
+0

@ Hovercraft..not与“文本在这里附加一些单词”,当这个句子在同一行后面的东西..不能插入“新文本已被追加”。那么你能帮助我如何插入同一行吗? – 2013-10-24 05:54:25

1

当您寻找文件的字节位置并写入数据时,字节将被覆盖。

这就是为什么你会得到这样的输出。

试想编辑在记事本按Insert键的东西。它将会替换而不是插入新的数据。同样的事情发生在这里。

编辑:

你应该真正做到,如果你要编辑的文件内容是什么鳗鱼建议。

或者,您可以获取该文件的其余部分,它以避免损失添加到修改后的数据和写入文件,但会变得丑陋和复杂的真正的快速。更不用说性能处罚了。

+0

我不想为此操作创建一个新的临时文件。如果我使用类似csvparser的东西,会有可能吗? – user671646 2013-03-17 16:02:50

0

如果替换字符串过长,与输入匹配的行后面的字符串将被替换。看来你必须读取文件,修改它并回写到旧文件或新文件。 当然,您可以选择使用多线程编程和Java 7的新IO功能来提高性能。

0

您可以在Java中使用RandomAccessFile在一个条件下实现此目的: 否则每行的大小必须是固定的,当写入新字符串时,它可能会覆盖下一行中的字符串。

因此,在我的例子中,当创建文件并写回文件时,我将行长设置为100,并用空格字符串填充。

因此,为了允许更新,您需要将行的长度设置为比此文件中行的最长长度稍大。

public class RandomAccessFileUtil { 
public static final long RECORD_LENGTH = 100; 
public static final String EMPTY_STRING = " "; 
public static final String CRLF = "\n"; 

public static final String PATHNAME = "/home/mjiang/JM/mahtew.txt"; 

/** 
* one two three 
    Text to be appended with 
    five six seven 
    eight nine ten 
* 
* 
* @param args 
* @throws IOException 
*/ 
public static void main(String[] args) throws IOException 
{ 
    String starPrefix = "Text to be appended with"; 
    String replacedString = "new text has been appended"; 

    RandomAccessFile file = new RandomAccessFile(new File(PATHNAME), "rw"); 

    String line = ""; 
    while((line = file.readLine()) != null) 
    { 
     if(line.startsWith(starPrefix)) 
     { 
      file.seek(file.getFilePointer() - RECORD_LENGTH - 1); 
      file.writeBytes(replacedString); 
     } 

    } 
} 

public static void createFile() throws IOException 
{ 
    RandomAccessFile file = new RandomAccessFile(new File(PATHNAME), "rw"); 

    String line1 = "one two three"; 
    String line2 = "Text to be appended with"; 
    String line3 = "five six seven"; 
    String line4 = "eight nine ten"; 

    file.writeBytes(paddingRight(line1)); 
    file.writeBytes(CRLF); 
    file.writeBytes(paddingRight(line2)); 
    file.writeBytes(CRLF); 
    file.writeBytes(paddingRight(line3)); 
    file.writeBytes(CRLF); 
    file.writeBytes(paddingRight(line4)); 
    file.writeBytes(CRLF); 

    file.close(); 

    System.out.println(String.format("File is created in [%s]", PATHNAME)); 
} 

public static String paddingRight(String source) 
{ 
    StringBuilder result = new StringBuilder(100); 
    if(source != null) 
    { 
     result.append(source); 
     for (int i = 0; i < RECORD_LENGTH - source.length(); i++) 
     { 
      result.append(EMPTY_STRING); 
     } 
    } 

    return result.toString(); 
} 

}