我试图使用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 独立的机器拥有他们的已安装
所以我很乐意接受任何关于此的建议和提示,谢谢
答案 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();
}
}