Как читать файл в строку в java?
Я прочитал файл в String. Файл содержит различные имена, по одному имени в строке. Теперь проблема в том, что мне нужны эти имена в массиве String.
Для этого я написал следующий код:
String [] names = fileString.split("\n"); // fileString is the string representation of the file
Но я не получаю желаемых результатов, и массив, полученный после разделения строки, имеет длину 1. Это означает, что "fileString" не имеет символа "\n", но файл имеет этот символ "\n".
Итак, как обойти эту проблему?
Ответы
Ответ 1
Проблема заключается не в том, как вы разделяете строку; этот бит правильный.
Вы должны просмотреть, как вы читаете файл в строке. Вам нужно что-то вроде этого:
private String readFileAsString(String filePath) throws IOException {
StringBuffer fileData = new StringBuffer();
BufferedReader reader = new BufferedReader(
new FileReader(filePath));
char[] buf = new char[1024];
int numRead=0;
while((numRead=reader.read(buf)) != -1){
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
}
reader.close();
return fileData.toString();
}
Ответ 2
Как насчет использования Apache Commons (Commons IO
и Commons Lang
)?
String[] lines = StringUtils.split(FileUtils.readFileToString(new File("...")), '\n');
Ответ 3
Как предложено Гарретт Роу и Стэн Джеймс, вы можете использовать java.util.Scanner
:
try (Scanner s = new Scanner(file).useDelimiter("\\Z")) {
String contents = s.next();
}
или
try (Scanner s = new Scanner(file).useDelimiter("\\n")) {
while(s.hasNext()) {
String line = s.next();
}
}
Этот код не имеет внешних зависимостей. Ниже приведен пример использования java.util.Scanner
с правильной обработкой ресурсов и ошибок:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.Iterator;
class TestScanner {
public static void main(String[] args)
throws FileNotFoundException {
File file = new File(args[0]);
System.out.println(getFileContents(file));
processFileLines(file, new LineProcessor() {
@Override
public void process(int lineNumber, String lineContents) {
System.out.println(lineNumber + ": " + lineContents);
}
});
}
static String getFileContents(File file)
throws FileNotFoundException {
try (Scanner s = new Scanner(file).useDelimiter("\\Z")) {
return s.next();
}
}
static void processFileLines(File file, LineProcessor lineProcessor)
throws FileNotFoundException {
try (Scanner s = new Scanner(file).useDelimiter("\\n")) {
for (int lineNumber = 1; s.hasNext(); ++lineNumber) {
lineProcessor.process(lineNumber, s.next());
}
}
}
static interface LineProcessor {
void process(int lineNumber, String lineContents);
}
}
Ответ 4
Вы можете прочитать свой файл в List
вместо String
, а затем преобразовать в массив:
//Setup a BufferedReader here
List<String> list = new ArrayList<String>();
String line = reader.readLine();
while (line != null) {
list.add(line);
line = reader.readLine();
}
String[] arr = list.toArray(new String[0]);
Ответ 5
В Java нет встроенного метода, который может читать весь файл. Таким образом, у вас есть следующие возможности:
- Используйте нестандартный библиотечный метод, например Apache Commons, см. пример кода в сообщении romaintaz.
- Проведите цикл вокруг некоторого метода
read
(например, FileInputStream.read
, который считывает байты или FileReader.read
), который читает символы, оба считываются в предварительно выделенный массив). Оба класса используют системные вызовы, поэтому вам придется ускорить их с помощью bufering (BufferedInputStream
или BufferedReader
), если вы читаете только небольшой объем данных (скажем, менее 4096 байт) за раз.
- Петля вокруг
BufferedReader.readLine
. Существует фундаментальная проблема, заключающаяся в том, что он отбрасывает информацию о том, существует ли '\n'
в конце файла - так, например, он не может отличить пустой файл от файла, содержащего только новую строку.
Я бы использовал этот код:
// charsetName can be null to use the default charset.
public static String readFileAsString(String fileName, String charsetName)
throws java.io.IOException {
java.io.InputStream is = new java.io.FileInputStream(fileName);
try {
final int bufsize = 4096;
int available = is.available();
byte[] data = new byte[available < bufsize ? bufsize : available];
int used = 0;
while (true) {
if (data.length - used < bufsize) {
byte[] newData = new byte[data.length << 1];
System.arraycopy(data, 0, newData, 0, used);
data = newData;
}
int got = is.read(data, used, data.length - used);
if (got <= 0) break;
used += got;
}
return charsetName != null ? new String(data, 0, used, charsetName)
: new String(data, 0, used);
} finally {
is.close();
}
}
Приведенный выше код имеет следующие преимущества:
- Правильно: он читает весь файл, не отбрасывая никакого байта.
- Он позволяет указать набор символов (кодирование), который использует файл.
- Это быстро (независимо от того, сколько строк в нем содержится).
- Это не пустая память (независимо от количества строк в файле).
Ответ 6
FileReader fr=new FileReader(filename);
BufferedReader br=new BufferedReader(fr);
String strline;
String arr[]=new String[10];//10 is the no. of strings
while((strline=br.readLine())!=null)
{
arr[i++]=strline;
}
Ответ 7
В частности, я люблю этот, используя java.nio.file, также описанный .
String content = new String(Files.readAllBytes(Paths.get("/path/to/file")));
Прохладный huhhh!
Ответ 8
Я всегда использую этот способ:
String content = "";
String line;
BufferedReader reader = new BufferedReader(new FileReader(...));
while ((line = reader.readLine()) != null)
{
content += "\n" + line;
}
// Cut of the first newline;
content = content.substring(1);
// Close the reader
reader.close();
Ответ 9
Простейшим решением для чтения текстового файла по строкам и помещением результатов в массив строк без использования сторонних библиотек будет следующее:
ArrayList<String> names = new ArrayList<String>();
Scanner scanner = new Scanner(new File("names.txt"));
while(scanner.hasNextLine()) {
names.add(scanner.nextLine());
}
scanner.close();
String[] namesArr = (String[]) names.toArray();
Ответ 10
Простейший (без циклов), , но менее правильный способ состоит в том, чтобы читать все в массив байтов:
FileInputStream is = new FileInputStream(file);
byte[] b = new byte[(int) file.length()];
is.read(b, 0, (int) file.length());
String contents = new String(b);
Также обратите внимание, что это имеет серьезные проблемы с производительностью.
Ответ 11
Если у вас есть только InputStream, вы можете использовать InputStreamReader.
SmbFileInputStream in = new SmbFileInputStream("smb://host/dir/file.ext");
InputStreamReader r=new InputStreamReader(in);
char buf[] = new char[5000];
int count=r.read(buf);
String s=String.valueOf(buf, 0, count);
При необходимости вы можете добавить цикл и StringBuffer.
Ответ 12
Вы также можете использовать java.nio.file.Files
для чтения всего файла в String List, затем вы можете преобразовать его в массив и т.д. Предполагая переменную String с именем filePath, следующие две строки сделают это:
List<String> strList = Files.readAllLines(Paths.get(filePath), Charset.defaultCharset());
String[] strarray = strList.toArray(new String[0]);
Ответ 13
Вы можете попробовать Cactoos:
import org.cactoos.io.TextOf;
import java.io.File;
new TextOf(new File("a.txt")).asString().split("\n")