0

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

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

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

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

代码:

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 应用程序,或安装在 Web 浏览器中用于 Java 小程序。由专门为主机硬件编写的虚拟机 (VM)。最终用户通常使用 Java 运行时环境 (JRE) 字节码,而不是直接使用特定于平台的机器码。Java 字节码指令类似于机器代码,但它们旨在被解释为硬件/操作系统平台。这是通过将 Java 语言代码编译为称为 Java 的中间表示来实现的。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) 机器虚拟机。Java 用于浏览器 Web 或应用程序,Java 独立用于机器自己安装

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

4

1 回答 1

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();
    }
}
于 2013-09-22T14:36:35.477 回答