Java读取多维数组格式机器学习训练结果文件及优化方案咨询
嘿,我懂你现在的困扰——你用Arrays.deepToString()把你的List<int[][]>样本数据存成了一行没有换行的字符串,现在想把它读回变量里却找不到合适的方法,对吧?别着急,我给你两个方向的解决方案:一个是针对你已经存好的文件做解析,另一个是换用更靠谱的持久化方案,从根源上避免这种问题。
你现在的文件里是Arrays.deepToString()输出的嵌套数组格式,比如[[[1,2],[3,4]],[[5,6]]]。因为没有换行,你可以一次性读取整个文件的内容,再把这个字符串转换成List<int[][]>。手动解析容易出错,推荐用JSON库来帮忙——毕竟这个格式和JSON数组几乎一致。
以Jackson库为例,代码如下:
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class ReadExistingSamples { public static void main(String[] args) throws IOException { // 一次性读取整个文件内容 String fileContent = new String(Files.readAllBytes(Paths.get("results/samples.data"))); ObjectMapper mapper = new ObjectMapper(); // 把字符串转成List<int[][]> List<int[][]> samples = mapper.readValue( fileContent, new com.fasterxml.jackson.core.type.TypeReference<List<int[][]>>() {} ); // 测试验证 for (int[][] sample : samples) { System.out.println(Arrays.deepToString(sample)); } } }
如果不想引入第三方库,手动解析虽然可行(比如用正则拆分嵌套数组),但容易在数组包含特殊字符时出错,不推荐。
其实Arrays.deepToString()只适合打印调试,完全不适合持久化存储——因为它的输出格式是给人看的,机器解析成本太高。推荐下面几种更专业的方案:
1. Java原生序列化(最简单)
直接把整个List<int[][]>对象序列化到文件,读取时反序列化即可,代码量最少:
写入代码
import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; public class WriteWithSerialization { public static void main(String[] args) throws Exception { List<int[][]> samples = new ArrayList<>(); // 假设已经填充好样本数据 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("results/samples.ser"))) { oos.writeObject(samples); } } }
读取代码
import java.io.FileInputStream; import java.io.ObjectInputStream; import java.util.List; public class ReadWithSerialization { public static void main(String[] args) throws Exception { try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("results/samples.ser"))) { List<int[][]> samples = (List<int[][]>) ois.readObject(); // 直接使用samples变量即可 } } }
缺点:文件是二进制的,不可读,且只能用Java解析,不跨语言。
2. JSON序列化(推荐)
用JSON存储的话,文件是明文可读的,跨语言兼容性强,解析也方便。以Gson库为例:
写入代码
import com.google.gson.Gson; import java.io.FileWriter; import java.util.List; public class WriteWithJson { public static void main(String[] args) throws Exception { List<int[][]> samples = new ArrayList<>(); // 填充样本数据 Gson gson = new Gson(); try (FileWriter writer = new FileWriter("results/samples.json")) { gson.toJson(samples, writer); } } }
读取代码
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.FileReader; import java.util.List; public class ReadWithJson { public static void main(String[] args) throws Exception { Gson gson = new Gson(); try (FileReader reader = new FileReader("results/samples.json")) { List<int[][]> samples = gson.fromJson( reader, new TypeToken<List<int[][]>>(){}.getType() ); // 使用samples变量 } } }
优点:文件明文可查,Python、JavaScript等其他语言也能轻松读取,适合长期维护的项目。
3. 二进制序列化(大数据量首选)
如果你的样本数据量极大,追求存储效率和读取速度,可以用Protocol Buffers或FlatBuffers。不过需要先定义数据结构,稍微繁琐一点,但性能远超其他方案。
如果只是临时解决当前的读取问题,用JSON库解析现有字符串是最快的;如果想长期优化这个功能,推荐换成JSON序列化方案——兼顾可读性、跨语言性和易用性。
内容的提问来源于stack exchange,提问作者Neji Soltani

