我试图解决我在编程集中遇到的问题。
我们应该编写从文件中读取并打印出来的代码。我明白了,我能做到。
他希望我们做的是反过来打印出来。
该文件为:
abc
123
987
他想:
987
123
abc
代码原样如下:
{
FileReader n=new FileReader("F:\\Java\\Set 8\\output1.txt");
Scanner in=new Scanner(n);
int l;
while (in.hasNext())
{
l=in.nextInt();
System.out.println(l);
}
in.close();
}
}
是的,我正在使用java.io. *;和扫描仪。
最简单的方法是什么?
编辑编辑编辑
这是改进的代码,我尝试将其放入数组中。
数组中的数据不会打印出来。
public static void main(String[] args) throws IOException
{
int[]Num=new int[20];
Scanner in=new Scanner(new FileReader("F:\\Java\\Set 8\\output1.txt"));
int k;
for (k=0;k<20;k++)
{
Num[k]=in.nextInt();
}
//in.close();
for (k=20;k<20;k--)
{
System.out.print(+Num[k]);
}
//in.close();
}
答案 0 :(得分:1)
最简单的方法是构造一个List,并在从文件中读取时将每一行添加到列表中。完成后,反向打印列表项。
以下是我的问题代码版本。
public static void main(String[] args) throws FileNotFoundException {
FileReader n = new FileReader("/Users/sharish/Data/abc.xml");
Scanner in = new Scanner(n);
ArrayList<String> lines = new ArrayList<String>();
while (in.hasNext()) {
lines.add(in.nextLine());
}
in.close();
for (int i = lines.size() - 1; i >= 0; i--) {
System.out.println(lines.get(i));
}
}
答案 1 :(得分:1)
如果允许使用第三方API,则Apache Commons IO包含一个类ReversedLinesFileReader
,该类读取类似于BufferedReader的文件(最后一行除外)。以下是API文档:http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/ReversedLinesFileReader.html
评论中暗示了另一种(效率较低)的解决方案。您可以将整个文件读入ArrayList,反转该列表(例如,将其内容推送到堆栈然后将其弹出),然后遍历反向列表进行打印。
修改强> 这是一个粗略的例子:
ArrayList<String> lines = new ArrayList<String>();
Scanner in = new Scanner(new FileReader("input.txt"));
while (in.hasNextLine())
{
lines.add(in.nextLine());
}
使用ArrayList
代替静态数组。我们不必事先知道文件的长度,所以静态数组在这里没有意义。 http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
您的示例输入123
,abc
等包含字符和整数,因此您对hasNextInt
和nextInt
的调用最终会抛出异常。要读取行,请改用hasNextLine
和nextLine
。这些方法返回String
,因此我们的ArrayList也需要存储String。 http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextLine()
一旦文件在列表中(如果文件很大就不是一个好的解决方案 - 我们已经将整个文件读入内存)我们可以反转列表(如果保持一个反转的形式有意义),或者只是向后迭代它。
for (int i=lines.size()-1; i>=0; i--) // from n-1 downTo 0
{
String line = lines.get(i);
System.out.println( line );
}
答案 2 :(得分:1)
使用Stack。
public static void displayReverse() throws FileNotFoundException {
FileReader n=new FileReader("C:\\Users\\User\\Documents\\file.txt");
Scanner in=new Scanner(n);
Stack<String> st = new Stack<String>();
while (in.hasNext()) {
st.push(in.nextLine());
}
in.close();
while(!st.isEmpty()) {
System.out.println(st.pop());
}
}
答案 3 :(得分:0)
尝试使用org.apache.commons.io.input.ReversedLinesFileReader,它应该做你想要的。
答案 4 :(得分:0)
你可以像你已经在做的那样读取线条,但不是打印它们(因为它会按顺序打印它们而你需要反过来),将它们添加到某些内存结构中,如List或Stack,然后,在第二个循环中,迭代此结构以按所需顺序打印行。
答案 5 :(得分:0)
使用您的代码和评论中的答案,这里是一个示例,说明如何将字符串存储到arraylist中,然后反向打印出来(构建自己的代码)
{
FileReader n=new FileReader("F:\\Java\\Set 8\\output1.txt");
Scanner in=new Scanner(n);
int l;
ArrayList<String> reversed = new ArrayList<String>(); // creating a new String arraylist
while (in.hasNext())
{
l=in.nextInt();
System.out.println(l);
reversed.add(l); // storing the strings into the reversed arraylist
}
in.close();
// for loop to print out the arraylist in reversed order
for (int i = reversed.size() - 1; i >= 0; i--) {
System.out.println(reversed.get(i));
}
}
}
答案 6 :(得分:0)
使用Java 8:
try(PrintWriter out =
new PrintWriter(Files.newBufferedWriter(Paths.get("out.txt")))) {
Files.lines(Paths.get("in.txt"))
.collect(Collectors.toCollection(LinkedList::new))
.descendingIterator()
.forEachRemaining(out::println);
}