В настоящее время существует проблема с параметром конвейера и файла ( https://issues.jenkins-ci.org/browse/JENKINS-27413 ).
ASCII - это файл TEXT, поэтому вы должны использовать Readers для чтения. Java также поддерживает чтение из двоичного файла с помощью InputStreams . Если прочитанные файлы огромны, вы можете использовать BufferedReader поверх FileReader , чтобы улучшить производительность чтения.
Пройдите через в этой статье о том, как использовать Reader
Я также рекомендую вам скачать и прочитать эту замечательную (но бесплатную) книгу под названием Мышление на Java
В Java 7:
new String (Files.readAllBytes (...)) или Files.readAllLines (...)
В Java 8:
Самый простой способ - использовать класс Scanner
в Java и объект FileReader. Простой пример:
Scanner in = new Scanner(new FileReader("filename.txt"));
Scanner
имеет несколько методов для чтения в строках, числах и т. Д. Вы можете найти дополнительную информацию об этом на странице документации Java.
Например, прочитав весь контент в String
:
StringBuilder sb = new StringBuilder();
while(in.hasNext()) {
sb.append(in.next());
}
in.close();
outString = sb.toString();
Также, если вам нужна конкретная кодировка, вы можете использовать это вместо FileReader
:
new InputStreamReader(new FileInputStream(fileUtf8), StandardCharsets.UTF_8)
Мой любимый способ прочитать небольшой файл - использовать BufferedReader и StringBuilder. Это очень просто и точно (хотя и не особенно эффективно, но достаточно для большинства случаев):
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
} finally {
br.close();
}
Некоторые отметили, что после Java 7 вы должны использовать try-with- Когда я читаю строки, подобные этому, я обычно хочу выполнять некоторую обработку строк для каждой строки, поэтому я перехожу к этой реализации. try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
}
try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
}
/ g5]
Хотя если я хочу просто прочитать файл в String, я всегда использую Apache Commons IO с помощью метода класса IOUtils.toString (). Вы можете посмотреть источник здесь:
http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html
FileInputStream inputStream = new FileInputStream("foo.txt");
try {
String everything = IOUtils.toString(inputStream);
} finally {
inputStream.close();
}
И еще проще с Java 7:
try(FileInputStream inputStream = new FileInputStream("foo.txt")) {
String everything = IOUtils.toString(inputStream);
// do something with everything string
}
code
while (строка! = null) {sb.append (строка); line = br.readLine (); // Добавляем только новую строку, когда curline не является последней строкой. If (line! = Null) {sb.append (& quot;\n & quot;); }} code
– Ramon Fincken
16 April 2013 в 12:07
Пока я еще не упомянул об этом в других ответах. Но если «Лучшее» означает скорость, то новый Java I / O (NIO) может обеспечить самую быструю предварительную подготовку, но не всегда проще всего выяснить, кто кого-то учит.
http: // download.oracle.com/javase/tutorial/essential/io/file.html
Этот код, который я запрограммировал, намного быстрее для очень больших файлов:
public String readDoc(File f) {
String text = "";
int read, N = 1024 * 1024;
char[] buffer = new char[N];
try {
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
while(true) {
read = br.read(buffer, 0, N);
text += new String(buffer, 0, read);
if(read < N) {
break;
}
}
} catch(Exception ex) {
ex.printStackTrace();
}
return text;
}
+=
таким образом, вы получаете квадратичную (!) сложность для задачи, которая должна быть линейной сложностью. это начнет сканирование файлов на несколько мб. Чтобы обойти это, вы должны либо сохранить текстовые блоки в списке & lt; string & gt; или использовать вышеупомянутый строковый конструктор.
– kritzikratzi
23 March 2014 в 20:55
Вот простое решение:
String content;
content = new String(Files.readAllBytes(Paths.get("sample.txt")));
Методы внутри org.apache.commons.io.FileUtils
также могут быть очень удобными, например :
/**
* Reads the contents of a file line by line to a List
* of Strings using the default encoding for the VM.
*/
static List readLines(File file)
Что вы хотите сделать с текстом? Является ли файл достаточно маленьким, чтобы вписаться в память? Я попытался бы найти самый простой способ обработки файла для ваших нужд. Для этого используется библиотека FileUtils.
for(String line: FileUtils.readLines("my-text-file"))
System.out.println(line);
org.apache.commons.io.FileUtils
. Ссылка Google может со временем изменять содержимое, так как наиболее распространенный смысл сдвигается, но это соответствует его запросу и выглядит правильно.
– Palec
15 February 2015 в 12:42
readLines(String)
, а readLines(File)
устарел в пользу readLines(File, Charset)
. Кодирование может также поставляться в виде строки.
– Palec
15 February 2015 в 12:46
Используйте Java kiss , если речь идет о простоте структуры:
import static kiss.API.*;
class App {
void run() {
String line;
try (Close in = inOpen("file.dat")) {
while ((line = readLine()) != null) {
println(line);
}
}
}
}
if(scanner.hasNext()) content = scanner.next();
– David Soroko
13 August 2015 в 21:14
java.nio.file.Files
? Теперь мы можем просто использовать readAllLines
, readAllBytes
и lines
.
– Claude Martin
1 September 2017 в 15:40
Cactoos дает вам декларативный однострочный шрифт:
new TextOf(new File("a.txt")).asString();
Files.lines(…).forEach(…)
не сохраняет порядок строк, а выполняется параллельно, @Dash. Если порядок важен, вы можете использоватьFiles.lines(…).forEachOrdered(…)
, который должен сохранить порядок (хотя и не проверял). – Palec 15 February 2015 в 23:45Files.lines(...).forEach(...)
выполняется параллельно? Я думал, что это было только в случае, когда вы явно делаете поток параллельным, используяFiles.lines(...).parallel().forEach(...)
. – Klitos Kyriacou 9 November 2015 в 15:03forEach
не гарантирует никакого порядка, и причина проста в распараллеливании. Если порядок должен быть сохранен, используйтеforEachOrdered
. – Palec 10 November 2015 в 06:48