使用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();
}
答案 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));