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的内容为: -
您好
无法运行程序“abc.txt”:CreateProcess error = 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()) ;
}
}
}
____
答案 0 :(得分:2)
我假设调用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代码并使用javac编译它
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 :(得分:1)
在执行文件之前关闭文件(并且不要重定向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());
答案 2 :(得分:0)
在尝试执行之前关闭FileOutputStream
(或PrintStream
)。
答案 3 :(得分:0)
您的程序创建的是文本文件,而不是可执行文件。可执行文件是操作系统知道如何执行的二进制文件(或在某些情况下是具有特殊标头的脚本)。我不确定当你执行一个内容为“Hello \ n”的文本文件时你会发生什么。
您正在将stdout(标准输出)重定向到您的文件。稍后,您将异常堆栈跟踪打印到stdout,这就是跟踪出现在文件中的原因。您可能更有意义直接写入文件,而不是重定向stdout。
答案 4 :(得分:0)
假设您在Windows上运行,而不是
Process p = Runtime.getRuntime().exec(f.getPath());
你可以使用
Process p = Runtime.getRuntime().exec("start " + f.getPath());
应该选择与.txt文件关联的任何应用程序。