Project

General

Profile

Statistics
| Revision:

root / src / FileManager.java

History | View | Annotate | Download (4.35 KB)

1
import java.io.*;
2
import java.nio.file.*;
3
import java.security.*;
4
import java.nio.charset.*;
5

    
6
public class FileManager {
7

    
8
    public static int chunkSize = 64000;
9

    
10
    // Save byte array chunk to path
11
    public static void saveChunk(byte[] bytes, String path, int chunkN) throws FileNotFoundException, IOException {
12

    
13
        String fileName = path + Integer.toString(chunkN);
14

    
15
        try (FileOutputStream stream = new FileOutputStream(fileName)) {
16
            stream.write(bytes);
17
        }
18

    
19
    }
20

    
21
    // Hash a string with SHA256
22
    public static String hash(String input) {
23

    
24
        try {
25

    
26
            byte[] bytes = digestHashing(input);
27
            return bytesToHex(bytes);
28

    
29
        } catch (Exception e) {
30

    
31
            e.printStackTrace();
32

    
33
        }
34

    
35
        return null;
36

    
37
    }
38

    
39
    // Use MessageDigest to hash in bytes
40
    private static byte[] digestHashing(String input) throws NoSuchAlgorithmException {
41

    
42
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
43
        return digest.digest(input.getBytes(StandardCharsets.UTF_8));
44

    
45
    }
46

    
47
    // Use bytes from MessageDigest to a String
48
    private static String bytesToHex(byte[] hash) {
49

    
50
        StringBuffer hexString = new StringBuffer();
51

    
52
        for (int i = 0; i < hash.length; i++) {
53

    
54
            String hex = Integer.toHexString(0xff & hash[i]);
55

    
56
            if (hex.length() == 1)
57
                hexString.append('0');
58

    
59
            hexString.append(hex);
60

    
61
        }
62

    
63
        return hexString.toString();
64

    
65
    }
66

    
67
    // Delete directory and files
68
    public static void deleteDir(File file) {
69
        File[] contents = file.listFiles();
70
        if (contents != null) {
71
            for (File f : contents) {
72
                if (!Files.isSymbolicLink(f.toPath())) {
73
                    deleteDir(f);
74
                }
75
            }
76
        }
77
        file.delete();
78
    }
79

    
80
    // Read all bytes of file(generic use)
81
    public static byte[] readFile(String path) {
82

    
83
        Path filePath = Paths.get(path);
84

    
85
        byte[] bytes = null;
86

    
87
        try {
88
            bytes = Files.readAllBytes(filePath);
89
        } catch (Exception e) {
90
            e.printStackTrace();
91
        }
92

    
93
        return bytes;
94
    }
95

    
96
    // Split file in chunks
97
    public static byte[][] split(byte[] fileBytes) {
98

    
99
        // Number of chunks needed is always integer division plus 1 which may be
100
        // partially used or empty
101
        int nChunks = 1 + fileBytes.length / chunkSize;
102

    
103
        // Total bytes
104
        int bytes = fileBytes.length;
105
        int rBytes = 0;
106

    
107
        // Chunks seperated
108
        byte[][] chunks = new byte[nChunks][];
109
        for (int i = 0; i < nChunks; i++) {
110

    
111
            // Calculate proper size
112
            int sizeToCopy = chunkSize;
113
            if (bytes < sizeToCopy)
114
                sizeToCopy = bytes;
115

    
116
            // Chunk with proper size
117
            chunks[i] = new byte[sizeToCopy];
118

    
119
            // Copy to chunk
120
            System.arraycopy(fileBytes, rBytes, chunks[i], 0, sizeToCopy);
121

    
122
            // Remove form total bytes
123
            bytes -= sizeToCopy;
124
            rBytes += sizeToCopy;
125

    
126
        }
127
        return chunks;
128
    }
129

    
130
    // Merge chunks into single byte array
131
    public static byte[] merge(byte[][] chunks) throws IOException {
132

    
133
        // Total bytes
134
        int tBytes = 0;
135
        for (int i = 0; i < chunks.length; i++) {
136
            tBytes += chunks[i].length;
137
        }
138

    
139
        byte[] mergedFile = new byte[tBytes];
140

    
141
        // Written bytes count
142
        int nBytes = 0;
143

    
144
        // Write bytes
145
        for (int i = 0; i < chunks.length; i++) {
146
            System.arraycopy(chunks[i], 0, mergedFile, nBytes, chunks[i].length);
147
            nBytes += chunks[i].length;
148
        }
149

    
150
        return mergedFile;
151
    }
152

    
153
    // Test main for split and merge file
154
    public static void main(String[] args) {
155

    
156
        String fileName = args[0];
157
        Path filePath = Paths.get(fileName);
158
        byte[] fileBytes = null;
159

    
160
        try {
161
            fileBytes = Files.readAllBytes(filePath);
162
        } catch (Exception e) {
163
            e.printStackTrace();
164
        }
165

    
166
        byte[][] chunks = split(fileBytes);
167

    
168
        try {
169
            fileBytes = merge(chunks);
170
        } catch (Exception e) {
171
            e.printStackTrace();
172
        }
173

    
174
    }
175

    
176
}