Эта страница дает ответ, который да . http://math.stackexchange.com , похоже, не соблюдает \(\require{foo}\)
, но приведенная выше ссылка говорит вам, как добавить любой пакет в конфигурацию для вашего сайта.
Если вы не являетесь администратором сайта, вам, конечно, придется убедить всех, кто хочет установить пакет.
Это был довольно странный трюк, который сработал. Дело в том, что когда я предварительно прочитал содержимое файла, я использовал BufferedReader
. После прочтения я закрыл буфер.
Тем временем я переключился и теперь читаю контент, используя FileInputStream
. Также после прочтения закрываю поток. И теперь это работает.
Проблема в том, что у меня нет объяснения этому.
Я не знаю, что BufferedReader
и FileOutputStream
несовместимы.
Нет причин, по которым вы не можете удалить этот файл. Я бы посмотрел, кто держит этот файл. В unix / linux вы можете использовать утилиту lsof, чтобы проверить, какой процесс заблокировал файл. В Windows вы можете использовать проводник процессов.
для lsof, это так же просто, как сказать:
lsof /path/and/name/of/the/file
для проводника процессов вы можете использовать меню поиска и ввести имя файла, чтобы показать вам дескриптор, который укажет вам на процесс блокировка файла.
вот код, который делает то, что, как мне кажется, вам нужно:
FileOutputStream to;
try {
String file = "/tmp/will_delete.txt";
to = new FileOutputStream(file );
to.write(new String("blah blah").getBytes());
to.flush();
to.close();
File f = new File(file);
System.out.print(f.delete());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Он отлично работает в OS X. Я не тестировал его в Windows, но подозреваю, что он должен работать и в Windows. Я также признаю, что наблюдал неожиданное поведение при обработке файлов Windows.
Как прокомментировал Джон Скит, вам следует закрыть свой файл в блоке finally {...}, чтобы он всегда был закрыт. И вместо того, чтобы проглатывать исключения с помощью e.printStackTrace, просто не улавливайте и не добавляйте исключение в сигнатуру метода. Если вы не можете по какой-либо причине, по крайней мере, сделайте это:
catch(IOException ex) {
throw new RuntimeException("Error processing file XYZ", ex);
}
Теперь, вопрос №2:
Что, если вы сделаете это:
...
to.close();
System.out.println("Please delete the file and press <enter> afterwards!");
System.in.read();
...
Сможете ли вы удалить файл?
Также, файлы сбрасываются, когда они закрываются. Я использую IOUtils.closeQuietly (...), поэтому я использую метод flush, чтобы убедиться, что содержимое файла присутствует, прежде чем я попытаюсь закрыть его (IOUtils.closeQuietly не вызывает исключений). Примерно так:
...
try {
...
to.flush();
} catch(IOException ex) {
throw new CannotProcessFileException("whatever", ex);
} finally {
IOUtils.closeQuietly(to);
}
Итак, я знаю, что содержимое файла находится там. Поскольку для меня обычно важно, чтобы содержимое файла было записано, а не то, можно ли закрыть файл или нет, на самом деле не имеет значения, был ли файл закрыт или нет. В вашем случае, если это имеет значение, я бы порекомендовал закрыть файл самостоятельно и обработать любые исключения соответственно.
Надеюсь, это поможет. Я столкнулся с аналогичной проблемой, когда я не мог удалить свой файл после того, как мой java-код скопировал содержимое в другую папку. После обширного поиска в Google я явно объявил все переменные, относящиеся к отдельной файловой операции, и вызвал метод close () каждого объекта файловой операции и установил для них значение NULL. Затем есть функция под названием System.gc (), которая очищает отображение файлового ввода-вывода (я не уверен, я просто говорю, что указано на веб-сайтах).
Вот мой пример кода :
public void start() {
File f = new File(this.archivePath + "\\" + this.currentFile.getName());
this.Copy(this.currentFile, f);
if(!this.currentFile.canWrite()){
System.out.println("Write protected file " +
this.currentFile.getAbsolutePath());
return;
}
boolean ok = this.currentFile.delete();
if(ok == false){
System.out.println("Failed to remove " + this.currentFile.getAbsolutePath());
return;
}
}
private void Copy(File source, File dest) throws IOException {
FileInputStream fin;
FileOutputStream fout;
FileChannel cin = null, cout = null;
try {
fin = new FileInputStream(source);
cin = fin.getChannel();
fout = new FileOutputStream(dest);
cout = fout.getChannel();
long size = cin.size();
MappedByteBuffer buf = cin.map(FileChannel.MapMode.READ_ONLY, 0, size);
cout.write(buf);
buf.clear();
buf = null;
cin.close();
cin = null;
fin.close();
fin = null;
cout.close();
cout = null;
fout.close();
fout = null;
System.gc();
} catch (Exception e){
this.message = e.getMessage();
e.printStackTrace();
}
}