2013-09-22 80 views
0

我正在嘗試使用FileInputStream讀取文本文件,並且想要反向顯示所有單詞(因此最後一個單詞將成爲第一個單詞等)。 )我能夠使用字符串標記器反向顯示所有字母,但不是單詞..我現在嘗試了幾種不同的方法,但似乎無法做到這一點Java - 反向讀取文本文件(段落)並保持格式化

使用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應用程序,或者在 Web瀏覽器的Java小程序。由專門爲主機硬件編寫的虛擬機(VM) 。最終用戶通常使用運行時環境(JRE)字節碼,而不是直接使用 平臺特定的機器碼。 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代碼。特定於機器平臺的直接 代替字節碼,(JRE)環境運行時Java一般使用 最終用戶硬件。通過小應用程序虛擬一個虛擬機來託管專門寫入(虛擬機)機器 。 Java進行Web瀏覽器的一個或應用程序,Java 獨立的機器擁有其上安裝

所以我很願意接受這個任何建議和提示,謝謝

回答

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(); 
    } 
} 

UPDATE 有了這樣的讀取一行逆轉可能是一個更好的方法定製的讀者:

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(); 
    } 
} 
+2

斯普利特在字邊界會更容易:字符串[]字符串數組= s.split(」 \\ b「​​); – dragon66

+0

這很有趣,是的解決了我的問題。謝謝 – Conor

+0

也感謝提示dragon66 – Conor