Apache Commons IO

1. Gambaran keseluruhan

Projek Apache Commons diciptakan untuk memberi para pembangun satu set perpustakaan umum yang dapat mereka gunakan dalam kod harian mereka.

Dalam tutorial ini, kita akan meneroka beberapa kelas utiliti utama modul Commons IO dan fungsinya yang paling terkenal.

2. Ketergantungan Maven

Untuk menggunakan perpustakaan, mari sertakan ketergantungan Maven berikut di pom.xml :

 commons-io commons-io 2.5 

Versi perpustakaan terkini boleh didapati di Maven Central.

3. Kelas Utiliti

Ringkasnya, kelas utiliti menyediakan set kaedah statik yang dapat digunakan untuk melakukan tugas umum pada fail .

3.1. Fail Fail

Kelas ini menyediakan operasi yang berbeza pada fail, seperti membuka, membaca, menyalin, dan bergerak.

Mari lihat cara membaca atau menyalin fail 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. Nama Fail

Utiliti ini menyediakan cara sistem operasi-agnostik untuk melaksanakan fungsi umum pada nama fail . Mari lihat beberapa kaedah berbeza yang dapat kita gunakan:

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

3.3. Fail SistemSistem

Kita boleh menggunakan FileSystemUtils untuk memeriksa ruang kosong pada jumlah atau pemacu tertentu :

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

4. Input dan Output

Pakej ini menyediakan beberapa pelaksanaan untuk bekerja dengan aliran input dan output .

Kami akan memberi tumpuan kepada TeeInputStream dan TeeOutputSteam . Kata " Tee " (berasal dari huruf " T ") biasanya digunakan untuk menggambarkan bahwa satu input harus dibagi menjadi dua output yang berbeda.

Mari lihat contoh yang menunjukkan bagaimana kita dapat menulis satu aliran input ke dua aliran output yang berbeza :

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. Penapis

Commons IO menyertakan senarai penapis fail yang berguna. Ini mungkin berguna apabila pembangun ingin mengecilkan senarai fail tertentu yang dikehendaki dari senarai fail yang heterogen.

Perpustakaan juga menyokong operasi logik AND dan OR pada senarai fail yang diberikan. Oleh itu, kita boleh mencampurkan dan memadankan penapis ini untuk mendapatkan hasil yang diinginkan.

Mari kita lihat contoh yang menggunakan WildcardFileFilter dan SuffixFileFilter untuk mengambil fail yang mempunyai " ple " pada nama mereka dengan akhiran " txt ". Perhatikan bahawa kami membungkus penapis 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 pakej menyediakan jenis perbandingan pada fail . Kami akan meneroka dua pembanding yang berbeza di sini.

6.1. PathFileComparator

The PathFileComparator kelas boleh digunakan untuk senarai jenis atau tatasusunan fail dengan laluan mereka sama ada dengan cara sensitif huruf sensitif huruf, kes sensitif, atau sistem yang bergantung kepada. Mari lihat bagaimana menyusun laluan fail di direktori sumber menggunakan utiliti 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 bahawa kami telah menggunakan konfigurasi IOCase.INSENSITIVE . PathFileComparator juga menyediakan sebilangan contoh tunggal yang mempunyai pilihan sensitiviti huruf besar dan pilihan menyusun terbalik .

Medan statik ini merangkumi PATH_COMPARATOR, PATH_INSENSITIVE_COMPARATOR, PATH_INSENSITIVE_REVERSE, PATH_SYSTEM_COMPARATOR, untuk beberapa nama.

6.2. SizeFileComparator

SizeFileComparator , seperti namanya, digunakan untuk membandingkan ukuran (panjang) dua fail . Ia mengembalikan nilai integer negatif jika ukuran fail pertama kurang dari ukuran fail kedua. Ia mengembalikan sifar jika ukuran fail sama dan nilai positif jika ukuran fail pertama lebih besar daripada ukuran fail kedua.

Mari tulis ujian unit yang menunjukkan perbandingan saiz fail:

@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 Fail

Pakej monitor Commons IO menyediakan kemampuan untuk mengesan perubahan pada fail atau direktori . Mari kita lihat contoh ringkas bagaimana FileAlterationMonitor dapat digunakan bersama dengan FileAlterationObserver dan FileAlterationListener untuk memantau fail atau folder.

Apabila FileAlterationMonitor bermula, kami akan mula menerima pemberitahuan untuk perubahan fail pada 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. Kesimpulannya

Artikel ini merangkumi beberapa komponen pakej Commons IO yang biasa digunakan. Walau bagaimanapun, pakej ini dilengkapi dengan banyak keupayaan lain juga. Sila rujuk dokumentasi API untuk maklumat lebih lanjut.

Kod yang digunakan dalam contoh ini boleh didapati dalam projek GitHub.