从文本文件中读取字符而忽略新行中多余空格的最佳方法是什么?

时间:2017-07-03 02:28:04

标签: java fileinputstream

我正在阅读一个16x16数独谜题格式的文本文件。

例如:

F7B-E-A-1--6---D  
-91AF-0-85D7E4-C  
05-69C---B-EA-3-  
-C-E-2-B--A-7860  
E05---2F-7---1C-  
-4-8-DC--E-593--  
-29---1-D--A-04-  
D67-A-98----B-F-  
9B-D-130C8--F5A-  
8F4569EA7D--CB--  
6A---745BFE-12D9  
7--1DBFC-A-04--E  
5-F9C-61240D-7E-  
A--7-F-DE-580-2-  
--0-5E7-F63C--14  
CE640-----7B5D9F

我正在尝试将值放入2D char数组中,但是当遇到行的末尾时,似乎包含3个空格。 我尝试过使用BufferedReader和FileInputStream等各种方法无济于事。文本文件必须采用该格式,因为我的教授将使用该格式使用自己的值进行测试。

我将文件放入ArrayList的代码:

private static ArrayList readFile(File filename)
{
    ArrayList records = new ArrayList();
    try
    {
        FileInputStream stream = new FileInputStream(filename);

        char current;
        while(stream.available() > 0)
        {
            current = (char)stream.read();
            records.add(current);
        }
        stream.close();
        return records;
    }
    catch (Exception e)
    {
        System.err.format("Exception occurred trying to read '%s'.", filename);
        return null;
    }
}

然后我使用迭代器开始为2D数组赋值。当打印出网格时看起来很好,但是在检查单个值时,比如grid [1] [1],由于它投入的间距,它不正确。

有没有办法用char读取char,但是避免使用3个空格来表示新行?

3 个答案:

答案 0 :(得分:3)

您提到要放入2D字符数组,因此您可能希望忽略位置> 15:

GlobalDataMethods

现在你的2d数组会自动忽略那些空白,因为你逐行读入文件,然后手动将值添加到2d数组中。

答案 1 :(得分:2)

好吧,既然你只对十六进制字符和-真正感兴趣,你可以只过滤其他所有内容。最简单的方法可能是取代:

current = (char)stream.read();

使用:

current = (char)stream.read();
while ("0123456789ABCDEF-".indexOf(current) < 0)
    current = (char)stream.read();

但您可能需要摆弄错误条件以确保其防弹。

例如,检查输入循环结束后添加到records的元素数量。如果records.size()没有给你256,那么该文件就有问题。

这会从文件中删除所有格式问题,只有内容才会重要(例如,如果需要,您可以在一行中提供所有256个字符)。

这符合健全性原则,&#34;在你所接受的内容中是自由的,具体在你所生产的内容中。&#34;

您可能还想重新考虑从文件输入创建数组列表的方法,然后从中构建二维数组。在我看来,你可以直接用(伪代码):

之类的东西创建2D数组
def readPuzzle(file) -> (array, error)
    set puzzle to new char[16][16]
    set row to 0, col to 0

    get next character from file to current
    while read okay:
        if current in "0123456789ABCDEF-":
            if row is 16:
                return (puzzle, "too many entries in file")
            puzzle[row][col] = current
            increment col
            if col is 16:
                increment row
                set col to 0
    if row is not 16:
        return (puzzle, "not enough entries in file")
    return (puzzle, "okay")

这基本上只是从文件中读取所有字符,如果它们有效,则将它们直接添加到数组中。在添加之前,它会检查以确保您尚未填充拼图,并且在处理完所有字符后,它会检查以确保整个拼图已填充。

答案 2 :(得分:1)

String.trim()是从字符串的开头或结尾删除不必要的空格的最简单方法,因此您可以在读取文件后始终只执行清理过程:

private static void trimAllStrings(List<String> list) {
  for (int i = 0; i < list.size(); i++) {
    list.put(i, list.get(i).trim());
  }
}

或者你可以在阅读内容时进行修剪 - Java 8的Files.lines()流使这种转换变得非常简单:

List<String> trimmedLines = Files.lines(myfile, StandardCharsets.UTF_8)
    .map(String::trim).collect(Collectors.toList());

如果你还没有使用这种Java 8语法,你可以用Java 7风格做同样的事情:

ArrayList<String> list = new ArrayList<>();
for (String line : Files.readAllLines(myfile, StandardCharsets.UTF_8)) {
  list.add(line.trim());
}