用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();

        }

    }

}