1

我正在开发一个程序,该程序采用 .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 的字符串并将其复制并粘贴到终端时,它确实可以正确执行,但是通过运行时命令没有任何反应(对于名称中带有空格的文件,否则它会起作用)。提前致谢

4

1 回答 1

0

尝试转义文件名中的空格。使用类似的东西"file\\ name.doc" 你可以优化你的正确(字符串)方法:string.replaceAll(" ", "\\ ");

于 2013-04-12T22:19:01.933 回答