如何从Java文本文件中读取单个单词(或行)?
正如标题所说,我正在尝试编写一个程序,可以从文本文件中读取单个单词,并将它们存储到如何从Java文本文件中读取单个单词(或行)?,java,text,io,text-files,inputstream,Java,Text,Io,Text Files,Inputstream,正如标题所说,我正在尝试编写一个程序,可以从文本文件中读取单个单词,并将它们存储到String变量中。我知道如何使用文件读取器或文件输入流读取单个字符,但对于我尝试的内容,这是行不通的。输入单词后,我试图使用.equals将其与程序中的其他字符串变量进行比较,因此最好是作为字符串导入。我也可以将文本文件中的整行作为字符串输入,在这种情况下,我只需在文件的每行上输入一个单词。如何从文本文件中输入单词并将其存储到字符串变量中 编辑: 好吧,这有点帮助。这可能对我有用,但我的问题有点不同的原因是,副本
String
变量中。我知道如何使用文件读取器
或文件输入流
读取单个字符
,但对于我尝试的内容,这是行不通的。输入单词后,我试图使用.equals将其与程序中的其他字符串变量进行比较,因此最好是作为字符串导入。我也可以将文本文件中的整行作为字符串输入,在这种情况下,我只需在文件的每行上输入一个单词。如何从文本文件中输入单词并将其存储到字符串变量中
编辑:
好吧,这有点帮助。这可能对我有用,但我的问题有点不同的原因是,副本只告诉我如何阅读一行。我试着读这行中的单个单词。所以基本上是把线串分开 您必须使用StringTokenizer!下面是一个例子,请阅读
private BufferedReader-innerReader;
公共无效加载文件(读卡器)
抛出IOException{
如果(读卡器==null)
{
抛出新的IllegalArgumentException(“读卡器无效!”);
}
this.innerReader=新的BufferedReader(读卡器);
弦线;
尝试
{
而((line=innerReader.readLine())!=null)
{
if(line==null | | line.trim().isEmpty())
抛出新的IllegalArgumentException(
“行空”);
//StringTokenizer对拆分字符串使用分隔符
StringTokenizer tokenizer=新的StringTokenizer(行,“”;//分隔符为“,”
if(tokenizer.countTokens()<4)
抛出新的IllegalArgumentException(
“令牌号无效(要从文本文件中读取行,可以使用此选项(使用try with resources):
相同内容的更紧凑、可读性更低的版本:
String line;
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("the_file_name"), Charset.forName("UTF-8")))) {
while ((line = br.readLine()) != null) {
// Do your thing with line
}
}
要将一行分为单个单词,可以使用:
这些都是非常复杂的答案。我相信它们都很有用。但我更喜欢优雅简单的扫描仪:
public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(new File("fileName.txt"));
while(sc.hasNext()){
String s = sc.next();
//.....
}
}
在java8中,您可以执行以下操作:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class Foo {
public List<String> readFileIntoListOfWords() {
try {
return Files.readAllLines(Paths.get("somefile.txt"))
.stream()
.map(l -> l.split(" "))
.flatMap(Arrays::stream)
.collect(Collectors.toList());
}
catch (IOException e) {
e.printStackTrace();
}
return Collections.emptyList();
}
}
import java.io.IOException;
导入java.nio.file.Files;
导入java.nio.file.path;
导入java.util.array;
导入java.util.Collections;
导入java.util.List;
导入java.util.stream.collector;
公开课Foo{
公共列表ReadFileInToListoWords(){
试一试{
return Files.readAllLines(path.get(“somefile.txt”))
.stream()
.map(左->左拆分(“”)
.flatMap(数组::流)
.collect(Collectors.toList());
}
捕获(IOE异常){
e、 printStackTrace();
}
返回集合。emptyList();
}
}
尽管我怀疑split的参数可能需要更改,例如从一个单词的末尾删去标点符号可能与@EricLeibenguth重复,阅读上面的编辑否,不,仔细看看答案:下一行使用Scanner.nextLine()
,下一行使用Scanner.next()
下一个单词。好的,谢谢,我可能需要对这个字符串标记器做一些研究,因为我以前从未见过它。几分钟后我会回到问题上来。我做了更多的修改,希望你能帮到我。谢谢你的回答@Michelacorte。这很好,我会灵巧地对此进行研究,但现在我会继续swer更符合我的要求,对我来说更容易理解(我还不是很好LOL)好的,谢谢!这正是我想要的。是的,巧妙地同意,它们对我来说相当复杂。我基本上使用了标记重复问题的答案和@spork的答案的混合。不过谢谢你的回答!
while ((line = br.readLine()) != null) {
String[] words = line.split(" ");
// Now you have a String array containing each word in the current line
}
public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(new File("fileName.txt"));
while(sc.hasNext()){
String s = sc.next();
//.....
}
}
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class Foo {
public List<String> readFileIntoListOfWords() {
try {
return Files.readAllLines(Paths.get("somefile.txt"))
.stream()
.map(l -> l.split(" "))
.flatMap(Arrays::stream)
.collect(Collectors.toList());
}
catch (IOException e) {
e.printStackTrace();
}
return Collections.emptyList();
}
}