出于培训目的,我正在编写一个用于读/写/修改文本文件的类。
我的问题是我的一个函数(openFile),其目的是将文本文件内容转换为ArrayList似乎被窃听:每行的第一个字符消失。
以下是java文件,测试脚本和测试脚本结果:
TextFile.java
/**
*
*/
package files;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
/**
* @author Erwan GEORGET <egeorget@openmailbox.org>
* @licence GPLv3
*
*/
public class TextFile {
//-----------------------------------Données------------------------------------
ArrayList<String> arrayString;
//--------------------------------Constructeurs---------------------------------
public TextFile(){//ok
this.arrayString = new ArrayList<String>();
}
//------------------------------Méthodes publiques------------------------------
//---------Modificateurs locaux--------
public void addText(String text){//ok
arrayString.add(text);
}
public String readTextAt(int index){//ok
return arrayString.get(index);
}
public void rmTextAt(int index){ //ok
this.arrayString.remove(index);
}
//---------------écriture---------------
public void writeToNewFile(String chemin) throws IOException{//ok
PrintWriter bw = new PrintWriter(new BufferedWriter(new FileWriter(new File(chemin))));
int i=0;
while (i<this.arrayString.size()){
System.out.println(this.arrayString.get(i)+ " écrit dans le fichier "+chemin);
bw.println(this.arrayString.get(i));
i++;
}
bw.close();
}
//----------------Lecture----------------
public String readLineFromFile(String chemin, int ligne) throws IOException{
String result="EOF";
ArrayList<String> tempo = new ArrayList<String>();
tempo=openFile(chemin);
result=tempo.get(ligne);
return result;
}
public String readFromFile(String chemin) throws IOException{
String result="";
int i=0;
ArrayList<String> tempo = new ArrayList<String>();
tempo=openFile(chemin);
result=tempo.get(i);
i++;
while (i < tempo.size() ){
result=result+"\n"+tempo.get(i);
i++;
}
return result;
}
//---------------Chargement---------------
public void loadFromFile(String chemin) throws IOException{//ok
this.writeToNewFile(chemin+".old");
this.arrayString=openFile(chemin);
}
//------------------Débug-----------------
public void debug(){//ok
int i = 0;
System.out.println("Contenu de arrayString: ");
while (i < this.arrayString.size()){
System.out.println(this.arrayString.get(i));
i++;
}
}
//-------------------------------Méthodes privées-------------------------------
protected ArrayList<String> openFile(String chemin) throws IOException{//bug
ArrayList<String> result=new ArrayList<String>();
FileReader ligne = new FileReader(chemin);
BufferedReader buffer = new BufferedReader(ligne);
System.out.println("Ouverture du fichier "+chemin+"\nLecture...");
while (buffer.read() != -1){
String tempo=buffer.readLine();
System.out.println(tempo);
result.add(tempo);
}
buffer.close();
System.out.println("Fermeture du fichier "+chemin);
return result;
}
}
TestTextFile.java
/**
*
*/
package files;
import java.io.*;
import java.util.*;
/**
* @author erwan
*
*/
public class TestTextFile {
/**
* @param args
* @throws IOException
* @throws InterruptedException
*/
public static void main(String[] args) throws IOException, InterruptedException {
// TODO Stub de la méthode généré automatiquement
int test=0;
TextFile file = new TextFile();
Date date = new Date();
System.out.println("-------------TEST "+test+"-------------");
test++;
System.out.println(date);
System.out.println("-------------TEST "+test+"-------------");
test++;
file.debug();
System.out.println("-------------TEST "+test+"-------------");
test++;
file.addText(date.toString()+" test 3.1");
System.out.println("Emplacement 0 de arrayString :");
System.out.println(file.readTextAt(0));
System.out.println("Emplacement 1 de arrayString :");
file.addText(date.toString()+" test 3.2");
System.out.println(file.readTextAt(1));
file.writeToNewFile("/home/erwan/data_test");
System.out.println("-------------TEST "+test+"-------------");
test++;
file.debug();
System.out.println("-------------TEST "+test+"-------------");
test++;
file.loadFromFile("/home/erwan/data_test");
file.debug();
System.out.println("-------------TEST "+test+"-------------");
test++;
Thread.sleep(2000);
date = new Date();
file.addText(date.toString()+" test 5");
file.debug();
file.writeToNewFile("/home/erwan/data_test");
System.out.println("-------------TEST "+test+"-------------");
test++;
file.rmTextAt(0);
file.debug();
System.out.println("-------------TEST "+test+"-------------");
test++;
file.rmTextAt(0);
file.debug();
System.out.println("-------------TEST "+test+"-------------");
test++;
System.out.println(file.readLineFromFile("/home/erwan/data_test",0));
System.out.println("-------------TEST "+test+"-------------");
test++;
System.out.println(file.readFromFile("/home/erwan/data_test"));
}
}
Java控制台:
-------------TEST 0-------------
Tue Jun 03 12:04:19 CEST 2014
-------------TEST 1-------------
Contenu de arrayString:
-------------TEST 2-------------
Emplacement 0 de arrayString :
Tue Jun 03 12:04:19 CEST 2014 test 3.1
Emplacement 1 de arrayString :
Tue Jun 03 12:04:19 CEST 2014 test 3.2
Tue Jun 03 12:04:19 CEST 2014 test 3.1 écrit dans le fichier /home/erwan/data_test
Tue Jun 03 12:04:19 CEST 2014 test 3.2 écrit dans le fichier /home/erwan/data_test
-------------TEST 3-------------
Contenu de arrayString:
Tue Jun 03 12:04:19 CEST 2014 test 3.1
Tue Jun 03 12:04:19 CEST 2014 test 3.2
-------------TEST 4-------------
Tue Jun 03 12:04:19 CEST 2014 test 3.1 écrit dans le fichier /home/erwan/data_test.old
Tue Jun 03 12:04:19 CEST 2014 test 3.2 écrit dans le fichier /home/erwan/data_test.old
Ouverture du fichier /home/erwan/data_test
Lecture...
ue Jun 03 12:04:19 CEST 2014 test 3.1
ue Jun 03 12:04:19 CEST 2014 test 3.2
Fermeture du fichier /home/erwan/data_test
Contenu de arrayString:
ue Jun 03 12:04:19 CEST 2014 test 3.1
ue Jun 03 12:04:19 CEST 2014 test 3.2
-------------TEST 5-------------
Contenu de arrayString:
ue Jun 03 12:04:19 CEST 2014 test 3.1
ue Jun 03 12:04:19 CEST 2014 test 3.2
Tue Jun 03 12:04:21 CEST 2014 test 5
ue Jun 03 12:04:19 CEST 2014 test 3.1 écrit dans le fichier /home/erwan/data_test
ue Jun 03 12:04:19 CEST 2014 test 3.2 écrit dans le fichier /home/erwan/data_test
Tue Jun 03 12:04:21 CEST 2014 test 5 écrit dans le fichier /home/erwan/data_test
-------------TEST 6-------------
Contenu de arrayString:
ue Jun 03 12:04:19 CEST 2014 test 3.2
Tue Jun 03 12:04:21 CEST 2014 test 5
-------------TEST 7-------------
Contenu de arrayString:
Tue Jun 03 12:04:21 CEST 2014 test 5
-------------TEST 8-------------
Ouverture du fichier /home/erwan/data_test
Lecture...
e Jun 03 12:04:19 CEST 2014 test 3.1
e Jun 03 12:04:19 CEST 2014 test 3.2
ue Jun 03 12:04:21 CEST 2014 test 5
Fermeture du fichier /home/erwan/data_test
ue Jun 03 12:04:21 CEST 2014 test 5
-------------TEST 9-------------
Ouverture du fichier /home/erwan/data_test
Lecture...
e Jun 03 12:04:19 CEST 2014 test 3.1
e Jun 03 12:04:19 CEST 2014 test 3.2
ue Jun 03 12:04:21 CEST 2014 test 5
Fermeture du fichier /home/erwan/data_test
e Jun 03 12:04:19 CEST 2014 test 3.1
e Jun 03 12:04:19 CEST 2014 test 3.2
ue Jun 03 12:04:21 CEST 2014 test 5
答案 0 :(得分:3)
在while循环之前移除i++
:
i++; <= remove it
while (i < tempo.size() ){
result=result+"\n"+tempo.get(i);
i++;
}
答案 1 :(得分:1)
您正在openFile()方法中使用BufferedReader,因此您处于正确的轨道上。
你应该使用BufferedReader.readLine()而不是read()来一次读取石灰:
String nextLine = null;
while ((nextLine = buffer.readLine()) != null) {
result.add(nextLine);
}
其中result
是ArrayList<String>
而buffer
是BufferedReader
答案 2 :(得分:0)
openFile
中的这一行是错误的:
while (buffer.read() != -1){
您正在从缓冲区读取,但您没有使用内容。它只是被丢弃。
您需要将其替换为:
String tempo =null;
while((tempo=buffer.readLine())!=null){
result.add(tempo);
}