Есть ли простой способ сохранить конечные вкладки в Java во время файла в? - PullRequest
2 голосов
/ 10 сентября 2011

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

Ответы [ 2 ]

3 голосов
/ 10 сентября 2011

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

2 голосов
/ 10 сентября 2011

РЕДАКТИРОВАТЬ: Похоже, ваша проблема в 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 в Гуава :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...