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和複製並粘貼到終端的字符串,它不正確執行,但是什麼也沒有發生過運行命令(用於處理文件名字中的空格,否則就起作用)。 在此先感謝
當你'System.exit(0)'一樣,你應該打印到'System.err',而不是'System.out'。否則,您的輸出可能會丟失。 –
也嘗試簡化您的代碼,以便查看它的人員只能看到導致錯誤的部分。 –