Java 6中java.nio.file.Files的替代方法

时间:2014-01-10 08:43:47

标签: java

我有以下代码使用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之外,还有哪些最佳选择?

5 个答案:

答案 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.ioApache Commons IO中的类,Guava IO也可以提供帮助。

番石榴是最现代的,所以我认为它是最适合你的解决方案。

了解详情:Guava's I/O package utilities, explained.

答案 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");

我添加了导致异常的检查以及从readreadFully的更改,这是在原始答案的评论中提出的。