com.github.wenweihu86.raft.util.RaftFileUtils Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of raft-java-core Show documentation
Show all versions of raft-java-core Show documentation
another Raft implementation for Java
package com.github.wenweihu86.raft.util;
import com.google.protobuf.GeneratedMessageV3;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.zip.CRC32;
/**
* Created by wenweihu86 on 2017/5/6.
*/
@SuppressWarnings("unchecked")
public class RaftFileUtils {
private static final Logger LOG = LoggerFactory.getLogger(RaftFileUtils.class);
public static List getSortedFilesInDirectory(String dirName) {
File dir = new File(dirName);
File[] files = dir.listFiles();
Arrays.sort(files, new Comparator() {
@Override
public int compare(File o1, File o2) {
if (o1.isDirectory() && o2.isFile()) {
return -1;
}
if (o1.isFile() && o2.isDirectory()) {
return 1;
}
return o2.getName().compareTo(o1.getName());
}
});
List fileNames = new ArrayList<>(files.length);
for (File file : files) {
fileNames.add(file.getName());
}
return fileNames;
}
public static RandomAccessFile openFile(String dir, String fileName, String mode) {
try {
String fullFileName = dir + File.separator + fileName;
File file = new File(fullFileName);
return new RandomAccessFile(file, mode);
} catch (FileNotFoundException ex) {
LOG.warn("file not fount, file={}", fileName);
throw new RuntimeException("file not found, file={}" + fileName);
}
}
public static void closeFile(RandomAccessFile randomAccessFile) {
try {
if (randomAccessFile != null) {
randomAccessFile.close();
}
} catch (IOException ex) {
LOG.warn("close file error, msg={}", ex.getMessage());
}
}
public static void closeFile(FileInputStream inputStream) {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException ex) {
LOG.warn("close file error, msg={}", ex.getMessage());
}
}
public static void closeFile(FileOutputStream outputStream) {
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException ex) {
LOG.warn("close file error, msg={}", ex.getMessage());
}
}
public static T readProtoFromFile(RandomAccessFile raf, Class clazz) {
try {
long crc32FromFile = raf.readLong();
int dataLen = raf.readInt();
int hasReadLen = (Long.SIZE + Integer.SIZE) / Byte.SIZE;
if (raf.length() - hasReadLen < dataLen) {
LOG.warn("file remainLength < dataLen");
return null;
}
byte[] data = new byte[dataLen];
int readLen = raf.read(data);
if (readLen != dataLen) {
LOG.warn("readLen != dataLen");
return null;
}
long crc32FromData = getCRC32(data);
if (crc32FromFile != crc32FromData) {
LOG.warn("crc32 check failed");
return null;
}
Method method = clazz.getMethod("parseFrom", byte[].class);
T message = (T) method.invoke(clazz, data);
return message;
} catch (Exception ex) {
LOG.warn("readProtoFromFile meet exception, {}", ex.getMessage());
return null;
}
}
public static void writeProtoToFile(RandomAccessFile raf, T message) {
byte[] messageBytes = message.toByteArray();
long crc32 = getCRC32(messageBytes);
try {
raf.writeLong(crc32);
raf.writeInt(messageBytes.length);
raf.write(messageBytes);
} catch (IOException ex) {
LOG.warn("write proto to file error, msg={}", ex.getMessage());
throw new RuntimeException("write proto to file error");
}
}
public static long getCRC32(byte[] data) {
CRC32 crc32 = new CRC32();
crc32.update(data);
return crc32.getValue();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy