Есть ли простой способ сохранить конечные вкладки в java во время загрузки файла?

BufferedReader и 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

person brwnj    schedule 10.09.2011    source источник


Ответы (2)


EDIT: похоже, ваша проблема связана с split, а не с BufferedReader или Scanner. Вы можете очень легко вывести их из уравнения:

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

Существуют различные способы разбиения строки на разделители — вы можете посмотреть Splitter в Guava:

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

person Jon Skeet    schedule 10.09.2011
comment
У меня проблема с ним, когда он читает из файла. У меня есть этот код 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 Если я добавлю строку в любом месте, где есть все вкладки, она возвращает ноль. - person brwnj; 10.09.2011
comment
@brwnj: это не имеет ничего общего с readLine и имеет отношение к разделению. Редактирование... - person Jon Skeet; 10.09.2011
comment
Ты прав. Это с разделением, потому что оно ведет себя по-разному, если в конце есть новая строка или, возможно, если между вкладками есть какие-либо значения. Я буду использовать разветвитель, который вы предложили выше. Спасибо! - person brwnj; 10.09.2011

BufferedReader.readLine() сохраняет пробелы.

person Moritz Both    schedule 10.09.2011