Java 如何将一行中的每个字符从文本文件读取到二维矩阵?

Java 如何将一行中的每个字符从文本文件读取到二维矩阵?,java,string,matrix,inputstream,bufferedreader,Java,String,Matrix,Inputstream,Bufferedreader,我有一个如下所示的文本文件: abcd efgh ijkl 我需要创建String[]resultMatrix=newstring[3][4]存储值,使每一行都是一行,每一行中的每个字符都是该行的一个元素,但我并不总是提前知道矩阵的维度 我所拥有的返回一个字符串,但我需要一个3x4矩阵: 公共静态字符串[][]readTxt(字符串文件名)引发IOException{ InputStream文件=新文件InputStream(文件名); BufferedReader buffer=新的Buff

我有一个如下所示的文本文件:

abcd
efgh
ijkl
我需要创建
String[]resultMatrix=newstring[3][4]
存储值,使每一行都是一行,每一行中的每个字符都是该行的一个元素,但我并不总是提前知道矩阵的维度

我所拥有的返回一个字符串,但我需要一个3x4矩阵:

公共静态字符串[][]readTxt(字符串文件名)引发IOException{
InputStream文件=新文件InputStream(文件名);
BufferedReader buffer=新的BufferedReader(新的InputStreamReader(文件));
String line=buffer.readLine();
StringBuilder sb=新的StringBuilder();
行=空;
而((line=buffer.readLine())!=null){
sb.追加(第+行“\n”);
}
String fileString=sb.toString();
fileString=fileString
.replaceAll(“\r”,”)
.replaceAll(“\n>[A-Z]+”,“>”)
.replaceAll(“[0-9]+\n”,”);
String[]line=fileString.split(“>”);
字符串[][]结果矩阵=新字符串[lines.length][lines[0].length()];
对于(int i=0;i
你把事情弄得极其复杂

编辑:将
collect to list
->
list to array
转换为直接在流上调用
toArray

public static String[][] readTxt(String fn)  throws IOException {
    return Files.lines(Paths.get(fn))
        .map(s -> s.split(""))
        .toArray(String[][]::new);
}
逐步:

Files.line(path.get(fn))

在中读取整个
fn
文件,并逐行处理

.map(s->s.split(“”)

通过调用
.split(“”
)将字符串转换为字符串[]-split将字符串拆分到某个分隔符上,如果将空字符串作为分隔符传递,则每个字符都会被分隔开。我们现在有一个字符串数组流

.toArray(字符串[]:[]::新建)


将流转换为数组。这需要告诉
toArray
方法如何构造正确大小的新数组
String[]]::new
是java ese的意思:在给定单个int参数(大小)的情况下调用
new String[X][]
的概念。与中一样,
String[]]::new
不会创建新数组。它代表了创建它们的概念(它是一个方法引用:它代表了编写
新字符串[X][]
)的思想)。

如果您有一个字符串数组,则可以将其转换为二维字符数组,如下所示:

String[]行={“abcd”、“efgh”、“ijkl”};
字符串[][]resultMatrix=Arrays.stream(行)
.map(str->str.codePoints()
.mapToObj(字符::toString)
.toArray(字符串[]::新建))
.toArray(字符串[]:[]::新建);
System.out.println(Arrays.deepToString(resultMatrix));
//[a,b,c,d],[e,f,g,h],[i,j,k,l]]

为什么要使用列表执行中间步骤?您也可以这样做:
.map(s->s.split(“”)甚至更好-我快速查看了
收集器
,有点惊讶于我没有在那里找到toArray函数。有点奇怪,它本身就嵌入到流中。将编辑。