有人能告诉我这个Java类的功能吗? I / O相关

时间:2010-04-16 13:37:15

标签: java

我相对较新的Java并尝试学习I / O语法。有人能给我一个概述这个代码的作用吗?谢谢!

import java.io.*;

public class FileReader {
    private String openFile="";
    private String saveFile="";

FileReader(openFile, saveFile)
{
    this.openFile=openFile;
    this.saveFile=saveFile;
}



public String process(){
 System.out.println(this.openFile);
 System.out.println(this.saveFile);
 BufferedReader open=null;
 FileReader openFR=null;
 FileWriter save=null;
 int counter=0;

 String output="";

 if(openFile.equals("")){
     return "No open file specifified\n";
 }
 if(this.saveFile.equals("")){
    return "No save file specified\n";
 }
 try {
     openFR = new FileReader(this.openFile);
     open = new BufferedReader(openFR);

 } catch (FileNotFoundException e) {
     return ("Open file no longer exists\n");
 }
 try {
     save = new FileWriter(saveFile);
 }
 catch (IOException e){
     return ("Error saving the file\n");
 }


 try{
     String temp = open.readLine();
     while(temp != null){
         temp = open.readLine();
         counter++;
         save.write(output + "\n");
     }
 } catch (IOException e){
     e.getStackTrace();
     return ("Error reading open file");
 }

 try {
     save.flush();
 } catch (IOException e) {
     e.printStackTrace();
     return ("Error writing save file");
 }

 return "Operation completed successfully";

 }
}

6 个答案:

答案 0 :(得分:2)

这是代码的一个很好的例子!

一些问题:

  • 不关闭溪流!
    这可能会导致由于文件锁定和/或写入文件不完整而导致的问题
  • 不使用例外或返回状态来指示错误 如果您想知道操作是否成功,则必须比较返回的字符串。如果有人更改字符串,则依赖应用程序将不再运行。
  • 仅在构造函数中设置的成员变量应该是最终的 所以他们不能被意外分配。
  • 应在需要时声明局部变量 在方法开始时声明它们是旧语言的遗留物
  • 模棱两可的例外不会暴露 如果发生异常,您将永远不会知道它是什么,您只会看到“读取打开文件时出错”

答案 1 :(得分:1)

counter个新行写入保存文件,因为output始终为""。我想它应该将一个文件复制到另一个文件,但应该有save.write(temp + "\n");这样做。

答案 2 :(得分:1)

它打开两个文件,然后(如果两个文件都存在且可以打开),从第一个文件中读取行并将空行写入第二个文件中的无限循环,直到它到达第一个文件的结尾。

它不会关闭任何文件btw。

答案 3 :(得分:0)

它尝试复制文本文件,但似乎有一些错误。

答案 4 :(得分:0)

Here是Java I / O教程的链接。如果你想要掌握Java I / O,这是最好的起点。

您粘贴的代码尝试一次一行地将源文件复制到新的目标文件,但它包含可防止这种情况发生的错误,即:

  • 读取文件的第一行并立即将其丢弃。
  • 每行读取永远不会分配给“输出”,因此永远不会写入目标文件。唯一写的是“\ n”。

答案 5 :(得分:0)

对我来说,除了抛出大量的编译时错误之外,这段代码绝对没有任何作用。

首先你的类名FileReader与java.io.FileReader冲突,所以你的调用

new FileReader(this.openFile);

实际上是试图实例化你的类FileReader的实例(没有构造函数接受单个字符串)而不是java.io.FileReader

这个openFR被声明为FileReader类型(你的FileReader不是java.io.FileReader)所以调用

open = new BufferedReader(openFR);

也失败了,因为BufferedReader需要一个java.io.FileReader对象。

FileReader的构造函数不声明参数的类型:

FileReader(openFile, saveFile) {
    this.openFile=openFile;
    this.saveFile=saveFile;
}

应该是:

FileReader(String openFile, String saveFile) {
    this.openFile = openFile;
    this.saveFile = saveFile;
}

一旦修复了这些错误,程序会做什么:

它尝试通过读取openFile中的所有行并将它们写入saveFile来复制文件。

它实际上做的是:

从文件中读取第一行并将其丢弃。进入一个循环,它继续读取行并递增一个计数器(这也是错误的,因为它从不包括计数中的第一行,除非目的是忽略第一行???)。然后它为openFile中的每一行(减去第一行)的saveFile写一个空行。你也永远不会对计数器值做任何事情,那么计算它有什么意义呢?