2015-03-19 176 views
1

第一週學習Java。我的破碎的代碼在下面道歉。試圖打開一個文件讀取它並選擇需要的內容寫入另一個文件。我的文件是這樣的:如何打開並讀取文件並將特定內容寫入新文件?

DESCRIPTION: 
TITILE: 
TYPE: image 
SOURCE: Library 
FORMAT: jpeg 
IDENTIFIER: 120034 
LATITUDE: 40.109580 
LONGITUDE: -88.228378 

DESCRIPTION: 
TITLE: GSLIS 
SUBJECT: 
TYPE: image 
SOURCE: Library 
FORMAT: jpeg 
IDENTIFIER: 120155 
LATITUDE: 40.107779 
LONGITUDE:-88.231621 

我只是寫兩段代碼,一個用於打開和讀取,一個用於匹配模式:

package Functions; 

import java.io.IOException; 
import java.io.FileReader; 
import java.io.BufferedReader; 

public class readFileLocal { 
    private static final String[] String = null; 
    private String path; 

    public readFileLocal(String file_path){ 
     path = file_path; 
    } 

    public String[] openFile() throws IOException{ 
     FileReader freader = new FileReader (path); 
     BufferedReader textReader = new BufferedReader (freader); 

     int numberOfLines = readLines(); 
     String[] textData = new String[numberOfLines]; 

     int i; 
     for (i=0; i<numberOfLines; i++){ 

      String newLine=new String(); 
      newLine=null; 
      textData[i] = textReader.readLine(); 
      String a = textData.toString(); 
      while ((textData[i])!=null){ 
       if (a.startsWith("Identifier: ") || a.startsWith("Latitude: ")||a.startsWith("Longitude:")){ 
        newLine.append(a); 
       } 

       boolean filled1 =Boolean.valueOf(String newLine[0]); 
       boolean filled2 =Boolean.valueOf(String newLine[1]); 
       boolean filled3 =Boolean.valueOf(String newLine[2]); 

       if(filled1, filled2, filled3) { 
         System.out.println(newLine[0]+'|'+newLine[1]+"|"+newLine[2]+"\n"); 
       } 

       } 
     } 
    textReader.close();  
} 


    int readLines() throws IOException{ 
     FileReader file_to_read = new FileReader(path); 
     BufferedReader lines = new BufferedReader (file_to_read); 

     String aLine=lines.readLine(); 
     int numberOfLines = 0; 
     while(aLine != null) { 
      numberOfLines ++; 
     } 

     lines.close(); 
     return numberOfLines; 
    } 

}

我也想通了如何搜索字符串中我想與人的幫助的方式,如下圖所示:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class ReadLatLong 
{ 

    public ReadLatLong(){ 

     String line = "IDENTIFIER: 115956 LATITUDE: 40.104730 LONGITUDE: -88.228798 DATE RIGHTS IDENTIFIER: 115956 LATITUDE: 40.104730 LONGITUDE: -88.228798 DATE RIGHTS"; 
     String pattern = "IDENTIFIER:\\s(\\d*)\\sLATITUDE:\\s(\\d*\\.?\\d*)\\sLONGITUDE:\\s(.*?)\\s"; 

     Pattern r = Pattern.compile(pattern); 
     Matcher m = r.matcher(line); 

     while (m.find()) { 
      System.out.println("Image: " + m.group(1)+"|"+m.group(2)+"|"+m.group(3)); 
     } 
    } 
} 

現在我不知道如何搜索到è整個文件抓住所有標識符,緯度,經度,並把他們全部是這樣的: 120034 | 40.109580 | -88.228378 \n 120155 | 40.107779 | -88.231621 \n

這是我的主要方法,但我不知道如何把它寫在一個新的文件無論是。

package readText; 

import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 

public class FileData { 

    public static void main(String[] args) throws Exception { 

     String file_path1 = "F:\\CampusImages.txt"; 
     String file_path2 = "F:\\CampusImageIDs.txt"; 

     try{ 
      ReadFileLocal file = new ReadFileLocal(file_path1); 
      WriteFile writeout = new WriteFile(file_path2); //Don't know how to write it in new file. 
      PrintWriter writer = new PrintWriter(new FileWriter(new File(file_path2))); 
      String[] arylines = file.openFile(); 
      writeout.WriteToFile(String.valueOf(arylines)); 

      int i; 
      for (i=0; i<arylines.length; i++){ 
       System.out.println(arylines[i]); 
      } 
     writer.close(); 
     } 

     catch(IOException e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

在此先感謝。

回答

0

看起來這是你的編程作業,所以我不會給你確切的編碼。除非你的輸入文件是空的,否則你的readLines()方法將永遠循環。如果它不是必須的,那麼你不需要數數。在閱讀其中的每一行之前,請閱讀。這裏是你可以做的:

read one line from the file 
while the line is not null 
    check if the line begins with one of the three identifier you want 
    if so, append the line to a string 
    if not, do nothing 
    if the accumulated string has all three required line, use `ReadLatLong` to do an output 
    (simplest way is to use 3 bool flags) 
    read another line using the same variable name as at the beginning 
end while 

希望這會有所幫助。

編輯:好的,既然RoverMAX給了他的編碼,我給你另一個版本供你考慮。

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class TestCampusImages { 

    static final String file_path1 = "CampusImages.txt"; 
    static final String file_path2 = "CampusImageIDs.txt"; 
    static final Pattern pID = Pattern.compile("(?<=IDENTIFIER:)[\\d\\s]*"); 
    static final Pattern pLAT = Pattern.compile("(?<=LATITUDE:)[\\d\\s-.]*"); 
    static final Pattern pLONG = Pattern.compile("(?<=LONGITUDE:)[\\d\\s-.]*"); 

    public static void main(String[] args) { 
     int id = 0; 
     float latitude = 0.0f, longitude = 0.0f; 
     try { 
      File inFile = new File(file_path1); 
      BufferedReader textReader = new BufferedReader(new FileReader(inFile)); 
      File outFile = new File(file_path2); 
      PrintWriter out = new PrintWriter(outFile); 
      String inLine = textReader.readLine(); 
      while (inLine != null) { 
       Matcher m = pID.matcher(inLine); 
       if (m.find()) { 
        id = Integer.parseInt(m.group().trim()); 
       } 
       m = pLAT.matcher(inLine); 
       if (m.find()) { 
        latitude = Float.parseFloat(m.group().trim()); 
       } 
       m = pLONG.matcher(inLine); 
       if (m.find()) { 
        longitude = Float.parseFloat(m.group().trim()); 
       } 
       if ((id!=0) && (latitude!=0.0f) && (longitude!=0.0f)) { 
        out.println(String.format("%d | %f | %f ", id, latitude, longitude)); 
        id = 0; 
        latitude = 0.0f; longitude = 0.0f; 
       }//end if 
       inLine = textReader.readLine(); 
      }//end while 
      textReader.close(); 
      out.close(); 
     } catch (IOException e) { 
      System.out.println(e.getMessage()); 
     }//end try 
    } //end main 

} //end TestCampusImages 

該代碼是很好的,因爲它允許您進一步處理數據提取,如果需要的話。但它對輸入文件沒有驗證。所以要小心。如果您認爲此處的任何迴應都有幫助,請將其標記爲答案。

+0

不,這不是我的家庭作業。這只是我試圖做的一個項目,同時也是在挑選Java。我在學校學了一個小蟒蛇,那是我用來理解Java的鏡頭,但我的Python也很基礎。 :-P無論如何,謝謝你的線索。 – qximin 2015-03-19 03:04:25

+0

對不起,我使用的不適當的措辭。最近發生了不合理的事情。我回想起當我開始使用Java時,曾經在其他人使用javadoc發送給我的示例代碼中查看每個單詞。如果你有時間,你可以考慮在javadoc中查詢語句及其含義。這對我的情況有很大的幫助。 – senderj 2015-03-19 05:55:02

+0

謝謝。我正在閱讀不同的資源。我喜歡用於學習的是其他人的代碼。我喜歡閱讀定義,示例代碼和詳細解釋,以便我能更好地理解事物。 – qximin 2015-03-19 14:46:26

0

我通常這樣做是逐行讀取文件,並逐行輸出。我相信還有其他方法可以做到這一點,只是試驗一下。

try { 
    FileReader fr = new FileReader(yourfile); 
    BufferedReader br = new BufferedReader(fr); 
    FileOutputStream fout = new FileOutputStream (yourOutputFile); 
    PrintStream ps = new PrintStream(fout); 
    String line = br.readLine(); 
    while (line != null) { 
     //Do something; 
     String writeContent = your_code_to_get_write_content(line); 
     ps.println(writeContent); 
     line = br.readLine(); 
    } 
} catch (IOException e) { 
    System.out.println(e.getMessage()); 
} 
+0

我試過這段代碼,但總是有一行'fout.println(writeContent)'的錯誤;錯誤消息是:'方法println(String)對於FileOutputStream類型是未定義的。 – qximin 2015-03-20 00:06:11

+0

應該是ps.println – RoverMAX 2015-03-20 00:07:10

相關問題