使用BufferedReader或Scanner读取txt文件。在我的例子中只有扫描仪工作。为什么?

时间:2015-01-20 17:57:42

标签: java arrays try-catch java.util.scanner bufferedreader

使用BufferedReader方法代替Scanner读取txt文件,包含2到10000之间的所有素数。 我想将整数放在一个高大的数组中。 使用Scanner方法可以使用,但不能使用BufferedReader等效方法。

try语句适用于这两种方法,但是当我在finally语句中关闭BufferedReader时,它表示我的变量不存在。 如果我使用扫描仪方法,它就可以正常工作。

扫描仪(工作):

public class Main {
public static void main(String[] arg) throws IOException {
    File file = new File ("C:/Users/Victor/workspace/Bvijfb/Priem.txt");
    file.getParentFile().mkdirs();
    FileWriter xw = new FileWriter("Priem.txt");
    PrintWriter yw = new PrintWriter(xw);

    int i;
    boolean isPriem;
    int[] tall = new int[1240];

    for (i = 2; i < 10000; i++) {
        isPriem = true;

        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                isPriem = false;
                break;
            }
        }
        if (isPriem == true)
            yw.println("" + i);
    }

    yw.close();
    Scanner sc = new Scanner(file);
    int a = 0;

    try {
        while (sc.hasNextLine()) { 
            if(sc.hasNextInt()){
                tall[a] = sc.nextInt();
                a++;
            }
            else {
                break;
            }
        }
     } finally {
         sc.close();
          }
}

try语句使用BufferedReader方法:

try{            
        InputStream is = new FileInputStream(file);       
        InputStreamReader isr = new InputStreamReader(is);              
        BufferedReader br = new BufferedReader(isr);

        int a = 0;
        int value = 0;      

        while ((value = br.read()) != -1) { 
            tall[a] = value;
            a++;
        }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
           is.close();
           isr.close();
           br.close();
        }

2 个答案:

答案 0 :(得分:0)

您的扫描程序代码通过查找定义int字符来查找int。例如,连续的三个字符'1''2''3'123代码读取为int值Scanner

但是你的BufferedReader代码的工作水平低于此水平;它适用于个人角色级别。因此,当您在我的br.read()示例中首次123时,您会得到值49('1' == 49)。

BufferedReader未实现Scanner所执行的解析功能。如果需要,请使用Scanner(或在必要时实施自己的自定义)。


无关的旁注:在任何模糊的Java版本中,try示例中的BufferedReader作为资源尝试会更好:

try (
    InputStream is = new FileInputStream(file);       
    InputStreamReader isr = new InputStreamReader(is);              
    BufferedReader br = new BufferedReader(isr)
    ) {
    int a = 0;
    int value = 0;      

    while ((value = br.read()) != -1) { 
        tall[a] = value;
        a++;
    }
} catch (Exception e){
    e.printStackTrace(); // This is also generally poor practice, but for quick-and-dirty code...
}

请注意,我从不致电close。我没有,try-with-resources为我处理它,并处理它的属性,无论在何处或什么时候抛出异常。例如,在您的代码中,如果由于某种原因new InputStreamReader(is)投掷,您将is保持打开状态。

答案 1 :(得分:0)

对于初学者,当使用BufferedReader时,您可能希望使用readLine()而不是read()。 Read一次消耗一个二进制字节; readLine()将一行字节转换为字符串,并且(假设这些文件是每行一行),String将是素数的表示。

如果文件中每行文本有多个数字,则需要拆分字符串。

为了将该String转换为int,您需要在其上运行Integer.parseInt()。

另外,您可以按照以下步骤删除一些设置仪式:

FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr);

甚至只是

BufferedReader br = new BufferedReader(new FileReader(fileName));