3

BufferedReader 和 Scanner 的 nextLine() 似乎通过删除所有尾随空格提供了太多帮助。我需要保留列,目前允许为空值,但犹豫使用 next() 或 getBytes() 标识制表符遍历每一行,因为可能有数百万行和数百列。

我在阅读行时缺少这两种方法的替代方法吗?在这些方法中是否设置了标志或任何其他选项来保留空格?我是否只是强制用户使用非空白字段?我不是唯一一个试图保留空白的人吗?

当它从文件中读取时,我遇到了问题。我有这个代码

import java.lang.*;
import java.util.*;
import java.io.*;

public class stringTest
{
   public static void main (String[] args) throws IOException
   {
        BufferedReader br = new BufferedReader(new FileReader("wtf.txt"));
        String l = br.readLine();
        while (l != null) {
            System.out.println(l.split("\t").length);
            l = br.readLine();
        }
   }
}

wtf.txt 包含

h\tu\tr\tf\n
o\tm\tg\t\t\n

输出是

4
3

此外,如果我在所有选项卡的任何位置添加一行,即

h\tu\tr\tf\n
\t\t\t\t\t\n
o\tm\tg\t\t\n

输出是

4
0
3

我认为拆分不是问题,因为如果我使用代码

String s = "w\tt\tf\t\t\n";
System.out.println(""+s.split("\t").length);
String s1 = "w\tt\tf\tx\n";
System.out.println(""+s1.split("\t").length);
String s2 = "\t\t\t\t\t\t\n";
System.out.println(""+s2.split("\t").length);

输出是

5
4
6
4

2 回答 2

3

BufferedReader.readLine()确实保留了空格。

于 2011-09-10T14:56:18.617 回答
2

编辑:听起来你的问题是与split,不是BufferedReaderScanner。你可以很容易地把这些从等式中取出:

public class Test {
    public static void main(String[] args) {
        String line = "\t\t\t";
        System.out.println(line.split("\t").length); // Prints 0
    }
}

在分隔符上拆分字符串有多种不同的方法 - 您可能想查看GuavaSplitter中的类:

import java.util.List;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;

public class Test {
    public static void main(String[] args) {
        Splitter splitter = Splitter.on('\t');
        String line = "\t\t\t";
        List<String> bits = Lists.newArrayList(splitter.split(line));
        System.out.println(bits.size()); // Prints 4
    }
}

BufferedReader.readLine() 当然,不会删除尾随制表符。示例代码:

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        // Not closing anything just for convenience
        String text = "a\tb\t\r\nc\td\t";
        BufferedReader reader = new BufferedReader(new StringReader(text));

        String line;

        while ((line = reader.readLine()) != null)
        {
            System.out.println(line.replace("\t", "<tab>"));
        }
    }
}

输出:

a<tab>b<tab>
c<tab>d<tab>

同上Scanner.nextLine()

import java.io.*;
import java.util.*;

public class Test {
    public static void main(String[] args) throws IOException {
        // Not closing anything just for convenience
        String text = "a\tb\t\r\nc\td\t";
        Scanner scanner = new Scanner(new StringReader(text));

        while (scanner.hasNextLine())
        {
            String line = scanner.nextLine();
            System.out.println(line.replace("\t", "<tab>"));
        }
    }
}

(相同的输出。)

所以无论什么剥离你的空白,它不是Scanner.nextLine()or BufferedReader.readLine()

于 2011-09-10T14:57:34.247 回答