공백으로 구분 된 값이 포함 된 텍스트 파일을 읽고 싶습니다. 값은 정수입니다. 어떻게 읽고 배열 목록에 넣을 수 있습니까?
다음은 텍스트 파일 내용의 예입니다.
1 62 4 55 5 6 77
나는 그것을 arraylist에 [1, 62, 4, 55, 5, 6, 77]
. Java에서 어떻게 할 수 있습니까?
답변:
를 사용 Files#readAllLines()
하여 텍스트 파일의 모든 줄을 List<String>
.
for (String line : Files.readAllLines(Paths.get("/path/to/file.txt"))) {
// ...
}
튜토리얼 : 기본 I / O> 파일 I / O> 텍스트 파일 읽기, 쓰기 및 만들기
정규식에 따라 in 부분 String#split()
을 분할하는 데 사용할 수 있습니다 String
.
for (String part : line.split("\\s+")) {
// ...
}
자습서 : 숫자 및 문자열> 문자열> 문자열에서 문자 조작
당신은 사용할 수 있습니다 Integer#valueOf()
을 변환 String
에 Integer
.
Integer i = Integer.valueOf(part);
튜토리얼 : 숫자와 문자열> 문자열> 숫자와 문자열 간 변환
에 List#add()
요소를 추가하는 데 사용할 수 있습니다 List
.
numbers.add(i);
자습서 : 인터페이스> 목록 인터페이스
따라서 간단히 말해서 (파일에 빈 줄이나 후행 / 선행 공백이 없다고 가정).
List<Integer> numbers = new ArrayList<>();
for (String line : Files.readAllLines(Paths.get("/path/to/file.txt"))) {
for (String part : line.split("\\s+")) {
Integer i = Integer.valueOf(part);
numbers.add(i);
}
}
이미 Java 8을 사용하는 경우 .NET으로 시작 하는 Stream API 를 사용할 수도 있습니다 Files#lines()
.
List<Integer> numbers = Files.lines(Paths.get("/path/to/test.txt"))
.map(line -> line.split("\\s+")).flatMap(Arrays::stream)
.map(Integer::valueOf)
.collect(Collectors.toList());
자습서 : Java 8 스트림으로 데이터 처리
Java 1.5는 파일 및 스트림의 입력을 처리하기위한 Scanner 클래스를 도입했습니다 .
파일에서 정수를 가져 오는 데 사용되며 다음과 같습니다.
List<Integer> integers = new ArrayList<Integer>();
Scanner fileScanner = new Scanner(new File("c:\\file.txt"));
while (fileScanner.hasNextInt()){
integers.add(fileScanner.nextInt());
}
그래도 API를 확인하십시오. 다른 유형의 입력 소스, 다른 구분 기호 및 다른 데이터 유형을 처리하기위한 더 많은 옵션이 있습니다.
이 예제 코드는 Java에서 파일을 읽는 방법을 보여줍니다.
import java.io.*;
/**
* This example code shows you how to read file in Java
*
* IN MY CASE RAILWAY IS MY TEXT FILE WHICH I WANT TO DISPLAY YOU CHANGE WITH YOUR OWN
*/
public class ReadFileExample
{
public static void main(String[] args)
{
System.out.println("Reading File from Java code");
//Name of the file
String fileName="RAILWAY.txt";
try{
//Create object of FileReader
FileReader inputFile = new FileReader(fileName);
//Instantiate the BufferedReader Class
BufferedReader bufferReader = new BufferedReader(inputFile);
//Variable to hold the one line data
String line;
// Read file line by line and print on the console
while ((line = bufferReader.readLine()) != null) {
System.out.println(line);
}
//Close the buffer reader
bufferReader.close();
}catch(Exception e){
System.out.println("Error while reading file line by line:" + e.getMessage());
}
}
}
이 예를보고 직접 시도해보십시오.
import java.io.*;
public class ReadFile {
public static void main(String[] args){
String string = "";
String file = "textFile.txt";
// Reading
try{
InputStream ips = new FileInputStream(file);
InputStreamReader ipsr = new InputStreamReader(ips);
BufferedReader br = new BufferedReader(ipsr);
String line;
while ((line = br.readLine()) != null){
System.out.println(line);
string += line + "\n";
}
br.close();
}
catch (Exception e){
System.out.println(e.toString());
}
// Writing
try {
FileWriter fw = new FileWriter (file);
BufferedWriter bw = new BufferedWriter (fw);
PrintWriter fileOut = new PrintWriter (bw);
fileOut.println (string+"\n test of read and write !!");
fileOut.close();
System.out.println("the file " + file + " is created!");
}
catch (Exception e){
System.out.println(e.toString());
}
}
}
재미로, 내가 좋아하는 모든 라이브러리를 이미 사용하고있는 실제 프로젝트에서 수행 할 작업이 있습니다 (이 경우 Guava , 이전에 Google Collections ).
String text = Files.toString(new File("textfile.txt"), Charsets.UTF_8);
List<Integer> list = Lists.newArrayList();
for (String s : text.split("\\s")) {
list.add(Integer.valueOf(s));
}
이점 : 유지 관리 할 자체 코드가 많지 않습니다 (예 : this 과 대조 ). 편집 :이 경우 tschaible의 스캐너 솔루션에 더 이상 코드 가 없다는 점은 주목할 가치가 있습니다!
단점 : 분명히이를 위해 새로운 라이브러리 종속성을 추가하고 싶지 않을 수 있습니다. (그러면 프로젝트에서 Guava를 사용하지 않는 것이 어리석은 일입니다. ;-)
이와 같은 단순 / 일반적인 작업 에는 Apache Commons (IO 및 Lang)를 사용하십시오 .
수입품 :
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.ArrayUtils;
암호:
String contents = FileUtils.readFileToString(new File("path/to/your/file.txt"));
String[] array = ArrayUtils.toArray(contents.split(" "));
끝난.
Java 7을 사용하여 NIO.2로 파일 읽기
다음 패키지를 가져옵니다.
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
다음은 파일을 읽는 프로세스입니다.
Path file = Paths.get("C:\\Java\\file.txt");
if(Files.exists(file) && Files.isReadable(file)) {
try {
// File reader
BufferedReader reader = Files.newBufferedReader(file, Charset.defaultCharset());
String line;
// read each line
while((line = reader.readLine()) != null) {
System.out.println(line);
// tokenize each number
StringTokenizer tokenizer = new StringTokenizer(line, " ");
while (tokenizer.hasMoreElements()) {
// parse each integer in file
int element = Integer.parseInt(tokenizer.nextToken());
}
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
한 번에 파일의 모든 행을 읽으려면 :
Path file = Paths.get("C:\\Java\\file.txt");
List<String> lines = Files.readAllLines(file, StandardCharsets.UTF_8);
지금까지 주어진 모든 대답에는 파일을 한 줄씩 읽고 줄을으로 String
가져온 다음 처리하는 것이 포함됩니다.String
.
이것이 이해하기 가장 쉬운 방법이라는 것은 의심의 여지가 없으며, 파일이 상당히 짧은 경우 (예 : 수만 줄) 효율성 측면에서도 허용됩니다. 그러나 파일이 길면 다음 두 가지 이유로 매우 비효율적 인 방법입니다.
String
때 한 번, 처리 할 때 한 번 처리됩니다.String
각 줄에 대해 새 줄을 만들고 다음 줄로 이동할 때 버립니다. 가비지 수집기는 결국 String
더 이상 원하지 않는 이러한 모든 개체 를 처리해야합니다 . 누군가 당신을 쫓아 내야합니다.속도에 관심이 있다면 데이터 블록을 읽고 한 줄씩 처리하는 것보다 바이트 단위로 처리하는 것이 훨씬 낫습니다. 숫자의 끝에 올 때마다 List
건물에 추가합니다 .
다음과 같이 나옵니다.
private List<Integer> readIntegers(File file) throws IOException {
List<Integer> result = new ArrayList<>();
RandomAccessFile raf = new RandomAccessFile(file, "r");
byte buf[] = new byte[16 * 1024];
final FileChannel ch = raf.getChannel();
int fileLength = (int) ch.size();
final MappedByteBuffer mb = ch.map(FileChannel.MapMode.READ_ONLY, 0,
fileLength);
int acc = 0;
while (mb.hasRemaining()) {
int len = Math.min(mb.remaining(), buf.length);
mb.get(buf, 0, len);
for (int i = 0; i < len; i++)
if ((buf[i] >= 48) && (buf[i] <= 57))
acc = acc * 10 + buf[i] - 48;
else {
result.add(acc);
acc = 0;
}
}
ch.close();
raf.close();
return result;
}
위의 코드는 이것이 ASCII라고 가정하고 (다른 인코딩에 대해 쉽게 조정할 수 있음) 숫자가 아닌 모든 것 (특히 공백 또는 줄 바꿈)은 숫자 사이의 경계를 나타냅니다. 또한 파일이 숫자가 아닌 것으로 끝나는 것으로 가정합니다 (실제로 마지막 줄은 개행으로 끝남). 그러나 그렇지 않은 경우를 처리하기 위해 조정할 수 있습니다.
그것은이다 훨씬 더 빨리, 더 의 어떤 것보다 String
이 질문에 대한 답으로 주어진 기반 접근 방식. 이 질문에서 매우 유사한 문제 에 대한 자세한 조사가 있습니다. 다중 스레드 라인으로 이동하려는 경우 더 개선 할 가능성이 있음을 알 수 있습니다.