使用扫描器循环读取多个文件
Using a Scanner to read multiple files in a loop
对于一个学校项目,我正在尝试创建一个程序,该程序使用扫描仪读取文本文件的每一行并将其存储在一个变量中。该程序对给定目录中的每个文件执行此操作。
public static void init(final File folder) throws FileNotFoundException {
String foo, bar;
int slime, grit, ball, funk;
int count = folder.list().length;
for (final File fileEntry: folder.listFiles()) {
if(fileEntry.isDirectory()) {
init(fileEntry);
} else {
readfile(folder);
}
}
我已经成功地让程序在没有循环的情况下为一个文件执行此操作,但是一旦我添加了循环,它就不会 运行。我得到了要编译的代码。 .txt 文件只有一定数量的行,每行内容相似。
public static void readfile(final File folder) throws FileNotFoundException {
File file = folder;
String foo, bar;
int slime, grit, ball, funk;
Scanner input = new Scanner(file);
while (input.hasNextLine()) {
foo = input.nextLine();
System.out.println(foo);
bar = input.nextLine();
System.out.println(bar);
slime = input.nextInt();
System.out.println(slime);
grit = input.nextInt();
System.out.println(grit);
ball = input.nextInt();
System.out.println(ball);
funk = input.nextInt();
System.out.println(funk);
break;
}
}
在 运行 编译文件时我得到这个错误:
Exception in thread "main" java.io FileNotFoundException: home/work/txt (Is a directory)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
at java.base/java.io.FileInputStream<init>(FileInputStream.java:157)
at java.base/java.util.Scanner.<init>(Scanner.java:639)
at FileRead.readfile(FileRead.java:24)
at FileRead.init(FileRead.java:75)
at FileRead.main(FileRead.java:12)
main方法也没什么特别的。
public class FileRead {
public static void main(String args[]) throws FileNotFoundException {
final File folder = new File("/home/work/txt");
init(folder);
}
该程序的目标是创建一个对象来存储字符串和整数值供以后使用。将进行一些计算,但我认为这些细节对此并不重要,因为它们尚未实施。我 运行 在 Ubuntu 虚拟机上执行此操作。如果有人能提供任何答案,我将不胜感激,谢谢!
我认为不是
} else {
readfile(folder);
}
您想使用
} else {
readfile(fileEntry);
}
否则即使你正在检查当前元素是否是一个文件,你仍然将当前文件夹作为参数传递。
您不能使用扫描仪从这样的目录中读取所有文件。
你最好使用 nio 和 Files.readAllBytes();
public static void init(final File folder) throws FileNotFoundException {
List<String> fileStrings = new ArrayList<String>();
File[] files = folder.listFiles();
for (int i = 0; i < files.length; i++) {
filesStrings.add(new String(Files.readAllBytes(files[i].toPath())));
}
}
将@ControlAltDel 所做的与另一种目录迭代方法(在本例中为所有.txt 目录)相结合。您可以通过在命令行上传递目录路径来测试它:
import java.util.List;
import java.util.ArrayList;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.DirectoryStream;
import java.nio.file.DirectoryIteratorException;
import java.io.IOException;
public class AllFilesScanner {
public static void main(String[] args) {
Path dir = Path.of(args[0]);
List<String> fileStrings = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{txt}")) {
for (Path entry : stream) {
fileStrings.add(new String(Files.readAllBytes(entry)));
}
} catch (DirectoryIteratorException ex) {
ex.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(fileStrings);
}
}
对于一个学校项目,我正在尝试创建一个程序,该程序使用扫描仪读取文本文件的每一行并将其存储在一个变量中。该程序对给定目录中的每个文件执行此操作。
public static void init(final File folder) throws FileNotFoundException {
String foo, bar;
int slime, grit, ball, funk;
int count = folder.list().length;
for (final File fileEntry: folder.listFiles()) {
if(fileEntry.isDirectory()) {
init(fileEntry);
} else {
readfile(folder);
}
}
我已经成功地让程序在没有循环的情况下为一个文件执行此操作,但是一旦我添加了循环,它就不会 运行。我得到了要编译的代码。 .txt 文件只有一定数量的行,每行内容相似。
public static void readfile(final File folder) throws FileNotFoundException {
File file = folder;
String foo, bar;
int slime, grit, ball, funk;
Scanner input = new Scanner(file);
while (input.hasNextLine()) {
foo = input.nextLine();
System.out.println(foo);
bar = input.nextLine();
System.out.println(bar);
slime = input.nextInt();
System.out.println(slime);
grit = input.nextInt();
System.out.println(grit);
ball = input.nextInt();
System.out.println(ball);
funk = input.nextInt();
System.out.println(funk);
break;
}
}
在 运行 编译文件时我得到这个错误:
Exception in thread "main" java.io FileNotFoundException: home/work/txt (Is a directory)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
at java.base/java.io.FileInputStream<init>(FileInputStream.java:157)
at java.base/java.util.Scanner.<init>(Scanner.java:639)
at FileRead.readfile(FileRead.java:24)
at FileRead.init(FileRead.java:75)
at FileRead.main(FileRead.java:12)
main方法也没什么特别的。
public class FileRead {
public static void main(String args[]) throws FileNotFoundException {
final File folder = new File("/home/work/txt");
init(folder);
}
该程序的目标是创建一个对象来存储字符串和整数值供以后使用。将进行一些计算,但我认为这些细节对此并不重要,因为它们尚未实施。我 运行 在 Ubuntu 虚拟机上执行此操作。如果有人能提供任何答案,我将不胜感激,谢谢!
我认为不是
} else {
readfile(folder);
}
您想使用
} else {
readfile(fileEntry);
}
否则即使你正在检查当前元素是否是一个文件,你仍然将当前文件夹作为参数传递。
您不能使用扫描仪从这样的目录中读取所有文件。
你最好使用 nio 和 Files.readAllBytes();
public static void init(final File folder) throws FileNotFoundException {
List<String> fileStrings = new ArrayList<String>();
File[] files = folder.listFiles();
for (int i = 0; i < files.length; i++) {
filesStrings.add(new String(Files.readAllBytes(files[i].toPath())));
}
}
将@ControlAltDel 所做的与另一种目录迭代方法(在本例中为所有.txt 目录)相结合。您可以通过在命令行上传递目录路径来测试它:
import java.util.List;
import java.util.ArrayList;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.DirectoryStream;
import java.nio.file.DirectoryIteratorException;
import java.io.IOException;
public class AllFilesScanner {
public static void main(String[] args) {
Path dir = Path.of(args[0]);
List<String> fileStrings = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{txt}")) {
for (Path entry : stream) {
fileStrings.add(new String(Files.readAllBytes(entry)));
}
} catch (DirectoryIteratorException ex) {
ex.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(fileStrings);
}
}