Skip to content

File Modification And Merging

Asterios Raptis edited this page Feb 10, 2025 · 10 revisions

Introduction

Managing files often requires modifying and merging content dynamically. Whether you're updating logs, editing configuration files, or combining multiple directories, the file-worker library provides utilities to modify and merge files and directories efficiently.

Imagine you need to clean up log files by deleting specific lines or merging backup directories while handling conflicts intelligently. This library helps automate such operations with minimal code.

Features Overview

  • Modify file content line by line.
  • Delete specific lines from a file by index.
  • Merge directories while handling conflicts.
  • Perform bulk modifications on files.

Getting Started

To include this library in your Java project, add the following dependency:

Gradle Dependency

Replace the variable ${latestVersion} with the current latest version:
Maven Central

Define version in the gradle.properties file:

fileWorkerVersion=${latestVersion}

or in the build.gradle ext area:

    fileWorkerVersion = "${latestVersion}"

Then, add the dependency:

    implementation("io.github.astrapi69:file-worker:$fileWorkerVersion")

Using the libs.versions.toml File

For automatic version updates:

[versions]
file-worker-version=${latestVersion}

[libraries]
file-worker = { module = "io.github.astrapi69:file-worker", version.ref = "file-worker-version" }

Then, add:

    implementation libs.file.worker

Maven Dependency

Maven dependency is now available on Sonatype. Check out the
Sonatype repository
for the latest snapshots and releases.

<properties>
    ...
    <file-worker.version>${latestVersion}</file-worker.version>
    ...
</properties>

<dependencies>
    ...
    <dependency>
        <groupId>io.github.astrapi69</groupId>
        <artifactId>file-worker</artifactId>
        <version>${file-worker.version}</version>
    </dependency>
    ...
</dependencies>

Modifying Files with ModifyFileExtensions

The ModifyFileExtensions class provides methods for updating file content efficiently.

Example: Modifying a File Line by Line

Path filePath = Path.of("sample.txt");
ModifyFileExtensions.modifyFile(filePath, (index, line) -> line.toUpperCase());

System.out.println("File content converted to uppercase.");

Example: Concatenating Multiple Files

List<File> filesToConcatenate = List.of(new File("file1.txt"), new File("file2.txt"));
File resultFile = new File("merged.txt");

ModifyFileExtensions.concatenateAll(filesToConcatenate, resultFile);

System.out.println("Files merged successfully!");

Unit Test Coverage

The ModifyFileExtensionsTest class verifies this functionality:

@Test
public void testModifyFile() throws IOException {
    Path inputFile = Path.of("test.txt");
    ModifyFileExtensions.modifyFile(inputFile, (index, line) -> line + " modified");

    List<String> lines = ReadFileExtensions.readLinesInList(inputFile);
    assertTrue(lines.get(0).contains("modified"));
}

Deleting Specific Lines with DeleteLinesByIndexInFile

The DeleteLinesByIndexInFile class allows you to remove specific lines from a file.

Example: Deleting Lines by Index

List<Integer> linesToDelete = List.of(1, 3);
DeleteLinesByIndexInFile deleter = new DeleteLinesByIndexInFile(linesToDelete);

ModifyFileExtensions.modifyFile(Path.of("data.csv"), deleter);

System.out.println("Selected lines deleted from the file.");

Unit Test Coverage

The DeleteLinesByIndexInFileTest class ensures correct behavior:

@Test
public void testApply() throws IOException {
    Path filePath = Path.of("test-data.csv");
    List<Integer> linesToDelete = Arrays.asList(1, 4);

    ModifyFileExtensions.modifyFile(filePath, new DeleteLinesByIndexInFile(linesToDelete));

    List<String> lines = ReadFileExtensions.readLinesInList(filePath);
    assertFalse(lines.contains("Line 2"));
}

Merging Directories with MergeDirectoryExtensions

The MergeDirectoryExtensions class helps combine directories while managing file conflicts.

Example: Merging Directories

File targetDir = new File("mergedDir");
File dir1 = new File("sourceDir1");
File dir2 = new File("sourceDir2");

MergeDirectoryExtensions.merge(targetDir, dir1, dir2);

System.out.println("Directories merged successfully!");

Handling File Conflicts

If the same file exists in both directories, the library intelligently resolves conflicts based on timestamps and content differences.

Unit Test Coverage

The MergeDirectoryExtensionsTest class ensures directory merging works as expected:

@Test
public void testMerge_TwoDirectories_NoConflicts() throws IOException {
    File targetDir = Files.createTempDirectory("target").toFile();
    File dir1 = Files.createTempDirectory("dir1").toFile();
    File dir2 = Files.createTempDirectory("dir2").toFile();

    File file1Dir1 = new File(dir1, "file1.txt");
    File file1Dir2 = new File(dir2, "file2.txt");
    StoreFileExtensions.toFile(file1Dir1, "content1");
    StoreFileExtensions.toFile(file1Dir2, "content2");

    MergeDirectoryExtensions.merge(targetDir, dir1, dir2);

    assertTrue(new File(targetDir, "file1.txt").exists());
    assertTrue(new File(targetDir, "file2.txt").exists());
}

Managing Merge Strategies with MergeStrategy

When merging directories, you can choose between different strategies:

  • TARGET_AS_MASTER: Moves files from source to target and removes duplicates.
  • SOURCE_TO_TARGET: Copies files from source to target without removing duplicates.

Example: Using Merge Strategy

MergeStrategy strategy = MergeStrategy.TARGET_AS_MASTER;
MergeDirectoryExtensions.merge(targetDir, dir1, dir2, strategy);

System.out.println("Merged with strategy: " + strategy);

Unit Test Coverage

@Test
public void testMergeDirectory() throws IOException {
    File leftDir = new File("leftDir");
    File rightDir = new File("rightDir");

    MergeDirectoryExtensions.merge(leftDir, rightDir);

    assertTrue(new File(leftDir, "commonFile.txt").exists());
}

Conclusion

The file-worker library provides robust tools for modifying files, deleting specific content, and merging directories efficiently. Whether you're processing logs, editing data, or managing large file structures, this library simplifies file handling.

Start using it today to automate your file operations and enhance productivity!

Clone this wiki locally