2013-04-12 42 views
1

我正在研究一個需要.doc或.pdf文件並將其轉換爲.txt的程序。從那裏,我使用java掃描儀來讀取文件,並用它來做我喜歡的事情。爲了轉換.doc和.pdf,我使用Runtime.getRuntime().exec("textutil")來轉換文件。在java中通過mac終端操作文件

但是,當我嘗試轉換名稱中包含空格的文件時出現問題。它基本上需要一個帶有段落問題和答案的文件,並且一次只讀一個句子,而不是完全優雅。下面是代碼:

//it has to do with the space in the file name, i suppose i could just rename each file i plan on using 
import java.io.*; 
import java.util.Scanner; 
import java.util.Arrays; 

public class AClass 
{ 
    public static void main(String[] args) 
    { 
     String fileName="/Users/name/Documents/Quizzes/Finals 1.doc"; // a default string 
     try 
     { 
     String s="textutil -convert txt "+correct(fileName); //see function correct 
     System.out.println(s); //prints the string, if I copy and paste it into terminal it DOES execute 
     Process proc=Runtime.getRuntime().exec(s);   //executes in terminal, don't look into this... it works 
    } catch (Exception e) { System.out.println("Conversion failed");} 
    File file=new File(fileName); 
    Scanner reader=null; 
    Scanner keyboard=new Scanner(System.in); 
    try 
    { 
     reader=new Scanner(file); 
    } 
    catch (FileNotFoundException e) 
    { 
     System.out.println(e.getMessage()); 
     System.out.println("Save the file to "+fileName); 
     System.exit(0); 
    } 
    System.out.println("Found the file!"); 
    System.out.println("Hit enter to read each sentence (otherwise it will quit). \nThe program will notify you when the answer is next\n"); 

    int qCount=0;      //just a counter 
    while (reader.hasNext())  //not eof 
    { 
     String line=reader.nextLine().trim(); 
     String[] sentences; 
     //System.out.println(line); 
     sentences=breakUp(line);  //break up the entire line into sentences[], this //function DOES work. 
     for (int i=0; i<sentences.length; i++) 
     { 
      String s=""; 
      if (!(line.equals("") || line.equals("\n"))) 
      { 
       s= keyboard.nextLine(); //hit enter to see each sentence, this loop works 
      } 
      if (!s.equals("")) //quit on non-null input 
      { 
       System.out.println("Done"); 
       System.exit(0); 
      } 
      if (sentences[i].toLowerCase().indexOf("answer") != -1)  //if answer is in the sentence 
      { 
       System.out.println("\nThe answer is next, hit enter again to see it"); 
       keyboard.nextLine(); 
       System.out.println(sentences[i]); 
       qCount++; 
      } 
      else 
      { 
       int max=120;     //simple formatting (output window doesn't //auto \n for lines) 
       if (sentences[i].length()<max) 
        System.out.println(sentences[i]); 
       else 
       { 
        for (int j=0; j<sentences[i].length(); j+=max) 
        { 
         if (j+max>sentences[i].length()) 
          System.out.println(sentences[i].substring(j, sentences[i].length())); 
         else 
          System.out.println(sentences[i].substring(j, j+max)); 
        } 
       } 
      } 
     } 
    } 

    System.out.println("End of file"); 
    System.out.println("Total questions="+qCount); 
} 

public static String[] breakUp(String line)  //this function works, finds periods 
{ 
    if ((line.equals("") || line.equals(null)) || line.length()<2) 
     return new String[] {""}; 
    String[] tempSents=new String[500]; 
    int count=0; 
    int pos=0; 
    int dotPos=line.indexOf(".", pos); 
    while (dotPos != -1 && count<tempSents.length) 
    { 
     tempSents[count]=line.substring(pos, dotPos+1); 
     pos=dotPos+1; 
     dotPos=line.indexOf(".", pos); 
     count++; 
    } 
    if (count==0) 
     return new String[] {line}; 
    else 
    { 
     tempSents[count]=line.substring(pos); 
     count++; 
    } 
    return Arrays.copyOf(tempSents, count); 
} 

public static String correct(String s) //this function works, it adds a '\' in front of //a space so that when it is passed to the terminal it is proper syntax 
{ 
    for (int i=0; i<s.length(); i++) 
    { 
     if (s.charAt(i)==' ') 
     { 
      s=s.substring(0, i)+"\\"+s.substring(i); 
      i++; 
      if (i<=s.length()) 
       return s.trim(); 
     } 
    } 
    return s.trim(); 
} 
} 

同樣,當我打印出來,我進入exec和複製並粘貼到終端的字符串,它不正確執行,但是什麼也沒有發生過運行命令(用於處理文件名字中的空格,否則就起作用)。 在此先感謝

+0

當你'System.exit(0)'一樣,你應該打印到'System.err',而不是'System.out'。否則,您的輸出可能會丟失。 –

+0

也嘗試簡化您的代碼,以便查看它的人員只能看到導致錯誤的部分。 –

回答

0

嘗試轉義文件名中的空格。使用類似"file\\ name.doc" 您可以優化您的正確的(string)方法:string.replaceAll(" ", "\\ ");