如何在java中将文件读入字符串?

时间:2009-11-01 10:11:21

标签: java

我已将文件读入String。该文件包含各种名称,每行一个名称。现在的问题是我想在String数组中使用这些名称。

为此,我写了以下代码:

String [] names = fileString.split("\n"); // fileString is the string representation of the file

但是我没有得到理想的结果,分割字符串后获得的数组长度为1.这意味着“fileString”没有“\ n”字符,但文件中有“\ n”字符

那么如何解决这个问题?

14 个答案:

答案 0 :(得分:44)

如何使用Apache CommonsCommons IOCommons Lang)?

String[] lines = StringUtils.split(FileUtils.readFileToString(new File("...")), '\n');

答案 1 :(得分:28)

问题不在于你如何拆分字符串;那个位是正确的。

您必须查看如何将文件读取到字符串。你需要这样的东西:

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 :(得分:17)

根据Garrett Rowe and Stan James的建议,您可以使用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();
  }
}

此代码没有外部依赖项。

警告:您应该将charset编码指定为Scanner构造函数的第二个参数。在这个例子中,我使用的是平台的默认值,但这肯定是错误的。

以下是如何使用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);
  }
}

答案 3 :(得分:8)

您可以将文件读入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]);

答案 4 :(得分:8)

特别是我喜欢使用java.nio.file包描述here

 String content = new String(Files.readAllBytes(Paths.get("/path/to/file")));

酷吧!

答案 5 :(得分:5)

Java中没有可以读取整个文件的内置方法。所以你有以下选择:

  • 使用非标准库方法,例如Apache Commons,请参阅romaintaz答案中的代码示例。
  • 循环一些read方法(例如FileInputStream.read,它读取字节,或FileReader.read,读取字符;两者都读取到预分配的数组)。这两个类都使用系统调用,因此如果您只读取少量数据(例如,小于4096字节),则必须通过缓冲(BufferedInputStreamBufferedReader)来加速它们。时间。
  • 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 :(得分:3)

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 :(得分:1)

我总是这样使用:

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

答案 8 :(得分:1)

逐行读取文本文件并将结果放入字符串数组而不使用第三方库的最简单解决方案是:

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

答案 9 :(得分:0)

更简单(没有循环),但不太正确方式是将所有内容读取到字节数组:

FileInputStream is = new FileInputStream(file);
byte[] b = new byte[(int) file.length()];  
is.read(b, 0, (int) file.length());
String contents = new String(b);

另请注意,这有严重的性能问题。

答案 10 :(得分:0)

如果您只有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。

答案 11 :(得分:0)

您还可以使用java.nio.file.Files将整个文件读入字符串列表,然后将其转换为数组等。假设一个名为filePath的String变量,以下两行将执行此操作:

List<String> strList = Files.readAllLines(Paths.get(filePath), Charset.defaultCharset());
String[] strarray = strList.toArray(new String[0]);

答案 12 :(得分:0)

您可以尝试Cactoos

import org.cactoos.io.TextOf;
import java.io.File;
new TextOf(new File("a.txt")).asString().split("\n")

答案 13 :(得分:0)

@Anoyz 答案的固定版本:

import java.io.FileInputStream;
import java.io.File;

public class App {
public static void main(String[] args) throws Exception {

    File f = new File("file.txt");
    long fileSize = f.length();

    String file = "test.txt";

    FileInputStream is = new FileInputStream("file.txt");
    byte[] b = new byte[(int) f.length()];  
    is.read(b, 0, (int) f.length());
    String contents = new String(b);
}
}