Java - 反向读取文本文件(段落)并保留格式

时间:2013-09-22 14:21:37

标签: java

我试图使用FileInputStream读取文本文件,并希望反向显示所有单词(所以最后一个单词将是第一个单词等)我能够使用字符串标记器反向显示所有字母,但不是单词..我现在尝试了几种不同的方法,似乎无法做到这一点

使用ArrayList我可以反转这些行(首先打印最后一行,最后一行打印)..但我找不到一种方法来反转所有单词

这是我的“test.txt”文件中的内容:

  

Java的一个特征是可移植性,这意味着用Java语言编写的计算机程序必须以类似的方式运行   任何   硬件/操作系统平台。这是通过将Java语言代码编译为名为Java的中间表示来实现的   字节码,而不是直接到平台特定的机器代码。 Java字节码指令类似于机器代码,但它们是   意图解释   通过专门为主机硬件编写的虚拟机(VM)。最终用户通常使用Java运行时环境(JRE)   安装在他们自己的机器上用于独立的Java应用程序,或安装在用于Java小程序的Web浏览器中。

代码:

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


public class RevWords6
{
    public static void main(String[] args) throws IOException
    {   
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt"), "UTF-8"));                

        String lines = br.readLine();
        ArrayList<String> buffer = new ArrayList<String>();

        //while the data is not null
        while(lines != null)
        {   
            //String words[] = lines.split(" ");

            //track formatting
            if(lines != null)
            {   
                buffer.add("\n");
                buffer.add(lines);  //I wanted to put the words array in here instead of "lines" but didn't know how
            }

            lines=br.readLine();
        }

        //reads lines backwards from ArrayList buffer but wanted to read words from end-to-beginning
        for(int i = buffer.size()-1; i>=0; i--)
        {
            System.out.print(buffer.get(i));
        }

        br.close();
    }
}

输出:

  

安装在自己的机器上,用于独立的Java应用程序,或者安装在   Java applet的Web浏览器。由虚拟机(VM)编写   专门用于主机硬件。最终用户通常使用Java   运行时环境(JRE)字节码,而不是直接到   特定于平台的机器代码。 Java字节码指令是   类似于机器代码,但它们旨在被解释   硬件/操作系统平台。这是通过编译来实现的   Java语言代码,称为Java One的中间表示   Java的特点是可移植性,这意味着计算机   用Java语言编写的程序必须在任何

上运行

正如你所看到的那样是从下到上开始印刷线条,但我想要从下到上开始的文字

在这里我尝试使用带有字符串数组的StringBuffer将行分隔一个空格,但在这种情况下我只能反转每一行而不是反转整个段落

代码:

import java.io.*;  


public class RevWords4
{   

    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\Conor\\Documents\\test.txt"), "UTF-8"));               
        StringBuffer buffer = new StringBuffer();   

        String line = br.readLine();
        String[] word = line.split(" ");

        while(line != null)
        {           
            if(line != null)
            {   
                word = line.split(" ");

                for(int i = word.length-1; i>=0; i--)
                {
                    StringBuilder sb = new StringBuilder(word[i] + " ");        
                    buffer.append(sb);          
                }

                buffer.append("\n");
            }

            line=br.readLine();
        }


        System.out.print(buffer);
        br.close();
    }
}

输出:

  

任何类似的运行必须语言Java编写的程序   计算机意味着哪种便携性,是特色的Java   Java称为表示中间的一种代码语言Java   通过实现编译就是这个平台。硬件/操作系统   解释是他们想要的但是代码,机器类似的   指令字节码Java代码。机器平台特定于直接   而字节码,(JRE)环境运行时Java一般使用   最终用户硬件。托管专门编写的(VM)机器   通过applet虚拟a。用于浏览器Web的Java或应用程序,Java   独立的机器拥有他们的已安装

所以我很乐意接受任何关于此的建议和提示,谢谢

1 个答案:

答案 0 :(得分:1)

稍微修改while循环对我来说很有用:

StringBuilder str = new StringBuilder();
String[] splitStr = lines.split(" ");
for (int i = splitStr.length; i > 0; i--) {
    str.append(splitStr[i - 1]).append(" ");
}

buffer.add(str.toString());  //I wanted to put the words array in here instead of "lines" but didn't know how

因此,您的完整代码如下所示:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;


public class RevWords6
{
    public static void main(String[] args) throws IOException
    {   
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt"), "UTF-8"));                

        String lines = br.readLine();
        ArrayList<String> buffer = new ArrayList<String>();

        //while the data is not null
        while(lines != null)
        {   
            //String words[] = lines.split(" ");

            //track formatting
            if(lines != null)
            {   
                buffer.add("\n");

                StringBuilder str = new StringBuilder();
                String[] splitStr = lines.split(" ");
                for (int i = splitStr.length; i > 0; i--) {
                    str.append(splitStr[i - 1]).append(" ");
                }

                buffer.add(str.toString());  //I wanted to put the words array in here instead of "lines" but didn't know how
            }

            lines=br.readLine();
        }

        //reads lines backwards from ArrayList buffer but wanted to read words from end-to-beginning
        for(int i = buffer.size()-1; i>=0; i--)
        {
            System.out.print(buffer.get(i));
        }

        br.close();
    }
}

<强>更新 使用自定义读取器读取反转的行可能是一种更好的方法:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;

public class ReversedLineBufferedReader extends BufferedReader {

    public ReversedLineBufferedReader(Reader in) {
        super(in);
    }

    @Override
    public String readLine() throws IOException {
        String line = super.readLine();

        if (line == null) {
            return null;
        }

        StringBuilder reversedLine = new StringBuilder();
        if (line.length() > 0) {
            String[] splitString = line.split("\\b");
            for (int i = splitString.length; i > 0; i--) {
                reversedLine.append(splitString[i - 1]).append(" ");
            }
        }
        return reversedLine.toString();
    }
}