用Java将字符串复制到文件的开头
我想在文件的开头写一个字符串,我该怎么做 我根本不知道如何添加字符串。。这就是我目前所做的:用Java将字符串复制到文件的开头,java,file,Java,File,我想在文件的开头写一个字符串,我该怎么做 我根本不知道如何添加字符串。。这就是我目前所做的: public static void prepend (String filename, String data) throws IOException{ FileOutputStream file= new FileOutputStream(filename); } (i) write()方法只接受字节-我应该怎么做才能在我的情况下使用它 (ii)-如何将字符串复制到文件的开头 而且
public static void prepend (String filename, String data) throws IOException{
FileOutputStream file= new FileOutputStream(filename);
}
(i) write()
方法只接受字节-我应该怎么做才能在我的情况下使用它
(ii)-如何将字符串复制到文件的开头
而且-如果有人知道一个网站,它有所有的作者/读者和所有这些流安排和很好的解释-我会非常感激它,我正在失去理智
谢谢 你可以做很多事情 创建一个PrintStream,传入您创建的“文件”,然后使用println(数据)打印数据,或者如果不希望在后面添加依赖于系统的新行,则只打印(数据) 您可以创建outputstreamwriter来包装您创建的outputstream,然后使用printwriter包装它,以获得与上面相同的行为 如果您需要,writer方法在处理字符编码时会更好。要编写文本,您需要创建一个
writer
——例如输出流writer
。您可以改为使用FileWriter
,但我更喜欢将FileOutputStream
包装在OutputStreamWriter
中,因为这样我可以控制编码
但是,您不能真正预先添加到文件的开头-您必须将新文本写入新文件的开头,然后复制旧文件的内容,然后根据需要重命名文件。具体操作方式取决于现有文件的内容。您可以使用BufferedWriter,即
// read the existing contents of the file into a string builder
BufferedReader is = new BufferedReader
(new InputStreamReader(new FileInputStream(filename)));
StringBuilder sb = new StringBuilder();
String line;
while ((line = is.readLine()) != null) {
sb.append(line);
}
// open the file for writing
BufferedWriter s = new BufferedWriter
(new OutputStreamWriter(new FileOutputStream(filename)));
// prepend your text
s.writeLine("some line of text to prepend");
// rewrite the file contents
s.writeLine(sb.toString());
您可以使用RandomAccessFile类 下面是运行代码 私有静态void addHeader(文件名){
我建议不要使用
PrintStream
或PrintWriter
,除非你真的不想知道你的所有数据是什么时候由于异常而丢失的……好吧,我同意你的观点。我不认为从问题的描述来看,这会影响到这个特定的人,但正如我所说的,我完全同意你的观点这是您关于接受异常的声明。您忘了在InputStreamReader
和OutputStreamWriter
中指定字符编码。StringBuilder是否会将所有文件复制为一个大行?这难道不是一个问题吗?我们可以将其复制到新文件吗?如果您的文件很大,我想可能是一个问题问题。您也可以逐行复制到新文件,并在最后重命名该文件。可以想象(尤其是对于小文件),您可以将文件的内容读入内存,用“预写”覆盖原始文件文本,然后转储您最初读入的内容。当然,这会降低大文件的内存消耗,而且不会立即出现安全问题。但在文件io价格昂贵的系统上,这是一种替代方法。@glowcoder:嗯,它需要同样多的读写操作,但不需要太多的内存当然,同时还有h个磁盘空间。当您写入FileWriter时,fw=newFileWriter(f);它是否使f可写?还是生成新文件?因为在我的情况下,我确实有这个文件,所以我想知道会发生什么。thanks@Nir:它将覆盖现有文件,并将其截断。啊,我明白了。出于某种奇怪的原因,我想你会将新文件重新插入并吐出…现在太晚了(美国西海岸)把这也归咎于咖啡的缺乏……回想起来,如果你的内存膨胀,一些内容被写入光盘,那么它最终可能会出现在光盘上,事实上,这会让事情变得更糟!
public static void prepend(String filename,string data) throws IOException{
BufferedReader in = new BufferedReader(new FileReader(fileName));
StringBuilder reply = new StringBuilder();
reply.append(data);
String str = new String();
while( (str = in.readLine())!=null)
reply.append(str);
str = reply.toString();
BufferedWriter out= new BufferedWriter(new FileWriter(filename));
out.write(str);
if(in !=null){
try{ in.close();} catch(IOException e){e.printStackTrace();}
if(out!=null)
try{out.close();} catch(IOException ex) {ex.printStackTrace();}
}
public static void main(String[] args) throws Exception {
RandomAccessFile file = new RandomAccessFile("test.txt", "rws");
byte[] text = new byte[(int) file.length()];
file.readFully(text);
file.seek(0);
file.writeBytes("Prepend 8");
file.write(text);
file.close();
System.out.println("Done");
}
FileOutputStream fileOutputStream =null;
BufferedReader br = null;
FileReader fr = null;
String newFileName = fileName.getAbsolutePath() + "@";
try {
fileOutputStream = new FileOutputStream(newFileName);
fileOutputStream.write("yourCopiedDataHere".getBytes());
fr = new FileReader(fileName);
br = new BufferedReader(fr);
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
fileOutputStream.write(("\n"+sCurrentLine).getBytes());
}
fileOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileOutputStream.close();
if (br != null)
br.close();
if (fr != null)
fr.close();
System.out.println(fileName+" is deleted "+ fileName.delete());
new File(newFileName).renameTo(new File(newFileName.replace("@", "")));
} catch (IOException ex) {
ex.printStackTrace();
}
}
}