如题:通过Java将字符内容写入到文件中,但是需要在文件的指定位置,所谓的指定位置就是:提前会在文件中添加一个开始标记和一个结束标记,然后要求将内容写入到这两个标记之间。
我的思路是,按行读取文件,找到位置后,开始写入,但现在的问题是,输入流获取的文件位置,能否传递给输出流?当然我也不确定这种方式是可行的,希望大家能给个说法。。。感激不尽!
RandomAccessFile 插入写示例:
/** * * @param skip 跳过多少过字节进行插入数据 * @param str 要插入的字符串 * @param fileName 文件路径 */ public static void beiju(long skip, String str, String fileName){ try { RandomAccessFile raf = new RandomAccessFile(fileName,"rw"); if(skip < 0 || skip > raf.length()){ System.out.println("跳过字节数无效"); return; } byte[] b = str.getBytes(); raf.setLength(raf.length() + b.length); for(long i = raf.length() - 1; i > b.length + skip - 1; i--){ raf.seek(i - b.length); byte temp = raf.readByte(); raf.seek(i); raf.writeByte(temp); } raf.seek(skip); raf.write(b); raf.close(); } catch (Exception e) { e.printStackTrace(); } }from: http://blog.csdn.net/akon_vm/article/details/7429245 ######回复 @雅典娜拉 : 你可以获取到你设置的开始标记跟结束标记的索引吧。这样还不行???######你提供的解决思路需要有一个前提就是:需要知道应该实现跳过的字节数。。。而这个字节数的获取我想也是比较麻烦的,不过还是很感谢!######思路来了:首先将文件内容按行读出来(当然,前提是文件不会太大...),然后在在内存中生成新的内容后写入文件..######嗯,您这种思路也挺好的,多谢指点######你可以考虑一边读一边输出为一个临时文件里面,最后renameTo过去,这样即使文件很大,内存损耗也比较小,最多就是多花点时间。######
使用 velocity .
Properties p = new Properties(); p.put(RuntimeConstants.RESOURCE_LOADER, "file"); // filename.txt 文件所在的目錄 p.put(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, "path/to/directory"); Velocity.init(p); // 文件中有個 $!{remark} 標記要被替換 Template template = Velocity.getTemplate("filename.txt"); // 對應 filename.txt 中的 $!{remark} VelocityContext context = new VelocityContext(); context.put("remark", "Hello!"); template.merge(context, new BufferedWriter(new OutputStreamWriter(new FileOutputStream("path/to/output.txt"), "UTF-8")));
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。