如何反向读取文件?

How to reverse file read?

如何反转 .txt 文件的输出? 一个例子:

输入文件内容:

这是文件的开头。

第二行。

这是第三行。

第四行。

文件结束。

应读入并打印以下文件:

文件结束。

第四行。

这是第三行。

第二行。

这是文件的开头。

这是我目前拥有的代码:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileCopier {

     public static void copyCharacters() throws IOException {
            FileReader inputStream = null;
            FileWriter outputStream = null;

            try {
                inputStream = new FileReader("Motown.txt");
                outputStream = new FileWriter("Motown_output.txt");

                int c;
                while ((c = inputStream.read()) != -1) {
                    outputStream.write(c);
                }
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
            }
         }
    public static void main(String[] args) {
         // TODO Auto-generated method stub
        try {
            copyCharacters();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

你应该可以

  1. 逐行阅读您的输入
  2. 将每一行读入collection
  3. 逆转collection

在这里,我使用了 Deque 并获取它的 descendingIterator:

 public static void copyCharacters() throws IOException {
            FileWriter outputStream = null;
            BufferedReader bufferedReader = null;

            Deque<String> fileContents = new ArrayDeque<>();

            try {
                outputStream = new FileWriter("motown_output.txt");
                bufferedReader = new BufferedReader(new FileReader("motown.txt"));

                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    fileContents.add(line);
                }

                for (Iterator<String> iterator = fileContents.descendingIterator(); iterator.hasNext();) {
                    outputStream.write(iterator.next());
                    outputStream.write("\n");
                }

            } finally {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
            }
         }