Apache Commons IO

1. Ikhtisar

Proyek Apache Commons dibuat untuk menyediakan sekumpulan pustaka umum bagi pengembang yang dapat mereka gunakan dalam kode sehari-hari.

Dalam tutorial ini, kita akan menjelajahi beberapa kelas utilitas utama dari modul Commons IO dan fungsinya yang paling terkenal.

2. Ketergantungan Maven

Untuk menggunakan pustaka, mari sertakan dependensi Maven berikut di pom.xml :

 commons-io commons-io 2.5 

Versi terbaru perpustakaan dapat ditemukan di Maven Central.

3. Kelas Utilitas

Sederhananya, kelas utilitas menyediakan kumpulan metode statis yang dapat digunakan untuk melakukan tugas umum pada file .

3.1. FileUtils

Kelas ini menyediakan operasi yang berbeda pada file, seperti membuka, membaca, menyalin, dan memindahkan.

Mari kita lihat cara membaca atau menyalin file menggunakan FileUtils :

File file = FileUtils.getFile(getClass().getClassLoader() .getResource("fileTest.txt") .getPath()); File tempDir = FileUtils.getTempDirectory(); FileUtils.copyFileToDirectory(file, tempDir); File newTempFile = FileUtils.getFile(tempDir, file.getName()); String data = FileUtils.readFileToString(newTempFile, Charset.defaultCharset());

3.2. FilenameUtils

Utilitas ini menyediakan cara agnostik sistem operasi untuk menjalankan fungsi umum pada nama file . Mari kita lihat beberapa metode berbeda yang dapat kita manfaatkan:

String fullPath = FilenameUtils.getFullPath(path); String extension = FilenameUtils.getExtension(path); String baseName = FilenameUtils.getBaseName(path);

3.3. FileSystemUtils

Kita dapat menggunakan FileSystemUtils untuk memeriksa ruang kosong pada volume atau drive tertentu :

long freeSpace = FileSystemUtils.freeSpaceKb("/");

4. Input dan Output

Paket ini menyediakan beberapa implementasi untuk bekerja dengan aliran input dan output .

Kami akan fokus pada TeeInputStream dan TeeOutputSteam . Kata " Tee " (berasal dari huruf " T ") biasanya digunakan untuk menjelaskan bahwa satu masukan akan dipecah menjadi dua keluaran yang berbeda.

Mari kita lihat contoh yang menunjukkan bagaimana kita dapat menulis aliran input tunggal ke dua aliran output yang berbeda :

String str = "Hello World."; ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes()); ByteArrayOutputStream outputStream1 = new ByteArrayOutputStream(); ByteArrayOutputStream outputStream2 = new ByteArrayOutputStream(); FilterOutputStream teeOutputStream = new TeeOutputStream(outputStream1, outputStream2); new TeeInputStream(inputStream, teeOutputStream, true) .read(new byte[str.length()]); assertEquals(str, String.valueOf(outputStream1)); assertEquals(str, String.valueOf(outputStream2));

5. Filter

Commons IO menyertakan daftar filter file yang berguna. Ini bisa berguna ketika pengembang ingin mempersempit ke daftar file tertentu yang diinginkan dari daftar file yang heterogen.

Pustaka juga mendukung operasi logika AND dan OR pada daftar file tertentu. Oleh karena itu, kami dapat mencampur dan mencocokkan filter ini untuk mendapatkan hasil yang diinginkan.

Mari kita lihat contoh yang menggunakan WildcardFileFilter dan SuffixFileFilter untuk mengambil file yang memiliki " ple " dalam namanya dengan akhiran " txt ". Perhatikan bahwa kami membungkus filter di atas menggunakan ANDFileFilter :

@Test public void whenGetFilewith_ANDFileFilter_thenFind_sample_txt() throws IOException { String path = getClass().getClassLoader() .getResource("fileTest.txt") .getPath(); File dir = FileUtils.getFile(FilenameUtils.getFullPath(path)); assertEquals("sample.txt", dir.list(new AndFileFilter( new WildcardFileFilter("*ple*", IOCase.INSENSITIVE), new SuffixFileFilter("txt")))[0]); }

6. Pembanding

The Comparator paket menyediakan berbagai jenis perbandingan pada file . Kami akan menjelajahi dua pembanding yang berbeda di sini.

6.1. PathFileComparator

Kelas PathFileComparator dapat digunakan untuk mengurutkan daftar atau array file berdasarkan jalurnya baik dengan cara yang case-sensitive, case-sensitive, atau system-dependent case-sensitive. Mari kita lihat cara mengurutkan jalur file di direktori sumber daya menggunakan utilitas ini:

@Test public void whenSortDirWithPathFileComparator_thenFirstFile_aaatxt() throws IOException { PathFileComparator pathFileComparator = new PathFileComparator( IOCase.INSENSITIVE); String path = FilenameUtils.getFullPath(getClass() .getClassLoader() .getResource("fileTest.txt") .getPath()); File dir = new File(path); File[] files = dir.listFiles(); pathFileComparator.sort(files); assertEquals("aaa.txt", files[0].getName()); }

Perhatikan bahwa kami telah menggunakan konfigurasi IOCase.INSENSITIVE . PathFileComparator juga menyediakan sejumlah instance tunggal yang memiliki opsi sensitivitas huruf dan terbalik yang berbeda .

Bidang statis ini termasuk PATH_COMPARATOR, PATH_INSENSITIVE_COMPARATOR, PATH_INSENSITIVE_REVERSE, PATH_SYSTEM_COMPARATOR, dan masih banyak lagi.

6.2. SizeFileComparator

SizeFileComparator , seperti namanya, digunakan untuk membandingkan ukuran (panjang) dari dua file . Ini mengembalikan nilai integer negatif jika ukuran file pertama lebih kecil dari file kedua. Ini mengembalikan nol jika ukuran file sama dan nilai positif jika ukuran file pertama lebih besar dari ukuran file kedua.

Mari tulis pengujian unit yang menunjukkan perbandingan ukuran file:

@Test public void whenSizeFileComparator_thenLargerFile_large() throws IOException { SizeFileComparator sizeFileComparator = new SizeFileComparator(); File largerFile = FileUtils.getFile(getClass().getClassLoader() .getResource("fileTest.txt") .getPath()); File smallerFile = FileUtils.getFile(getClass().getClassLoader() .getResource("sample.txt") .getPath()); int i = sizeFileComparator.compare(largerFile, smallerFile); Assert.assertTrue(i > 0); }

7. Monitor File

Paket monitor Commons IO menyediakan kemampuan untuk melacak perubahan ke file atau direktori . Mari kita lihat contoh singkat bagaimana FileAlterationMonitor dapat digunakan bersama dengan FileAlterationObserver dan FileAlterationListener untuk memantau file atau folder.

Saat FileAlterationMonitor dimulai, kami akan mulai menerima pemberitahuan untuk perubahan file di direktori yang sedang dipantau :

FileAlterationObserver observer = new FileAlterationObserver(folder); FileAlterationMonitor monitor = new FileAlterationMonitor(5000); FileAlterationListener fal = new FileAlterationListenerAdaptor() { @Override public void onFileCreate(File file) { // on create action } @Override public void onFileDelete(File file) { // on delete action } }; observer.addListener(fal); monitor.addObserver(observer); monitor.start();

8. Kesimpulan

Artikel ini membahas beberapa komponen paket Commons IO yang umum digunakan. Namun, paket tersebut juga dilengkapi dengan banyak kemampuan lain. Silakan merujuk ke dokumentasi API untuk lebih jelasnya.

Kode yang digunakan dalam contoh ini dapat ditemukan di proyek GitHub.