Как читать файл в строку в 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")