Java:
文件内容:RandomAccessFile raf = new RandomAccessFile("C:\\1.txt", "rw"); String s = raf.readLine(); long pointer =0; while(s!=null) { System.out.println(s); if(s.contains("py")) { raf.seek(pointer); raf.writeBytes("hello python"); } pointer = raf.getFilePointer(); s = raf.readLine(); }
hello world
hello c++
hello python
hello c
hello java
结果:
hello world
hello c++
hello pythonllo c
hello java
分析:RandomAccessFile是随机读取文件类,不涉及stream操作,涉及指针移动操作,修改文件内容可能丢失数据,见代码(覆盖掉了其所占位置的原来的字符)
利用流替换:
全部加载到内存中进行替换(用正则):
File f =new File("C:\\1.txt"); BufferedReader br = new BufferedReader(new FileReader(f)); StringBuffer src = new StringBuffer(); StringBuffer dst = new StringBuffer(); String line = null; while((line=br.readLine())!=null) { src.append(line); src.append(System.getProperty("line.separator"));//换行符 } Pattern p =Pattern.compile("py"); Matcher m = p.matcher(src); while(m.find()) { m.appendReplacement(dst, "python"); } m.appendTail(dst); BufferedWriter bw = new BufferedWriter(new FileWriter(f)); bw.write(dst.toString()); bw.flush(); br.close(); bw.close();
读一行,替换一行,写一行
File f =new File("C:\\Users\\Casey\\Desktop\\1.txt"); BufferedReader br = new BufferedReader(new FileReader(f)); BufferedWriter bw = new BufferedWriter(new FileWriter(f)); String line = null; while((line=br.readLine())!=null) { String newLine = line.replace("py", "python"); System.out.println(newLine); bw.write(newLine); bw.write(System.getProperty("line.separator"));//换行符 } bw.flush(); br.close(); bw.close();
上面的方法是不可以使用的,Java不支持对一个文件同时读写流操作。
应该先写入另外一个文件,再重命名。
File f =new File("C:\\Users\\Casey\\Desktop\\1.txt"); File f2 =new File("C:\\Users\\Casey\\Desktop\\2.txt"); BufferedReader br = new BufferedReader(new FileReader(f)); BufferedWriter bw = new BufferedWriter(new FileWriter(f2)); String line = null; while((line=br.readLine())!=null) { String newLine = line.replace("py", "python"); System.out.println(newLine); bw.write(newLine); bw.write(System.getProperty("line.separator"));//换行符 } bw.flush(); br.close(); bw.close(); if(f.exists()) { f.delete(); } f2.renameTo(f);