我正在开发一个带有.doc或.pdf文件并将其转换为.txt的程序。从那里,我使用java扫描程序来读取文件,并按照我喜欢的方式处理它。为了转换.doc和.pdf,我使用Runtime.getRuntime().exec("textutil")
来转换文件。
但是,当我尝试转换名称中包含空格的文件时,会出现问题。它基本上需要一个带有段落问题和答案的文件,并且一次只能读回一个句子,而不是完全优雅。这是代码:
//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 :(得分:0)
尝试转义文件名中的空格。使用"file\\ name.doc"
之类的内容
您可以优化正确的(字符串)方法:string.replaceAll(" ", "\\ ");