在Java文件输入时,有没有一种简单的方法来保留末尾的制表符?

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

我认为这不是split的问题,因为如果我使用以下代码:

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
2个回答

3

BufferedReader.readLine() 会保留空格。


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
    }
}

有多种不同的方法可以根据分隔符来拆分字符串 - 你可能想看一下Guava中的Splitter类:

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()BufferedReader.readLine()


1
我在从文件中读取时遇到了问题。 我有这段代码`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 o\tm\tg\t\t 输出结果为4 3如果我添加一个全是制表符的行,则返回零。 - brwnj
@brwnj:这与readLine无关,而与split有关。编辑中... - Jon Skeet
你说得对。使用split函数时,如果末尾有换行符或者制表符之间有任何值,它的行为会有所不同。我将使用你上面建议的分隔符。谢谢! - brwnj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接