LAREINA.JO
2021-03-24 21:46
采纳率: 50%
浏览 89
已采纳

Java 通过LinkedList读写文件并通过JUnit4测试

老师给的练习题,通过修改已给的代码,完成相对路径文件的读写,并通过JUnit4的测试(测试文件已给,不需要更改)。真的很不擅长修改代码,看得我头都要炸了,可还是通过不了,全部文件的链接在下面。

package edu.ucalgary.ensf409;

import java.io.*;
import java.util.*;


public class ENSFStorage {
  private static final DIR = "data";
  private static final PREFIX = "Error: ";

  // One argument constructor
  public void ENSFStorage(String fileName) {
    this.fileName = fileName;
  }

  public LinkedList<String> getDataElements() {
    return dataElements;
  }

  // Return the fileName, which is a relative path
  public String getFileName() {
      return this.fileName;
  }
  

  // Set the fileName
  public void setFileName(String fileName) {
    this.fileName = fileName;
  }


  // Add a data element to the end of the list
  public void addDataElement(String dataElement) {
  }


  // Given an element and an index, add the element to the list at that index, if it is in bounds.
  // If the file exists, keep it up-to-date
  public void addDataElement(String dataElement, int position) {
  }

  // Read in the specified file by name.
  public void readFile(String fileName) {
    this.setFileName(fileName)
    this.readFile();
  }


  // Read in the file stored as member data.
  public void readfile() {
    BufferedReader file = null;

    // No filename was set
    if (this.fileName == null) {
      System.err.printf(PREFIX + "FileName must be specified with setter or method call.%n");
      System.exit(1);
    }

    // Empty out the current list, remove any concept of largest size
    dataElements.clear(); 
    
    // Read in the file
    try {
      file = new BufferedReader(new FileReader(this.fileName));
      String tmp = new String();
      while ((tmp = file.readLine()) != null) {
         this.addDataElement(tmp);
      }
    } 

    catch (Exception e) {
      System.err.println(PREFIX + "I/O error opening/reading file.");
      System.err.println(e.getMessage());
      closeReader(file);
      System.exit(1);
    }
    
    closeReader(file);

  }


  // Delete file or directory
  public void cleanUp() {
    String absolute = System.getProperty("user.dir");
    File abs = new File(absolte);
    File path = new File(abs, this.fileName);
    cleanUp(path);
  }

  // Write out the file
  public void writeFile() {
    File directory = new File(DIR);
    BufferedWriter file = null;

    // FileName must have been specified
    if (this.fileName == null) {
      System.err.printf(PREFIX  "FileName must be specified with setter or method call.%n");
      System.exit(1);
    }
 
    // Create directory if it doesn't exist; if it does exist, make sure it is a directory
    try {
      if (! directory.exists()) {
        directory.mkdir();
      } else {
        if (! directory.isDirectory()) {
          System.err.printf(PREFIX + "file %s exists but is not a directory.%n", DIR);
          System.exit(1);
        }
      }
      cleanUp(); // Delete any existing file
    }

    catch(Exception e) {
      System.err.printf(PREFIX + "unable to create directory %s.%n", DIR);
      System.err.println(e.getMessage());
      System.exit(1);
    }

    try {
      file = new BufferedWriter(new FileWriter(this.fileName));

      // For each element, convert to char array and write char array
      // Ensure array is padded to set length
      Iterator<String> it = this.dataElements.iterator();
      while(it.hasNext()) {
        String tmp = new String(it.next());
        file.write(tmp, 0, tmp.length());
        file.newLine();
      }
    }

    catch (Exception e) {
      System.err.println(PREFIX + "I/O error opening/writing file.");
      System.err.println(e.getMessage());
      closeWriter(file);
      System.exit(1);
    }
    
    closeWriter(file);
  }

 
  // writeFile while specifying fileName at same time
  public void writeFile(String fileName) {
    this.setFileName(fileName);
    this.writeFile();
  }



/* Private methods */


  private closeWriter(BufferedWriter file) {
      try {
        if (file != null) {
          file.close();
        }
      }

      catch (Exception e) {
        System.err.println(PREFIX + "I/O error closing file.");
        System.err.println(ex.getMessage());
        System.exit(1);
      }
  }


  private void closeReader(BufferedReader file) {
      try {
        if (file != null) {
          file.close();
        }
      }

      catch (Exception e) {
        System.err.println(PREFIX + "I/O error closing file.");
        System.err.println(e.getMessage());
        System.exit(1);
      }
  }

  // Give us the full relative path to the filename, OS independently
  private String getRelativePath(String filename) {
    File path = new File(DIR);
    File full = new File(path, filename);
    return full.getPath();
  }

  // If the file has been written, a new element cannot be more chars
  // than the largest existing element
  private boolean checkSize(String arg) {
     if (arg.length() > this.getBiggestSize().length()) {
       return false;
     }
     return true; 
  }


  // Get the biggest element we have
  private String getBiggestSize() {
     var big = new String();
     Iterator<String> it = this.dataElements.iterator();
     while(it.hasNext()) {
       String maybe = it.next();
       int tmp = maybe.length();
       if (tmp > big.length()) {
         big = maybe;
       }
     }
     return big;
  }


  // Delete file or directory
  private void cleanUp(File theFile) {
    try {
      if (theFile.isDirectory()) {
        // Get all files in the directory
        File[] files = theFile.listFiles();
      
        // Recursively delete all files/subdirs
        if (files != null) {
          for(File f : files) {
            cleanUp(f);
          }
        }
      }
    
      // Plain file or empty directory
      theFile.delete();
    }

    catch (Exception e) {
      System.err.printf(PREFIX + "unable to remove file %s.%n", this.fileName);
      System.err.println(e.getMessage());
      System.exit();
    }
  }

}


//下面是Test
package edu.ucalgary.ensf409;

import static org.junit.Assert.*;
import org.junit.*;
import java.io.*;
import java.util.*;
import org.junit.contrib.java.lang.system.ExpectedSystemExit;

public class ENSFStorageTest {
  public final static String DIR = "data";
  public final static String FILE = "out.dat";

  @Test
  // Constructor created with zero arguments
  // addDataElement() with one argument
  // Use getDataElements() to retrieve values
  public void testConstructor0Add1GetDataElements() {
    ENSFStorage storage = new ENSFStorage();

    // Create an array and add the lines
    String[] eDickinson = {
      "Because I could not stop for Death –",
      "He kindly stopped for me –",
      "The Carriage held but just Ourselves –",
      "And Immortality."
    };
    for (String val:eDickinson) { 
      storage.addDataElement(val);
    }

    // Retrieve list, convert to array, see if it matches
    LinkedList<String> data = storage.getDataElements();
    String[] dataArray = data.toArray(new String[data.size()]);
    assertTrue("Adding data elements and retrieving complete list with getDataElements failed", Arrays.equals(eDickinson, dataArray));
  }

  @Test
  // Constructor created with zero arguments
  // addDataElement() with one argument
  // Use asSringArray() to retrieve values
  public void testConstructor0Add1AsStringArray() {
    ENSFStorage storage = new ENSFStorage();

    // Create an array and add the lines
    String[] rFrost = {
      "The only other sound's the sweep",
      "Of easy wind and downy flake.",
      "The woods are lovely, dark and deep,"
    };
    for (String val:rFrost) {
      storage.addDataElement(val);
    }
    
    // Retrieve data as an array, see if it matches
    String[] dataArray = storage.asStringArray();
    assertTrue("Adding data elements and retrieving complete list with asStringArray failed", Arrays.equals(rFrost, dataArray));
  }

  @Test
  // Constructor created with zero arguments
  // addDataElement() with two arguments
  // Use getDataElements() to retrieve values
  public void testConstructor0Add2GetDataElements() {
    ENSFStorage storage = new ENSFStorage();
 
    // Create a list of Strings, then make an array of what is expected
    String line1 = "Whan that Aprill with his shoures soote";
    String line2 = "The droghte of March hath perced to the roote,";
    String line3 = "And bathed every veyne in swich licour";
    String line1alt = "When April with its sweet-smelling showers";
    String line2alt = "Has pierced the drought of March to the root,";
    String[] expected = { line1alt, line2alt, line3 };

    // Add three lines sequentially, then overwrite two of them
    storage.addDataElement(line1);
    storage.addDataElement(line2);
    storage.addDataElement(line3);
    storage.addDataElement(line1alt, 0);
    storage.addDataElement(line2alt, 1);
    
    // Retrieve list, convert to array, see if it matches
    LinkedList<String> data = storage.getDataElements();
    String[] dataArray = data.toArray(new String[data.size()]);
    assertTrue("Adding data elements and retrieving complete list with getDataElements failed", Arrays.equals(expected, dataArray));
  }

  @Test
  // Constructor created with one argument
  // Check if fileName is set (including data dir) using getFileName()
  public void testConstructor1getFileName() {
    String fn = "thefilename";
    String expected = addPath(fn);
    ENSFStorage storage = new ENSFStorage(fn); 

    String got = storage.getFileName();
    assertEquals("FileName wasn't correctly stored", expected, got);
  }

  @Test
  // Constructor created with one argument
  // Use setFileName, which should replace the stored value
  public void testConstructor1SetFileName1GetFileName() {
    String origfn = "thefilename";
    String newfn = "differentfile";
    String expected = addPath(newfn);
    ENSFStorage storage = new ENSFStorage(origfn); 

    // Replace fileName, see if it was replaced
    storage.setFileName(newfn);
    String got = storage.getFileName();
    assertEquals("setFileName() didn't replace stored FileName", expected, got);
  }

  @Test
  // Constructor created with zero arguments
  // writeFile() with 1 argument 
  // File does not already exist
  public void testConstructor0writeFile1File0() throws Exception {
    ENSFStorage storage = new ENSFStorage(); 

    // Add some lines of data
    String[] wOwen = {
      "In all my dreams before my helpless sight",
      "He plunges at me, guttering, choking, drowning."
    };
    for (String val:wOwen) { // Add some lines of data
      storage.addDataElement(val);
    }

    // Write out to named file. The directory name should have been appended when
    // the filename was provided.
    storage.writeFile(FILE); 

    // Read in the data file, ensure all lines match expectations
    String[] ret = readFile(addPath(FILE));
    boolean match = true;
    for (int i=0; i < ret.length; i++) {
      if (ret[i].equals(wOwen[i])==false) {
        match = false;
      }
    }
    assertTrue("Empty file incorrectly written (zero arg constructor)", match);
  }

  @Test
  // cleanUp() method removes the data file and directory
  public void testCleanUp() throws Exception {
    String[] original = writeTestData();

    // Create the constructor, delete the file
    ENSFStorage storage = new ENSFStorage(FILE);
    storage.cleanUp();

    // Determine if file exists - it should not
    File fn = new File(addPath(FILE));
    assertFalse("File stored as fileName was not deleted", fn.exists());
  }

  @Test
  // Check method readFile() with 0 arguments, fileName already specified
  public void testReadFile0() throws Exception {
    String[] original = writeTestData();

    ENSFStorage storage = new ENSFStorage(FILE);
    storage.readFile();
    String[] check = storage.asStringArray();
    assertTrue("Reading in the file with no arguments failed", Arrays.equals(original, check));
  }

  @Test
  // Check method readFile() with 1 argument
  public void testReadFile1() throws Exception {
    String[] original = writeTestData();

    ENSFStorage storage = new ENSFStorage();
    storage.readFile(FILE);
    String[] check = storage.asStringArray();
    assertTrue("readFile() with one argument failed", Arrays.equals(original, check));
  }

  @Test
  // Read in file, modify file. File should be automatically written
  public void testModifyFile() throws Exception {
    String[] original = writeTestData();

    ENSFStorage storage = new ENSFStorage();
    storage.readFile(FILE);

    // Data we will be inserting
    String[] tmp = {
      "Rare pears and greengages,",
      "Wild free-born cranberries,"
    };

    // Create a new array of the data we expect to get
    // We are adding one element at the end, and overwriting the first element
    String[] expected = new String[original.length+1];
    for (int i=0; i < original.length; i++) {
      expected[i] = original[i];
    }
    expected[0] = tmp[0];
    expected[original.length] = tmp[1];

    // Overwrite the elements. This should automatically write them to the file.
    storage.addDataElement(tmp[0], 0);
    storage.addDataElement(tmp[1]);

    // Check if the data in the file matches our expectations
    String[] check = readFile(addPath(FILE));
    assertTrue("addDataElement() automatically writes when data is changed on existing file", Arrays.equals(expected, check));
  }



/* Tests involving expected System.exit() 
*  ExpectedSystemExit is provided by org.junit.contrib.java.lang.system.ExpectedSystemExit
*  which can be downloaded as a .jar from https://stefanbirkner.github.io/system-rules/
*  or found in the provided lib directory.
*  Store together with the hamcrest and junit jar files, and include as part of javac/java calls:
*  .:lib/junit-4.13.2.jar:lib/hamcrest-core-1.3.jar:lib/system-rules-1.19.0.jar (Mac & Linux)
*  .;lib/junit-4.13.2.jar;lib/hamcrest-core-1.3.jar;lib/system-rules-1.19.0.jar (Windows)
*/

  @Rule
  // Handle System.exit() status
  public final ExpectedSystemExit exit = ExpectedSystemExit.none();

  @Test
  // If file already exists, we cannot add a line longer than the longest existing line
  public void testEnforcedLongestLine() throws Exception {
    String[] original = writeTestData();
    
    ENSFStorage storage = new ENSFStorage();
    storage.readFile(FILE);

    // Try to add a really long line
    exit.expectSystemExitWithStatus(1);
    storage.addDataElement("A really long line which far exceeds the number of characters in the existing longest line");
  }

  @Test
  // Constructor created with zero arguments
  // addDataElement with 2 arguments and illegal position
  // Should give System.err message and exit(1)
  public void testConstructor0Add2TooHighIndex() {
    ENSFStorage storage = new ENSFStorage();
    exit.expectSystemExitWithStatus(1);

    // Add data to fill elements 0 and 1
    storage.addDataElement("Maybe January light will consume");
    storage.addDataElement("My heart with its cruel");

    // Try to add out of range, at element 3. We expect a system exit.
    exit.expectSystemExit();
    storage.addDataElement("Ray, stealing my key to true calm.", 3);
  }

  @Test
  // Constructor created with zero arguments
  // addDataElement with 2 arguments and illegal position
  public void testConstructor0Add2NegativeIndex() {
    ENSFStorage storage = new ENSFStorage();

    // Try to add out of range, at element -1. We expect a system exit.
    exit.expectSystemExitWithStatus(1);
    storage.addDataElement("But soft! What light through yonder window breaks?", -1);
  }

  @Test
  // Constructor created with zero arguments
  // readFile() called with zero arguments
  public void testConstructor0ReadFile0() {
    ENSFStorage storage = new ENSFStorage();

    // File to read is never specified. We expect a system exit.
    exit.expectSystemExitWithStatus(1);
    storage.readFile(); 
  }




/* 
*  Pre- and Post-test processes
*/

  @Before
  public void start() {
    removeAllData(DIR);
  }

  @After
  public void end() {
    removeAllData(DIR);
  }

/* 
*  Utility methods to perform common routines 
*/

  // Write data to file
  public void writeFile(String[] data) throws Exception {
    BufferedWriter file = null;
    File directory = new File(DIR);

    // Create directory if it doesn't exist 
    if (!directory.exists()) {
      directory.mkdir();
    }
    
    String fn = addPath(FILE);
    file = new BufferedWriter(new FileWriter(fn));

    for (String txt : data) {
      file.write(txt, 0, txt.length());
      file.newLine();
    }
    file.close();
  }

  // Remove directory or file, after determining the absolute path
  public void removeAllData(String file) {
    // Get the directory the program was called from and append the provided file/dir
    String absolute = System.getProperty("user.dir"); 
    File abs = new File(absolute);
    File path = new File(abs, file);
    removeAllData(path);
  }

  // Remove directory or file, given File obj with absolute path
  public void removeAllData(File path) {
    // If there are files in the directory, we have to delete them first
    if (path.isDirectory()) {
      // Get all files in the directory
      File[] files = path.listFiles();

      // Recursively delete all files/subdirs
      if (files != null) {
        for(File f : files) {
          removeAllData(f);
        } 
      } 
    }
    
    // Plain file or empty directory
    path.delete();
  }

  // Add a directory path to a file
  public String addPath(String file) {
    File path = new File(DIR);
    File full = new File(path, file);
    return full.getPath();
  }
  
  // Read in a specified file, given path+filename
  public String[] readFile(String fileAndPath) throws Exception {
    BufferedReader file = new BufferedReader(new FileReader(fileAndPath));
    String tmp = new String();
    ArrayList<String> contents = new ArrayList<String>();

    while ((tmp = file.readLine()) != null) {
      contents.add(tmp);
    }

    file.close();
    return contents.toArray(new String[contents.size()]);
  }

  public String[] writeTestData() throws Exception {
    // Create some data and write it to the file
    String[] cRossetti = {
      "Apples and quinces,",
      "Lemons and oranges,",
      "Plump unpeck’d cherries,",
      "Melons and raspberries,",
      "Bloom-down-cheek’d peaches,",
      "Swart-headed mulberries,"
    }; 
    writeFile(cRossetti);
    return cRossetti;
 }

}






还有一个jar文件,用于test文件中,链接在这里

https://pan.baidu.com/s/1JVM3iyl3run16QD1AWMMyA  密码: l91r

十分感谢!可能真的是很简单的问题但是我现在有点陷入怪圈,被困住了,可能是因为有点着急。后天就要考试了所以如果研究明白对考试帮助很大

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • ProfSnail 2021-03-24 22:00
    已采纳

    这个代码好长……要不你私信跟我交流一波?

    已采纳该答案
    1 打赏 评论
  • TheWaSaiBoy 2021-03-25 11:41

    工具类: 

    import java.io.*;
    import java.util.*;
    
    public class ENSFStorage {
      private static final String DIR = "c://data";
      private static final String PREFIX = "Error: ";
      private String fileName;
      private LinkedList<String> dataElements = new LinkedList<>();
    
      public ENSFStorage(String fileName) {
        this.fileName = fileName;
      }
    
      public ENSFStorage() {
      }
    
      // One argument constructor
      public void ENSFStorage(String fileName) {
        this.fileName = fileName;
      }
    
      public LinkedList<String> getDataElements() {
        return dataElements;
      }
    
      // Return the fileName, which is a relative path
      public String getFileName() {
          return this.fileName;
      }
      
    
      // Set the fileName
      public void setFileName(String fileName) {
        this.fileName = fileName;
      }
    
    
      // Add a data element to the end of the list
      public void addDataElement(String dataElement, boolean f) {
        if (f) {
          this.dataElements.add(dataElement);
        }else{
          boolean flag = false;
          for (String element : this.dataElements) {
            if (dataElement.length() > element.length()) {
              flag = false;
            }else {
              flag = true;
            }
          }
          if (flag) {
            this.dataElements.add(dataElement);
          }else
            System.exit(1);
        }
      }
    
    
      // Given an element and an index, add the element to the list at that index, if it is in bounds.
      // If the file exists, keep it up-to-date
      public void addDataElement(String dataElement, int position) {
        if (position >= 0 && this.dataElements.size() > position){
          this.dataElements.remove(position);
          this.dataElements.add(position, dataElement);
        } else
          System.exit(1);
      }
    
      // Read in the specified file by name.
      public void readFile(String fileName) {
        this.setFileName(fileName);
        this.readfile();
      }
    
      public void readFile() {
        this.readfile();
      }
    
    
      // Read in the file stored as member data.
      public void readfile() {
        BufferedReader file = null;
    
        // No filename was set
        if (this.fileName == null) {
          System.err.printf(PREFIX + "FileName must be specified with setter or method call.%n");
          System.exit(1);
        }
    
        // Empty out the current list, remove any concept of largest size
        dataElements.clear(); 
        
        // Read in the file
        try {
          file = new BufferedReader(new FileReader(DIR + "\\" + this.fileName));
          String tmp = new String();
          while ((tmp = file.readLine()) != null) {
             this.addDataElement(tmp,true);
          }
        } 
    
        catch (Exception e) {
          System.err.println(PREFIX + "I/O error opening/reading file.");
          System.err.println(e.getMessage());
          closeReader(file);
          System.exit(1);
        }
        
        closeReader(file);
    
      }
    
    
      // Delete file or directory
      public void cleanUp() {
    //    String absolute = System.getProperty("user.dir");
    //    File abs = new File(absolute);
        File path = new File(DIR, this.fileName);
        cleanUp(path);
      }
    
      // Write out the file
      public void writeFile() {
        File directory = new File(DIR);
        BufferedWriter file = null;
    
        // FileName must have been specified
        if (this.fileName == null) {
          System.err.printf(PREFIX + "FileName must be specified with setter or method call.%n");
          System.exit(1);
        }
     
        // Create directory if it doesn't exist; if it does exist, make sure it is a directory
        try {
          if (! directory.exists()) {
            directory.mkdir();
          } else {
            if (! directory.isDirectory()) {
              System.err.printf(PREFIX + "file %s exists but is not a directory.%n", DIR);
              System.exit(1);
            }
          }
          cleanUp(); // Delete any existing file
        }
    
        catch(Exception e) {
          System.err.printf(PREFIX + "unable to create directory %s.%n", DIR);
          System.err.println(e.getMessage());
          System.exit(1);
        }
    
        try {
          file = new BufferedWriter(new FileWriter(this.fileName));
    
          // For each element, convert to char array and write char array
          // Ensure array is padded to set length
          Iterator<String> it = this.dataElements.iterator();
          while(it.hasNext()) {
            String tmp = new String(it.next());
            file.write(tmp, 0, tmp.length());
            file.newLine();
          }
        }
    
        catch (Exception e) {
          System.err.println(PREFIX + "I/O error opening/writing file.");
          System.err.println(e.getMessage());
          closeWriter(file);
          System.exit(1);
        }
        
        closeWriter(file);
      }
    
     
      // writeFile while specifying fileName at same time
      public void writeFile(String fileName) {
        this.setFileName(fileName);
        this.writeFile();
      }
    
    
    
    /* Private methods */
    
    
      private void closeWriter(BufferedWriter file) {
          try {
            if (file != null) {
              file.close();
            }
          }
    
          catch (Exception e) {
            System.err.println(PREFIX + "I/O error closing file.");
            System.err.println(e.getMessage());
            System.exit(1);
          }
      }
    
    
      private void closeReader(BufferedReader file) {
          try {
            if (file != null) {
              file.close();
            }
          }
    
          catch (Exception e) {
            System.err.println(PREFIX + "I/O error closing file.");
            System.err.println(e.getMessage());
            System.exit(1);
          }
      }
    
      // Give us the full relative path to the filename, OS independently
      private String getRelativePath(String filename) {
        File path = new File(DIR);
        File full = new File(path, filename);
        return full.getPath();
      }
    
      // If the file has been written, a new element cannot be more chars
      // than the largest existing element
      private boolean checkSize(String arg) {
         if (arg.length() > this.getBiggestSize().length()) {
           return false;
         }
         return true; 
      }
    
    
      // Get the biggest element we have
      private String getBiggestSize() {
         String big = new String();
         Iterator<String> it = this.dataElements.iterator();
         while(it.hasNext()) {
           String maybe = it.next();
           int tmp = maybe.length();
           if (tmp > big.length()) {
             big = maybe;
           }
         }
         return big;
      }
    
      public String[] asStringArray() {
        return this.dataElements.toArray(new String[this.dataElements.size()]);
      }
    
      // Delete file or directory
      private void cleanUp(File theFile) {
        try {
          /*if (theFile.isDirectory()) {
            // Get all files in the directory
            File[] files = theFile.listFiles();
    
            // Recursively delete all files/subdirs
            if (files != null) {
              for(File f : files) {
                cleanUp(f);
              }
            }
          }*/
          // Plain file or empty directory
          theFile.delete();
    
        }
    
        catch (Exception e) {
          System.err.printf(PREFIX + "unable to remove file %s.%n", this.fileName);
          System.err.println(e.getMessage());
          System.exit(1);
        }
      }
    
    }

    测试部分:

    import static org.junit.Assert.*;
    import org.junit.*;
    import java.io.*;
    import java.util.*;
    import org.junit.contrib.java.lang.system.ExpectedSystemExit;
    
    public class ENSFStorageTest {
      public final static String DIR = "c://data";
      public final static String FILE = "out.dat";
    
      @Test
      // Constructor created with zero arguments
      // addDataElement() with one argument
      // Use getDataElements() to retrieve values
      public void testConstructor0Add1GetDataElements() {
        ENSFStorage storage = new ENSFStorage();
    
        // Create an array and add the lines
        String[] eDickinson = {
          "Because I could not stop for Death –",
          "He kindly stopped for me –",
          "The Carriage held but just Ourselves –",
          "And Immortality."
        };
        for (String val:eDickinson) { 
          storage.addDataElement(val, true);
        }
    
        // Retrieve list, convert to array, see if it matches
        LinkedList<String> data = storage.getDataElements();
        String[] dataArray = data.toArray(new String[data.size()]);
        assertTrue("Adding data elements and retrieving complete list with getDataElements failed", Arrays.equals(eDickinson, dataArray));
      }
    
      @Test
      // Constructor created with zero arguments
      // addDataElement() with one argument
      // Use asSringArray() to retrieve values
      public void testConstructor0Add1AsStringArray() {
        ENSFStorage storage = new ENSFStorage();
    
        // Create an array and add the lines
        String[] rFrost = {
          "The only other sound's the sweep",
          "Of easy wind and downy flake.",
          "The woods are lovely, dark and deep,"
        };
        for (String val:rFrost) {
          storage.addDataElement(val, true);
        }
        
        // Retrieve data as an array, see if it matches
        String[] dataArray = storage.asStringArray();
        assertTrue("Adding data elements and retrieving complete list with asStringArray failed", Arrays.equals(rFrost, dataArray));
      }
    
      @Test
      // Constructor created with zero arguments
      // addDataElement() with two arguments
      // Use getDataElements() to retrieve values
      public void testConstructor0Add2GetDataElements() {
        ENSFStorage storage = new ENSFStorage();
     
        // Create a list of Strings, then make an array of what is expected
        String line1 = "Whan that Aprill with his shoures soote";
        String line2 = "The droghte of March hath perced to the roote,";
        String line3 = "And bathed every veyne in swich licour";
        String line1alt = "When April with its sweet-smelling showers";
        String line2alt = "Has pierced the drought of March to the root,";
        String[] expected = { line1alt, line2alt, line3 };
    
        // Add three lines sequentially, then overwrite two of them
    
        storage.addDataElement(line1, true);
        storage.addDataElement(line2, true);
        storage.addDataElement(line3, true);
        storage.addDataElement(line1alt, 0);
        storage.addDataElement(line2alt, 1);
    
        
        // Retrieve list, convert to array, see if it matches
        LinkedList<String> data = storage.getDataElements();
        String[] dataArray = data.toArray(new String[data.size()]);
        for (String s : dataArray) {
          System.out.println(s);
        }
        assertTrue("Adding data elements and retrieving complete list with getDataElements failed", Arrays.equals(expected, dataArray));
      }
    
      @Test
      // Constructor created with one argument
      // Check if fileName is set (including data dir) using getFileName()
      public void testConstructor1getFileName() {
        String fn = "thefilename";
        String expected = addPath(fn);
        ENSFStorage storage = new ENSFStorage(expected);
    
        String got = storage.getFileName();
        assertEquals("FileName wasn't correctly stored", expected, got);
      }
    
      @Test
      // Constructor created with one argument
      // Use setFileName, which should replace the stored value
      public void testConstructor1SetFileName1GetFileName() {
        String origfn = "thefilename";
        String newfn = "differentfile";
        String expected = addPath(newfn);
        ENSFStorage storage = new ENSFStorage(origfn); 
    
        // Replace fileName, see if it was replaced
        storage.setFileName(expected);
        String got = storage.getFileName();
        assertEquals("setFileName() didn't replace stored FileName", expected, got);
      }
    
      @Test
      // Constructor created with zero arguments
      // writeFile() with 1 argument 
      // File does not already exist
      public void testConstructor0writeFile1File0() throws Exception {
        ENSFStorage storage = new ENSFStorage(); 
    
        // Add some lines of data
        String[] wOwen = {
          "In all my dreams before my helpless sight",
          "He plunges at me, guttering, choking, drowning."
        };
        for (String val:wOwen) { // Add some lines of data
          storage.addDataElement(val, true);
        }
    
        // Write out to named file. The directory name should have been appended when
        // the filename was provided.
        storage.writeFile(addPath(FILE));
    
        // Read in the data file, ensure all lines match expectations
        String[] ret = readFile(addPath(FILE));
        boolean match = true;
        for (int i=0; i < ret.length; i++) {
          if (ret[i].equals(wOwen[i])==false) {
            match = false;
          }
        }
        assertTrue("Empty file incorrectly written (zero arg constructor)", match);
      }
    
      @Test
      public void test() throws IOException {
        File file = new File(DIR);
        System.out.println(file.exists());
        // System.out.println(new File("data/out.dat").exists());
      }
      @Test
      // cleanUp() method removes the data file and directory
      public void testCleanUp() throws Exception {
        String[] original = writeTestData();
    
        // Create the constructor, delete the file
        ENSFStorage storage = new ENSFStorage(FILE);
        storage.cleanUp();
    
    
        // Determine if file exists - it should not
        File fn = new File(addPath(FILE));
        assertFalse("File stored as fileName was not deleted", fn.exists());
      }
    
      @Test
      // Check method readFile() with 0 arguments, fileName already specified
      public void testReadFile0() throws Exception {
        String[] original = writeTestData();
    
        ENSFStorage storage = new ENSFStorage(FILE);
        storage.readFile();
        String[] check = storage.asStringArray();
        assertTrue("Reading in the file with no arguments failed", Arrays.equals(original, check));
      }
    
      @Test
      // Check method readFile() with 1 argument
      public void testReadFile1() throws Exception {
        String[] original = writeTestData();
    
        ENSFStorage storage = new ENSFStorage();
        storage.readFile(FILE);
        String[] check = storage.asStringArray();
        assertTrue("readFile() with one argument failed", Arrays.equals(original, check));
      }
    
      @Test
      // Read in file, modify file. File should be automatically written
      public void testModifyFile() throws Exception {
        String[] original = writeTestData();
    
        ENSFStorage storage = new ENSFStorage();
        storage.readFile(FILE);
    
        // Data we will be inserting
        String[] tmp = {
          "Rare pears and greengages,",
          "Wild free-born cranberries,"
        };
    
        // Create a new array of the data we expect to get
        // We are adding one element at the end, and overwriting the first element
        String[] expected = new String[original.length + 2];
        for (int i=0; i < original.length; i++) {
          expected[i] = original[i];
        }
        expected[original.length] = tmp[0];
        expected[original.length + 1] = tmp[1];
    
        // Overwrite the elements. This should automatically write them to the file.
        storage.addDataElement(tmp[0], true);
        storage.addDataElement(tmp[1], true);
    
        // hxb
        storage.writeFile(addPath(FILE));
    
        // Check if the data in the file matches our expectations
        String[] check = readFile(addPath(FILE));
        assertTrue("addDataElement() automatically writes when data is changed on existing file", Arrays.equals(expected, check));
      }
    
    
    
    /* Tests involving expected System.exit() 
    *  ExpectedSystemExit is provided by org.junit.contrib.java.lang.system.ExpectedSystemExit
    *  which can be downloaded as a .jar from https://stefanbirkner.github.io/system-rules/
    *  or found in the provided lib directory.
    *  Store together with the hamcrest and junit jar files, and include as part of javac/java calls:
    *  .:lib/junit-4.13.2.jar:lib/hamcrest-core-1.3.jar:lib/system-rules-1.19.0.jar (Mac & Linux)
    *  .;lib/junit-4.13.2.jar;lib/hamcrest-core-1.3.jar;lib/system-rules-1.19.0.jar (Windows)
    */
    
      @Rule
      // Handle System.exit() status
      public final ExpectedSystemExit exit = ExpectedSystemExit.none();
    
      @Test
      // If file already exists, we cannot add a line longer than the longest existing line
      public void testEnforcedLongestLine() throws Exception {
        String[] original = writeTestData();
        
        ENSFStorage storage = new ENSFStorage();
        storage.readFile(FILE);
        // Try to add a really long line
        exit.expectSystemExitWithStatus(1);
        storage.addDataElement("A really long line which far exceeds the number of characters in the existing longest line", false);
      }
    
      @Test
      // Constructor created with zero arguments
      // addDataElement with 2 arguments and illegal position
      // Should give System.err message and exit(1)
      public void testConstructor0Add2TooHighIndex() {
        ENSFStorage storage = new ENSFStorage();
        exit.expectSystemExitWithStatus(1);
    
        // Add data to fill elements 0 and 1
        storage.addDataElement("Maybe January light will consume", true);
        storage.addDataElement("My heart with its cruel", true);
    
        // Try to add out of range, at element 3. We expect a system exit.
        exit.expectSystemExit();
        storage.addDataElement("Ray, stealing my key to true calm.", 3);
    
      }
    
      @Test
      // Constructor created with zero arguments
      // addDataElement with 2 arguments and illegal position
      public void testConstructor0Add2NegativeIndex() {
        ENSFStorage storage = new ENSFStorage();
    
        // Try to add out of range, at element -1. We expect a system exit.
        exit.expectSystemExitWithStatus(1);
        storage.addDataElement("But soft! What light through yonder window breaks?", -1);
      }
    
      @Test
      // Constructor created with zero arguments
      // readFile() called with zero arguments
      public void testConstructor0ReadFile0() {
        ENSFStorage storage = new ENSFStorage();
    
        // File to read is never specified. We expect a system exit.
        exit.expectSystemExitWithStatus(1);
        storage.readFile(); 
      }
    
    
    
    
    /* 
    *  Pre- and Post-test processes
    */
    
      @Before
      public void start() {
        removeAllData(DIR);
      }
    
      @After
      public void end() {
        removeAllData(DIR);
      }
    
    /* 
    *  Utility methods to perform common routines 
    */
    
      // Write data to file
      public void writeFile(String[] data) throws Exception {
        BufferedWriter file = null;
        File directory = new File(DIR);
        // Create directory if it doesn't exist 
        if (!directory.exists()) {
          directory.mkdir();
        }
        
        String fn = addPath(FILE);
        file = new BufferedWriter(new FileWriter(fn));
    
        for (String txt : data) {
          file.write(txt, 0, txt.length());
          file.newLine();
        }
        file.close();
      }
    
      // Remove directory or file, after determining the absolute path
      public void removeAllData(String file) {
        // Get the directory the program was called from and append the provided file/dir
        String absolute = System.getProperty("user.dir"); 
        File abs = new File(absolute);
        File path = new File(abs, file);
        removeAllData(path);
      }
    
      // Remove directory or file, given File obj with absolute path
      public void removeAllData(File path) {
        // If there are files in the directory, we have to delete them first
        if (path.isDirectory()) {
          // Get all files in the directory
          File[] files = path.listFiles();
    
          // Recursively delete all files/subdirs
          if (files != null) {
            for(File f : files) {
              removeAllData(f);
            } 
          } 
        }
        
        // Plain file or empty directory
        path.delete();
      }
    
      // Add a directory path to a file
      public String addPath(String file) {
        File path = new File(DIR);
        File full = new File(path, file);
        return full.getPath();
      }
      
      // Read in a specified file, given path+filename
      public String[] readFile(String fileAndPath) throws Exception {
        BufferedReader file = new BufferedReader(new FileReader(fileAndPath));
        String tmp = new String();
        ArrayList<String> contents = new ArrayList<String>();
    
        while ((tmp = file.readLine()) != null) {
          contents.add(tmp);
        }
    
        file.close();
        return contents.toArray(new String[contents.size()]);
      }
    
      public String[] writeTestData() throws Exception {
        // Create some data and write it to the file
        String[] cRossetti = {
          "Apples and quinces,",
          "Lemons and oranges,",
          "Plump unpeck’d cherries,",
          "Melons and raspberries,",
          "Bloom-down-cheek’d peaches,",
          "Swart-headed mulberries,"
        }; 
        writeFile(cRossetti);
        return cRossetti;
     }
    
    }
    1 打赏 评论
  • LAREINA.JO 2021-03-24 21:50

    这是我自己到目前为止写出来的。写的乱糟糟的,现在整个人都晕

    import java.io.*;
    import java.util.*;
    
    
    public class ENSFStorage {
      private String fileName;
      private LinkedList<String> dataElements;
    
    
      private static final String DIR = "data";
      private static final String PREFIX = "Error: ";
    
      // One argument constructor
      public ENSFStorage(String fileName) {
    	  this.fileName = fileName;
      }
      
      public ENSFStorage() {
    	  fileName=new String();
    	  dataElements=new LinkedList<>();
    	}
    
    
      public LinkedList<String> getDataElements() {
        return dataElements;
      }
    
      // Return the fileName, which is a relative path
      public String getFileName() {
          return this.fileName;
      }
      
    
      // Set the fileName
      public void setFileName(String fileName) {
        this.fileName = fileName;
      }
    
      public boolean fileExist() {
    	  File file = new File(getRelativePath(fileName));
    	  if(file.exists()){
    		  return true;
    	  }
    	  return false;
      }
      
      
      public String[] asStringArray() {
    	  if(dataElements.size()==0) {
    		  return null;
    	  }
    	  String[] stringarray=new String[dataElements.size()];
    	  for(int i=0;i<stringarray.length;i++) {
    			stringarray[i]=dataElements.get(i);
    	  }
    	  return stringarray;
    	}
      
    
      // Add a data element to the end of the list
      public void addDataElement(String dataElement) {
    	  if(checkSize(dataElement)) {
    		  dataElements.add(dataElement);
    	  }
    	  else {
    		  dataElement.substring(0,getBiggestSize().length()-1);
    		  dataElements.add(dataElement);
    	  }
    		  
      }
    
    
      // Given an element and an index, add the element to the list at that index, if it is in bounds.
      // If the file exists, keep it up-to-date
      public void addDataElement(String dataElement, int position) {
    	  if(!fileExist()) {
    		  if(checkSize(dataElement)) {
    			  dataElements.add(position,dataElement);
    		  }
    		  else {
    			  dataElement.substring(0,getBiggestSize().length()-1);
    			  dataElements.add(position,dataElement);
    		  }
    	  }
    	  else {
    		  dataElements.set(position, dataElement);
    	  }
    	  writeFile();
      }
    
      // Read in the specified file by name.
      public String[] readFile(String fileName) throws IOException {
        File myPath=new File(DIR);
        if (!myPath.exists()){
        	myPath.mkdirs();
        }
        File fileread = new File(DIR,fileName);
        if(!fileread.exists()) {
      	  fileread.createNewFile();
        }
      	  
        this.setFileName(fileName);
        this.readfile();
        String[] file=asStringArray();
        return file;
      }
    
      public String[] readFile(){
    	  String[] fileread = null;
    	  try {
    		File myPath=new File(DIR);
    	    if (!myPath.exists()){
    	    	myPath.mkdirs();
    	    }
    	    File file = new File(DIR,fileName);
    	    if(!file.exists()) {
    	  	  file.createNewFile();
    	    }
    	    FileReader filereader=new FileReader(file);
    		BufferedReader reader=new BufferedReader(filereader);
    	
    		String line = reader.readLine();
    		while (line!= null) {
    			dataElements.add(line);
    		}
    		fileread=asStringArray();
    		reader.close();
    	  }catch (IOException e) {
    			e.printStackTrace();
    		}
    	  return fileread;
      }
      
      
      // Read in the file stored as member data.
      public void readfile() {
        BufferedReader file = null;
        // No filename was set
        if (null==fileName) {
          System.err.printf(PREFIX + "FileName must be specified with setter or method call.%n");
          System.exit(1);
        }
        else {
        // Empty out the current list, remove any concept of largest size
        dataElements.clear(); 
        
        // Read in the file
        try {
        	File myPath=new File(DIR);
    	    if (!myPath.exists()){
    	    	myPath.mkdirs();
    	    }
    	    File fileread = new File(DIR,fileName);
    	    if(!fileread.exists()) {
    	  	  fileread.createNewFile();
    	    }
    	    FileReader filereader=new FileReader(fileread);
    		file=new BufferedReader(filereader);
          
          String tmp = new String();
          while ((tmp = file.readLine()) != null) {
             this.addDataElement(tmp);
          }
        } 
    
        catch (Exception e) {
          System.err.println(PREFIX + "I/O error opening/reading file.");
          System.err.println(e.getMessage());
          closeReader(file);
          System.exit(1);
        }
        
        closeReader(file);
        }
    
      }
    
    
      // Delete file or directory
      public void cleanUp() {
        String absolute = System.getProperty("user.dir");
        File abs = new File(absolute);
        File path = new File(abs, this.fileName);
        cleanUp(path);
      }
    
      // Write out the file
      public void writeFile() {
        File directory = new File(DIR);
        BufferedWriter file = null;
    
        // FileName must have been specified
        if (this.fileName == null) {
          System.err.printf(PREFIX +"FileName must be specified with setter or method call.%n");
          System.exit(1);
        }
     
        // Create directory if it doesn't exist; if it does exist, make sure it is a directory
        try {
          if (! directory.exists()) {
            directory.mkdir();
          } else {
            if (! directory.isDirectory()) {
              System.err.printf(PREFIX + "file %s exists but is not a directory.%n", DIR);
              System.exit(1);
            }
          }
          cleanUp(); // Delete any existing file
        }
    
        catch(Exception e) {
          System.err.printf(PREFIX + "unable to create directory %s.%n", DIR);
          System.err.println(e.getMessage());
          System.exit(1);
        }
    
        try {
          file = new BufferedWriter(new FileWriter(this.fileName));
    
          // For each element, convert to char array and write char array
          // Ensure array is padded to set length
          Iterator<String> it = this.dataElements.iterator();
          while(it.hasNext()) {
            String tmp = new String(it.next());
            file.write(tmp, 0, tmp.length());
            file.newLine();
          }
        }
    
        catch (Exception e) {
          System.err.println(PREFIX + "I/O error opening/writing file.");
          System.err.println(e.getMessage());
          closeWriter(file);
          System.exit(1);
        }
        
        closeWriter(file);
      }
    
     
      // writeFile while specifying fileName at same time
      public void writeFile(String fileName) {
        this.setFileName(fileName);
        this.writeFile();
      }
    
    
    
    /* Private methods */
    
    
      private void closeWriter(BufferedWriter file) {
          try {
            if (file != null) {
              file.close();
            }
          }
    
          catch (Exception e) {
            System.err.println(PREFIX + "I/O error closing file.");
            System.err.println(e.getMessage());
            System.exit(1);
          }
      }
    
    
      private void closeReader(BufferedReader file) {
          try {
            if (file != null) {
              file.close();
            }
          }
    
          catch (Exception e) {
            System.err.println(PREFIX + "I/O error closing file.");
            System.err.println(e.getMessage());
            System.exit(1);
          }
      }
    
      // Give us the full relative path to the filename, OS independently
      private String getRelativePath(String filename) {
        File path = new File(DIR);
        File full = new File(path, filename);
        return full.getPath();
      }
    
      
      // If the file has been written, a new element cannot be more chars
      // than the largest existing element
      private boolean checkSize(String arg) {
    	 if(this.getBiggestSize().equals(null)) {
    		 return true;
    	 }
    	 else if (arg.length() > this.getBiggestSize().length()) {
           return false;
         }
    	 else
    		 return true; 
      }
    
    
      // Get the biggest element we have
      private String getBiggestSize() {
    	 if(dataElements.equals(null))
    		  return null;
    	 else {
         var big = new String();
         Iterator<String> it = this.dataElements.iterator();
         while(it.hasNext()) {
           String maybe = it.next();
           int tmp = maybe.length();
           if (tmp > big.length()) {
             big = maybe;
           }
         }
         return big;
    	 }
      }
    
    
      // Delete file or directory
      private void cleanUp(File theFile) {
        try {
          if (theFile.isDirectory()) {
            // Get all files in the directory
            String[] files = theFile.list();
          
            // Recursively delete all files/subdirs
            if (files != null) {
              for(int i=0;i<files.length;i++) {
                cleanUp(new File(theFile,files[i]));
              }
            }
          }
        
          // Plain file or empty directory
          theFile.delete();
        }
    
        catch (Exception e) {
          System.err.printf(PREFIX + "unable to remove file %s.%n", this.fileName);
          System.err.println(e.getMessage());
          System.exit(1);
        }
      }
      
      public static void main(String[] arg) {
    	  ENSFStorage storage=new ENSFStorage();
    	  LinkedList<String> list=new LinkedList<>();
    	  System.out.println(storage.DIR);
      }
    
    
    }
    打赏 评论
  • 小亮点科技 2021-03-24 21:59

    如果需要帮助可以加一下我的QQ,我的资料里面有我帮你调出来。我这里没有看到JUnit4的文件。

    打赏 评论

相关推荐 更多相似问题