Daha sonra atabileceğimiz bir dizi dosya oluşturmamız gerektiğinde, geçici dizinler işe yarar. Geçici dizinler oluşturduğumuzda, onları nereye koyacağımızı işletim sistemine devredebilir veya nereye yerleştirmek istediğimizi kendimiz belirleyebiliriz.

Bu kısa eğiticide, farklı API'ler ve yaklaşımlar kullanarak Java'da geçici dizinler oluşturmayı öğreneceğiz . Bu eğitimdeki tüm örnekler düz Java 7+, Guava ve Apache Commons IO kullanılarak gerçekleştirilecektir .

2. İşletim Sistemine Yetki Verin

Geçici dizinler oluşturmak için kullanılan en popüler yaklaşımlardan biri, hedefi temeldeki işletim sistemine delege etmektir. Konum java.io.tmpdir özelliği tarafından verilir ve her işletim sisteminin kendi yapısı ve temizleme rutinleri vardır.

Düz Java'da, dizinin almasını istediğimiz öneki belirterek bir dizin oluştururuz:

String tmpdir = Files.createTempDirectory("tmpDirPrefix").toFile().getAbsolutePath();
String tmpDirsLocation = System.getProperty("java.io.tmpdir");
assertThat(tmpdir).startsWith(tmpDirsLocation);

Guava'yı kullanarak süreç benzerdir, ancak dizinimize nasıl önek eklemek istediğimizi belirleyemeyiz:

String tmpdir = Files.createTempDir().getAbsolutePath();
String tmpDirsLocation = System.getProperty("java.io.tmpdir");
assertThat(tmpdir).startsWith(tmpDirsLocation);

Apache Commons IO, geçici dizinler yaratmanın bir yolunu sağlamaz. İşletim sisteminin geçici dizinini almak için bir sarmalayıcı sağlar ve sonra gerisini yapmak bize bağlıdır:

String tmpDirsLocation = System.getProperty("java.io.tmpdir");
Path path = Paths.get(FileUtils.getTempDirectory().getAbsolutePath(), UUID.randomUUID().toString());
String tmpdir = Files.createDirectories(path).toFile().getAbsolutePath();
assertThat(tmpdir).startsWith(tmpDirsLocation);

Mevcut dizinlerle isim çatışmalarını önlemek için, rasgele bir isimle bir dizin oluşturmak için UUID.randomUUID () kullanırız.

3. Konumu Belirleme

Bazen geçici dizinimizi nerede yaratmak istediğimizi belirtmemiz gerekir. İyi bir örnek, Maven yapımı sırasında. Zaten "geçici" bir yapı hedef dizinimiz olduğundan, yapımızın ihtiyaç duyabileceği geçici dizinleri yerleştirmek için bu dizini kullanabiliriz:

Path tmpdir = Files.createTempDirectory(Paths.get("target"), "tmpDirPrefix");
assertThat(tmpdir.toFile().getPath()).startsWith("target");

Hem Guava hem de Apache Commons IO, belirli konumlarda geçici dizinler oluşturma yöntemlerinden yoksundur.

Belirterek It değerinde hedef dizin oluşturma yapılandırmasına bağlı olarak farklı olabilir . Bunu kurşun geçirmez yapmanın bir yolu, hedef dizin konumunu testi çalıştıran JVM'ye iletmektir.

İşletim sistemi temizleme işlemiyle ilgilenmediğinden , File.deleteOnExit () işlevini kullanabiliriz :

tmpdir.toFile().deleteOnExit();

Bu şekilde, JVM sona erdiğinde dosya silinir, ancak yalnızca sonlandırma uygunsa .

4. Farklı Dosya Niteliklerini Kullanma

Diğer herhangi bir dosya veya dizin gibi, geçici bir dizin oluşturulduktan sonra dosya özniteliklerini belirtmek mümkündür. Bu nedenle, yalnızca onu oluşturan kullanıcı tarafından okunabilen geçici bir dizin oluşturmak istiyorsak, bunu gerçekleştirecek nitelikler kümesini belirleyebiliriz:

FileAttribute<Set> attrs = PosixFilePermissions.asFileAttribute(
  PosixFilePermissions.fromString("r--------"));
Path tmpdir = Files.createTempDirectory(Paths.get("target"), "tmpDirPrefix", attrs);
assertThat(tmpdir.toFile().getPath()).startsWith("target");
assertThat(tmpdir.toFile().canWrite()).isFalse();

Beklendiği gibi Guava ve Apache Commons IO, geçici dizinler oluştururken öznitelikleri belirtmek için bir yol sağlamaz.

Ayrıca, önceki örneğin Unix veya macOS gibi bir Posix Uyumlu Dosya Sistemi altında olduğumuzu varsaydığını da belirtmek gerekir.

Dosya öznitelikleri hakkında daha fazla bilgi NIO2 Dosya Özniteliği API'leri Kılavuzumuzda bulunabilir .

5. Sonuç

Bu kısa eğiticide, basit Java 7+, Guava ve Apache Commons IO'da geçici dizinlerin nasıl oluşturulacağını keşfettik. Basit Java'nın, ayrıntı düzeyini minimumda tutarken daha geniş olasılıklar sunduğu için geçici dizinler oluşturmanın en esnek yolu olduğunu gördük.

Her zaman olduğu gibi, bu eğiticinin tüm kaynak kodu GitHub'da mevcuttur .