Как я могу открыть FileInputStream, общий ресурс которого разрешен ReadWrite? - PullRequest
0 голосов
/ 09 июля 2020

In. Net Я могу открыть FileStream, для которого задано FileAccess.Read, FileShare.ReadWrite. Как я могу сделать то же самое в Java?

Files.newInoutStream () не поддерживает ни одну из этих возможностей.

Обновление: Позвольте мне объяснить, почему . У нас есть общий случай использования, когда наше приложение открывает файл DOCX, а Word открывает его для редактирования. Единственный способ Windows разрешить это из-за блокировок Word для файла - это FileAccess.Read и FileShare.ReadWrite.

И да, это опасно (было бы хорошо, если бы это был FileShare.Read). Но мир такой, какой он есть здесь, и на практике это отлично работает.

Но это означает, что мне нужно найти способ в Java открыть InputStream для этого файла, что существующие ограничения из-за Word, удерживающего его открыть требуется.

1 Ответ

0 голосов
/ 09 июля 2020

В java нет InoutStream.

Вероятно, вы ищете Files.newByteChannel:

import java.nio.ByteBuffer;
import java.nio.file.*;
import java.nio.charset.StandardCharsets;

class Snippet {
  public static void main(String[] args) throws Exception {
    Path path = Paths.get("test.txt");
    try (var channel = Files.newByteChannel(path, StandardOpenOption.WRITE, StandardOpenOption.READ)) {
      ByteBuffer bb = ByteBuffer.allocate(1024);
      channel.read(bb);
      // Note that 'read' reads 1 to x bytes depending on file system and
      // phase of the moon.
      bb.flip();
      System.out.println("Read: " + StandardCharsets.UTF_8.decode(bb));
      bb.clear();

      channel.position(0);
      channel.write(StandardCharsets.UTF_8.encode("Hello, World!"));

      channel.position(0);
      channel.read(bb);
      bb.flip();
      System.out.println("Read: " + StandardCharsets.UTF_8.decode(bb));
    }
  }
}

создайте файл с именем 'test.txt', поместите во всем, что вам нравится, затем запустите это. Он напечатает все, что есть, а затем перезапишет его с помощью Hello, World!.

Обратите внимание, что вызов чтения гарантированно прочитает как минимум 1 байт, но не обязательно заполнит весь буфер, даже если файл такой большой: идея состоит в том, что вы читаете один «блок», который операционная система и файловая система могут эффективно передать за одну операцию. Вам нужно будет добавить несколько циклов, если вы хотите прочитать гарантированный минимум или даже весь файл.

...