Я думаю, что когда вы определяете String
, вы определяете объект. Поэтому вам нужно использовать .equals()
. Когда вы используете примитивные типы данных, вы используете ==
, но с String
(и любым объектом) вы должны использовать .equals()
.
String::split
Я не знаю, как сказать «взять все до табуляции и сохранить его под именем переменной» и «перевести все с табуляции в новую строку и сохранить его в переменной URL» ».
blockquote>Используйте метод
String::split
, чтобы нарезать строку на меньшие строки. Укажите разделитель ( TAB ), используемый между полями в каждой строке. Вы получаете обратно массивString
объектов, по одному на каждое поле строки.String[] fields = line.split( "\t" ) ; // Chop string into smaller strings. String name = fields[ 0 ] ; // Annoying zero-based index counting. String url = fields[ 1 ] ;
Вы должны добавить код, чтобы убедиться, что вы получили ожидаемое количество полей в размере массива.
Подсказка: Используйте библиотеку для рутинной работы по чтению и записи ваших файлов с разделителями табуляции . Для этой работы я использую библиотеку Apache Commons CSV . Он работает с различными форматами CSV , а также с разделителями табуляции. Переполнение стека поиска для примеров, таких как тот, который я опубликовал вчера. В этом примере кода измените
CSVFormat.RFC4180
наCSVFormat.TDF
для формата с разделителями табуляции.
Я бы использовал другой подход - BufferedReader
. С его помощью вы можете получить поток строк файла и работать с каждой строкой отдельно.
import java.io.*;
public class App {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("data.tsv"))) {
reader.lines() // Get a stream of lines
.map(line -> line.split("\t")) // Split every line by the tab character
.forEach(App::doStuff); // Call doStuff for every tokenized line
} catch (IOException e) {
System.out.println("Cannot open the file.");
}
}
static void doStuff(String[] tokens) {
if (tokens.length != 2) {
throw new IllegalArgumentException("Cannot do stuff with an invalid line.");
}
String name = tokens[0]; // tokens[0] contains everything before the tab character
String url = tokens[1]; // tokens[1] contains everything after the tab character
System.out.printf("%s %s\n", name, url);
}
}
Если вы действительно хотите использовать Scanner
, вы можете указать разделители:
scan = new Scanner(new File(path)).useDelimiter("[\n\t]");
Это позволит сканеру использовать только символы табуляции и символы новой строки в качестве разделителей. Обратите внимание, что это означает, что необязательно, чтобы формат файла был точно таким: «name TAB url NEWLINE name TAB url». Это также может быть «имя NEWLINE url TAB имя TAB url». Это потому, что Scanner
не заботится о порядке разделителей.
Если вы действительно хотите использовать Scanner
и сохранить строгий формат, вы можете использовать 2 сканера. Отсканируйте строку с первой, затем отсканируйте имя и URL-адрес из строки. Но я думаю, что это слишком сложно, и я бы предпочел использовать BufferedReader
, поскольку он сохраняет строгий формат.