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

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

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

工具类: 

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;
 }

}

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

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);
  }


}

 

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