2013-03-13 109 views
0

所以我有这个.jar文件,我试图通过Windows 7命令提示符运行。我可以使用命令java -jar myJar.jar运行它,并开始运行。然后我要求用户输入文件名(用于测试目的,这是testFile1.asm),并显示以下信息:java - 无法从命令提示符打开.asm文件?

(文件名,目录名或卷标语法不正确)ASM
           在java.io.FileInputStream.open(本机方法)
           在java.io.FileInputStream中。(INIT)(未知源)
           在java.io.FileInputStream中。(INIT)(未知源)
           在java.io.FileReader。(INIT)(未知源)
           在汇编.firstPass(Assembler.jgava:33)
           在Assembler.main(Assembler.java:29)

它在我的Linux终端上运行良好,但我需要在Windows cmd上运行,所以我的教授可以看到它的工作原理。如果它是相关的,这是我的java类。

import java.io.*; 
public class Assembler { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws IOException { 
    int x; 
    System.out.println("Please enter a file name."); 
    String file =""; 
    for(int i = 0; ;i++){ 
     x = System.in.read(); 
     if (x == -1 || x == 10){ 
      break; 
     } 
     file = file + (char)x; 
    } 
    firstPass(file); 
} 

static private void firstPass(String url) throws FileNotFoundException, IOException{ 
    BufferedReader reader = new BufferedReader(new FileReader(url)); 
    Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("symbol_table.txt"), "utf-8")); 
    int LC = 0; 
    String currLine = reader.readLine(); 
    while(currLine != null){ 
     if(currLine.charAt(3) != ','){   //No Label present 
      if(currLine.contains("ORG")){  //ORG is present 
       LC = Integer.parseInt(currLine.substring(9,12)); 
       LC++; 
      } 
      else if(currLine.contains("END")){ 
       //secondPass(); 
       break; 
      } 
      else { 
       LC++; 
      } 
     } 
     else{         //Label is present 
      writer.write(currLine.substring(0,3) + " " + LC +"\r\n"); 
      LC++; 
     }    
     currLine = reader.readLine(); 
    } 
    writer.close(); 
    } 
} 
+1

这是从stdin获取字符串的冗长方式。你是否证实你传递了你认为你的文件名?该文件是否位于相同的目录中?您是否考虑到Windows和Linux为EOL使用不同的字符? (CR诉CRLF) – 2013-03-13 01:58:28

+0

我建议从问题中删除汇编标记。虽然你似乎正在编写汇编程序,但这样的问题与汇编语言编程无关。 – Michael 2013-03-13 06:47:37

+0

当你确切地知道块需要被执行多少次时,才会使用'for for'循环,在没有结束条件的情况下使用它们并在其中使用'break'是无稽之谈。改为使用“while”。 – BackSlash 2013-03-13 16:46:20

回答

0

在Windows上是CR LF(ascii 13 then ascii 10)。在linux和cygwin中,只是LF。所以你需要检查x == 13。

0

这行:

if (x == -1 || x == 10){ 

InputStream API

公共抽象INT阅读()

返回: 数据的下一个字节,或-1,如果流的结束已到达。

打印url的值以确认。

read()方法甚至会返回您输入的换行符。这在Windows和Linux中处理方式不同。使用BufferedReader并尝试readLine()方法,或类似的东西。

相关问题