2014-09-07 22 views
6

Attualmente sto scrivendo il mio progetto per la scuola in cui mi richiede di leggere e scrivere su file txt. Posso leggerli correttamente ma posso solo scriverli alla fine da un FileWriter allegato. Mi piacerebbe essere in grado di sovrascrivere le cose nei miei file txt su numeri di linea cancellando prima i dati sulla linea e poi scrivendo nei nuovi dati. Ho provato a utilizzare questo metodo ...Come posso scrivere su un numero di linea specifico in un file txt in Java

public void overWriteFile(String dataType, String newData) throws IOException 
{ 
    ReadFile file = new ReadFile(path); 
    RandomAccessFile ra = new RandomAccessFile(path, "rw"); 
    int line = file.lineNumber(path, dataType); 
    ra.seek(line); 
    ra.writeUTF(dataType.toUpperCase() + ":" + newData); 
} 

ma credo che il metodo di ricerca si sposti in byte anziché in numeri di riga. Qualcuno può aiutare. Grazie in anticipo :)

P.S. il metodo file.lineNumber restituisce la riga esatta su cui si trovavano i vecchi dati, quindi ho già il numero di riga su cui scrivere.

MODIFICA: trovato solista! Grazie ragazzi :) vi posterò la soloution qui sotto se qualcuno è interessato

public void overWriteFile(String dataType, String newData, Team team, int dataOrder) throws IOException 
{ 
    try 
    { 
     ReadFile fileRead = new ReadFile(path); 
     String data = ""; 
     if(path == "res/metadata.txt") 
     { 
      data = fileRead.getMetaData(dataType); 
     } 
     else if(path == "res/squads.txt") 
     { 
      data = fileRead.getSquadData(dataType, dataOrder); 
     } 
     else if(path == "res/users.txt") 
     { 
      data = fileRead.getUsernameData(dataType, dataOrder); 
     } 
     else if(path == ("res/playerdata/" + team.teamname + ".txt")) 
     { 
      //data = fileRead.getPlayerData(dataType, team.teamname, dataOrder); 
     } 
     BufferedReader file = new BufferedReader(new FileReader(path)); 
     String line; 
     String input = ""; 
     while((line = file.readLine()) != null) 
     { 
      input += line + '\n'; 
     } 
     input = input.replace(dataType.toUpperCase() + ":" + data, dataType.toUpperCase() + ":" + newData); 
     FileOutputStream out = new FileOutputStream(path); 
     out.write(input.getBytes()); 
    } 
    catch(Exception e) 
    { 
     System.out.println("Error overwriting file: " + path); 
     e.printStackTrace(); 
    } 
} 
+2

Se non si conosce la lunghezza di ciascuna riga, non è possibile accedere casualmente a una determinata riga. Basta copiare tutte le linee fino a tingere quello che stai cercando, quindi scrivere la sua sostituzione, quindi scrivere il resto delle linee. –

risposta

7

Una soluzione rapida e sporca sarebbe quella di utilizzare i Files.readAllLines e Files.write metodi per leggere tutte le linee, cambiare quello che si desidera modificare e sovrascrivere l'intero file:

List<String> lines = Files.readAllLines(file.toPath()); 
lines.set(line, dataType.toUpperCase() + ":" + newData); 
Files.write(file.toPath(), lines); // You can add a charset and other options too 

Naturalmente , non è una buona idea se è un file molto grande. Vedere this answer per alcune idee su come copiare il file riga per riga in quel caso.

Indipendentemente da come lo si fa, tuttavia, se si modifica la lunghezza in byte della linea, sarà necessario riscrivere l'intero file (AFAIK). RandomAcessFile ti consente di spostarti nel file e sovrascrivere i dati, ma non di inserire nuovi byte o di rimuovere quelli esistenti, quindi la lunghezza del file (in byte) rimarrà invariata.

+0

Beh, non è certamente necessario copiare i dati che precedono la linea in questione. I dati dopo che ha bisogno di essere spostati dalla differenza introdotta dalla modifica. Se il file è enorme e la riga modificata è vicina alla fine, potrebbe pagare. Potrebbe essere cruciale se il file è così grande che una copia di lavoro aggiuntiva non si adatti al disco. – 5gon12eder

1

Ecco un link ad una domanda, proprio come questo con una grande risposta: I want to open a text file and edit a specific line in java

In sostanza, non si può solo modificare quella linea, a meno che non sia la stessa lunghezza esatta.

Invece, ti consigliamo di copiare su ogni linea, e poi quando raggiungi il numero di linea della linea che vuoi cambiare, invece di copiare sulla vecchia linea, inserisci la tua nuova linea.

Il collegamento che ti ho dato ha un ottimo esempio su come farlo.

Spero che questo aiuti ... se non, fammelo sapere, e mi occuperò ulteriormente del post. Buona fortuna :)