выполнение динамически созданного файла - PullRequest
1 голос
/ 17 июня 2009
import java.io.*;

public class Demo{

    public static void main(String[] args){
        File f = new File("abc.txt") ;

        try{
            System.setOut(new PrintStream( new FileOutputStream(f) ) ) ;
        }
        catch(FileNotFoundException fnfe){
            System.out.println(fnfe.getMessage()) ;
        }

        System.out.println("Hello\n") ;

        try{
            //throwing exception,
            //is there any method to close the f File,
            //before we try to open the file referred by f.
            Process p = Runtime.getRuntime().exec(f.getPath()) ;
        }
        catch(IOException io){
            System.out.println(io.getMessage()) ;
        }
    }

}

, а содержимое abc.txt после выполнения демонстрации составляет: -

Hello

Невозможно запустить программу "abc.txt": ошибка CreateProcess = 32, процесс не может получить доступ к файлу, поскольку он используется другим процессом

как избежать исключения .....

как предложили многие люди, я попробовал следующий код, но, к сожалению, даже это также бросает исключение ....: - (

import java.io.*;

class Demo{

    public static void main(String[] args){
        File f = new File("abc.txt") ;

        FileOutputStream fos = null ;
        try{
            fos = new FileOutputStream(f) ; 
        }
        catch(FileNotFoundException fnfe){
            System.out.println(fnfe.getMessage()) ;
        }

        PrintStream ps = new PrintStream(fos) ;
        ps.println("Hello") ;

        try{
            fos.close() ;

            //throwing exception again
            Process p = Runtime.getRuntime().exec(f.getAbsolutePath()) ;
        }
        catch(IOException io){
            System.out.println(io.getMessage()) ;
        } 
    }
}

??????????

Ответы [ 5 ]

2 голосов
/ 17 июня 2009

Я предполагаю, что причина для вызова Runtime.getRuntime (). Exec (f.getPath ()); это открыть файл abc.txt в текстовом редакторе. Было бы лучше предоставить полную команду для открытия текстового редактора вместе с путем к файлу. Я попробовал это с notepad.exe (windows), и это сработало.

import java.io.*;

public class Demo{

    public static void main(String[] args){
        File f = new File("abc.txt") ;

        try{
                System.setOut(new PrintStream( new FileOutputStream(f) ) ) ;
        }
        catch(FileNotFoundException fnfe){
                System.out.println(fnfe.getMessage()) ;
        }

        System.out.println("Hello\n") ;

        try{
                Process p = Runtime.getRuntime().exec("notepad.exe " + f.getPath()) ;
        }
        catch(IOException io){
                System.out.println(io.getMessage()) ;
        }
    }

}

Следующий код динамически генерирует код Java и использует его для компиляции

import java.io.*;

public class Demo{

    public static void main(String[] args){

        File f = new File("Abc.java") ;
        PrintWriter writer = null;
        BufferedReader reader = null;
        InputStream pStream = null;

        try{
                // Open File Stream and write code
                writer = new PrintWriter( new FileOutputStream(f) );
                String javaCode = "public class Abc { \r\n" +
                                  "public static void main(String[] args) {\r\n" +
                                  "System.out.println(\"Hello World!\");\r\n" +
                                  "}\r\n" +
                                  "}\r\n";

                writer.println(javaCode) ;
                writer.close();

                // Run Javac to compile the code
                Process p = Runtime.getRuntime().exec("javac " + f.getPath()) ;
                p.waitFor();

                // status = 0 => Process executed without errors
                //        = 1 => Process executed with errors
                int status = p.exitValue();
                if( status ==  0 )
                {
                    pStream = p.getInputStream();
                }
                else
                {
                    pStream = p.getErrorStream();
                }

                // Display the output from the process
                reader = new BufferedReader(new InputStreamReader(pStream));
                String ln = null;
                while( (ln = reader.readLine()) != null )
                {
                    System.out.println(ln);
                }
        }
        catch(Exception ex){
                System.out.println(ex.getMessage()) ;
        }
        finally{
            try{
               if( writer != null ){writer.close();}
                if( pStream != null ){pStream.close();}
                if( reader != null ){reader.close();}
            }
            catch(Exception ex){
                System.out.println(ex.getMessage()) ;
            }
        }
    }
}
1 голос
/ 17 июня 2009

Закройте файл перед его выполнением (и не перенаправляйте System.out):

f = new File("abc.txt");
FileOutputStream fos = new FileOutputStream(f);

// You would likely use fos.write instead, but here we go
PrintStream ps = new PrintStream(fos);
ps.println("Hello\n");

fos.close();

Process p = Runtime.getRuntime().exec(f.getPath());
0 голосов
/ 17 июня 2009

при условии, что вы работаете в Windows вместо

Process p = Runtime.getRuntime().exec(f.getPath());

вы можете использовать

Process p = Runtime.getRuntime().exec("start " + f.getPath());

, который должен выбрать любое приложение, которое вы связали с файлами .txt.

0 голосов
/ 17 июня 2009
  1. Ваша программа создала текстовый файл, а не исполняемый файл. Исполняемый файл - это двоичный файл (или в некоторых случаях сценарий со специальным заголовком), который операционная система знает, как выполнить. Я не уверен, что должно произойти, когда вы запустите текстовый файл с содержимым «Hello \ n».

  2. Вы перенаправляете стандартный вывод в свой файл. Позже вы распечатали трассировку стека исключений в stdout, поэтому трассировка появляется в вашем файле. Возможно, для вас было бы более разумно писать напрямую в файл, а не перенаправлять стандартный вывод.

0 голосов
/ 17 июня 2009

Закройте FileOutputStream (или PrintStream), прежде чем пытаться выполнить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...