我有以下代码使用java 7的功能,例如 java.nio.file.Files和java.nio.file.Paths
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class JacksonObjectMapper {
public static void main(String[] args) throws IOException {
byte[] jsonData = Files.readAllBytes(Paths.get("employee.txt"));
ObjectMapper objectMapper = new ObjectMapper();
Employee emp = objectMapper.readValue(jsonData, Employee.class);
System.out.println("Employee Object\n"+emp);
Employee emp1 = createEmployee();
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
StringWriter stringEmp = new StringWriter();
objectMapper.writeValue(stringEmp, emp1);
System.out.println("Employee JSON is\n"+stringEmp);
}
}
现在我必须在Java 6上运行相同的代码,除了使用FileReader之外,还有哪些最佳选择?
答案 0 :(得分:3)
在Files
类源中,您可以看到在readAllBytes
方法字节中从InputStream中读取。
public static byte[] readAllBytes(Path path) throws IOException {
long size = size(path);
if (size > (long)Integer.MAX_VALUE)
throw new OutOfMemoryError("Required array size too large");
try (InputStream in = newInputStream(path)) {
return read(in, (int)size);
}
}
return read(in, (int)size)
- 这里它使用缓冲区从InputStream中读取数据。
所以你可以用同样的方式做,或者只使用Guava或Apache Commons IO http://commons.apache.org/io/。
答案 1 :(得分:2)
备选方案是java.io或Apache Commons IO中的类,Guava IO也可以提供帮助。
番石榴是最现代的,所以我认为它是最适合你的解决方案。
答案 2 :(得分:2)
如果你真的不想使用FileReader(虽然我不明白为什么)你可以去FileInputStream。
语法:
InputStream inputStream = new FileInputStream(Path of your file);
Reader reader = new InputStreamReader(inputStream);
答案 3 :(得分:1)
你是正确的避免FileReader
,因为它总是使用运行它的平台的默认字符编码,这可能与JSON文件的编码不同。
ObjectMapper的重载为readValue
,可以直接从File
读取,不需要在临时byte[]
中缓冲内容:
Employee emp = objectMapper.readValue(new File("employee.txt"), Employee.class);
答案 4 :(得分:1)
即使在Java 6中,您也可以将文件的所有字节读取为字节数组,如https://jsfiddle.net/DIRTY_SMITH/bpxr7858/中所述:
import java.io.RandomAccessFile;
import java.io.IOException;
RandomAccessFile f = new RandomAccessFile(fileName, "r");
if (f.length() > Integer.MAX_VALUE)
throw new IOException("File is too large");
byte[] b = new byte[(int)f.length()];
f.readFully(b);
if (f.getFilePointer() != f.length())
throw new IOException("File length changed while reading");
我添加了导致异常的检查以及从read
到readFully
的更改,这是在原始答案的评论中提出的。