如何拆分文件中的字符串并读取它们?

问题描述 投票:0回答:4

我有一个包含信息的文件。看起来像:

    Michael 19 180 Miami
    George 25 176 Washington
    William 43 188 Seattle

我想分割行和字符串并读取它们。我希望它看起来像:

    Michael
    19
    180
    Miami
    George
    ...

我使用了这样的代码:

    BufferedReader in = null;
    String read;
    int linenum;
    try{
        in = new BufferedReader(new FileReader("fileeditor.txt")); 
    }
    catch (FileNotFoundException e) {System.out.println("There was a problem: " + e);}
    try{
        for (linenum = 0; linenum<100; linenum++){
            read = in.readLine();
            if(read == null){} 
            else{
                String[] splited = read.split("\\s+");
                System.out.println(splited[linenum]);
           }
       }
    }
    catch (IOException e) {System.out.println("There was a problem: " + e);} 
}

这给了我的是

    Michael
    25
    188

我认为这可能是我的 for 循环的问题,但我不知道如何解决它。有什么帮助吗?

java split filereader
4个回答
10
投票

你已经成功了,这太棒了。

读取文件时,当到达流末尾时,

Reader
将返回
null
,这意味着没有其他内容可供读取。您当前的方法意味着您想要读取至少 100 行,但不能再多了...如果文件大小增加,将来这将成为问题...这也有点浪费

相反,我们应该使用

null
值来指示文件末尾..

当你分割一行时,它将包含许多元素。您正在使用

linenum
变量来打印这些。问题是,您已经阅读并拆分了该行,
linenum
与此任务无关,因为它代表您已经阅读的行数,而不是您刚刚拆分的字符串部分。

相反,您需要使用内部循环来显示每行的单独拆分元素...

例如...

BufferedReader in = null;
try {
    in = new BufferedReader(new FileReader("fileeditor.txt"));
    String read = null;
    while ((read = in.readLine()) != null) {
        String[] splited = read.split("\\s+");
        for (String part : splited) {
            System.out.println(part);
        }
    }
} catch (IOException e) {
    System.out.println("There was a problem: " + e);
    e.printStackTrace();
} finally {
    try {
        in.close();
    } catch (Exception e) {
    }
}

另外,不要忘记,如果你打开它,你一定会关上它;)

您可能还想花更多时间来了解 基本 I/O ;)


2
投票
 String[] splited = read.split("\\s+");
  for (int i= 0; i<splited.length; i++){
  System.out.println(splited[i]);
  }

分割字符串后应该循环结果。


1
投票

您可以使用

StreamTokenizer
。它将根据其设置将流拆分为令牌。从你的问题来看,我认为你想将行结尾视为令牌分隔符。代码如下所示:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.StreamTokenizer;

public class ReaderSample {

    public static void main(String[] args) {
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader("fileeditor.txt"));
            StreamTokenizer st = new StreamTokenizer(in);
            st.eolIsSignificant(false);
            // remove comment handling
            st.slashSlashComments(false);
            st.slashStarComments(false);

            while(st.nextToken() != StreamTokenizer.TT_EOF) {
                if (st.ttype == StreamTokenizer.TT_NUMBER) {
                    // the default is to treat numbers differently than words
                    // also the numbers are doubles
                    System.out.println((int)st.nval);
                }
                else {
                    System.out.println(st.sval);
                }
            }
        }
        catch(IOException ex) {
            System.err.println(ex.getMessage());
        }
        finally {
            if (in != null) {
                try {
                    in.close();
                }
                catch (IOException ex) {
                }
            }
        }
    }
}

根据您需要执行的操作以及可能需要设置不同选项的输入,文档应该可以为您提供帮助。


0
投票

我已将@MadProgrammer提供的答案代码重组为Java方法,您可以轻松地将其合并到您的开发中:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Post18607545 {
    public static void splitAndReadFile(String fileName) throws IOException {
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader(fileName));
            String read = null;
            while ((read = in.readLine()) != null) {
                String[] splited = read.split("\\s+");
                for (String part : splited) {
                    System.out.println(part);
                }
            }
        } catch (IOException e) {
            System.out.println("There was a problem: " + e);
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (Exception e) {
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.