Я работаю над программой, которая принимает файл .doc или .pdf и преобразует его в .txt. Оттуда я использую java-сканер для чтения файла и делаю с ним то, что мне нравится. Для преобразования .doc и .pdf я использую Runtime.getRuntime().exec("textutil")
для преобразования файлов.Манипулирование файлами через терминал mac в java
Однако проблема возникает, когда я пытаюсь преобразовать файл, содержащий пробел в его имени. Он в основном берет файл с параграфами вопросов и ответов и читает их обратно к вам по одному предложению за раз, не совсем изящно. Вот код:
//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'. В противном случае ваш выход может быть потерян. –
также попробуйте упростить код, чтобы люди, которые смотрят на него, могут видеть только части, которые способствуют ошибке. –