簡體   English   中英

有人可以告訴我這個Java類做什么嗎? I / O相關

[英]Can someone tell me what this Java class does? I/O related

我是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";

 }
}

這是一個很好的例子,說明如何編碼!

一些問題:

  • 不關閉流!
    由於鎖定的文件和/或不完整的書面文件,這可能導致問題
  • 不使用異常或返回狀態來指示錯誤。
    如果您想知道操作是否成功,則必須比較返回的Strings。如果有人更改了String,則依賴的應用程序將不再運行。
  • 僅在構造函數中設置的成員變量應為最終變量
    因此,它們不會被意外分配。
  • 局部變量應在需要時聲明
    在方法開始時聲明它們是舊語言的遺跡
  • 不公開模棱兩可的異常
    如果發生異常,您將永遠不知道它是什么,您只會看到“讀取打開的文件時出錯”

因為output始終為"" ,所以將新行的counter編號寫入saveFile。 我猜它可能會將一個文件復制到另一個文件,但是應該有save.write(temp + "\\n"); 這樣做。

它打開兩個文件,然后(如果兩個文件都存在並且可以打開),從第一個文件讀取行,並 以無窮循環 將空行寫入第二個文件 直到到達第一個文件的末尾。

它不會關閉任何文件。

它嘗試復制文本文件,但似乎有一些錯誤。

是Java I / O教程的鏈接。 如果您想使用Java I / O,那么這是最好的起點。

您粘貼的代碼嘗試一次將源文件復制到一個新的目標文件中,但是其中包含的錯誤會阻止這種情況的發生,即:

  • 讀取文件的第一行,並立即將其丟棄。
  • 讀取的每一行都不會分配給“輸出”,因此也永遠不會寫入目標文件。 唯一被寫入的是“ \\ n”。

對我來說,這段代碼除了拋出很多編譯時錯誤外,什么也不做。

首先,您的類名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。 您也永遠不會對計數器值做任何事情,那么對它進行計數有什么意義呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM