如何读取二进制文件,修改相同的文件并保存文件并进行修改?

时间:2017-02-20 16:03:47

标签: java readfile

我目前正在开发一个项目,我们已将其划分为模块,其中一个模块中,我们有一个文件(.exe)扩展名。我决定以二进制格式打开它并读取它的内容,修改它们。但是,我不是要修改更改并将其保存在同一个文件中。当我试图这样做时,它说0KB。使用两个文件时,它的工作正常。

以下是源代码:

public static void main(String[] args) {

    String strSourceFile="E:/e.exe";
    String strDestinationFile="E:/f.exe";
    try
    {
            FileInputStream fin = new FileInputStream(strSourceFile);

            FileOutputStream fout = new FileOutputStream(strDestinationFile);

            byte[] b = new byte[1];
            int noOfBytes = 0;

            System.out.println("Copying file using streams");

            while( (noOfBytes = fin.read(b)) != -1 )
            {   
                    fout.write(b, 0, noOfBytes);
            }
            System.out.println("File copied!");

            //close the streams
            fin.close();
            fout.close(); 

2 个答案:

答案 0 :(得分:0)

使用RandomAccessFile或您也可以创建一个包含更改的新文件并将其保存并删除原始文件。删除原始文件后,将此新文件重命名为原始文件。

答案 1 :(得分:0)

您正在尝试使用输入和输出流读取和写入相同的文件,以便在尝试使用同一文件执行此操作时不会复制该文件。相反,使用中间文件作为缓冲区,如下面的代码我使用f.exe作为中间缓冲区,接下来我将数据从缓冲区文件再次复制到原始文件jar.exe,最后你需要删除缓冲区文件。

以下是代码:

        String strSourceFile = "C:/jar.exe";
        String strDestinationFile = "C:/f.exe";

        FileInputStream fin = new FileInputStream(strSourceFile);

        FileOutputStream fout = new FileOutputStream(strDestinationFile);

        byte[] b = new byte[1];
        int noOfBytes = 0;

        System.out.println("Copying file using streams");

        while ((noOfBytes = fin.read(b)) != -1) {
            fout.write(b, 0, noOfBytes);
        }

        fin.close();
        fout.close();
        String strDestinationFile1 = "C:/jar.exe";
        FileInputStream fin1 = new FileInputStream(strDestinationFile);
        FileOutputStream fout1 = new FileOutputStream(strDestinationFile1);

        while ((noOfBytes = fin1.read(b)) != -1) {
            fout1.write(b, 0, noOfBytes);
        }
        System.out.println("File copied!");

        //close the streams
        fin1.close();
        fout1.close();

        File file = new File("C:/f.exe");
        file.delete();