更改文件中的最后一位数字

时间:2013-12-05 16:38:48

标签: java input digit

所以我想给.txt文件写十个数字,当我运行它时,我想把自己放在最后一个数字上,这样我就可以手动更改最后一个数字了。这是我到目前为止所得到的:

public static void main(String[] args) throws IOException 
{
    int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    File file = new File("text.txt");

    if (!file.exists())
    {
        file.createNewFile();
    }

    FileWriter fw = new FileWriter(file.getAbsoluteFile());
    BufferedWriter bw = new BufferedWriter(fw);

    bw.write(" " + Arrays.toString(a));
    bw.close();

    System.out.println("Done!");

这基本上是以int数组的形式将十位数写入.txt文件。现在,我将如何允许自己更改最后一位数,在这种情况下:10通过用户输入?

3 个答案:

答案 0 :(得分:4)

第1步

从文件中将所有内容读入内存。

StringBuilder contents = new StringBuilder();

File file = new File("test.txt");

BufferedReader br = new BufferedReader(new FileReader(file));

String line;
while ((line = br.readLine()) != null) {
   contents.append(line);
}

第2步

调整内存中的数据。

// Let's assume each day is split by a space
String[] numbers = contents.toString().split(" ");

numbers[numbers.length - 1] = String.valueOf(Integer.parseInt(numbers[numbers.length - 1]) - 1);

第3步

把所有东西都写回来。

FileOutputStream fos = new FileOutputStream(file);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fos));

for(String number : numbers)
{
    out.write(number);
}

out.close();

答案 1 :(得分:2)

克里斯的回答可能是最直接的。但另一种可能的方法是使用RandomAccessFile。如果您维护的文件非常大,这将是一个不错的选择。

 public class RAFExample {
   public static void main(String[] args){
    int[] values = {1,2,3,4,5,6,123};
    File file = new File("text.txt");
    System.out.println("File located at:  " + file.getAbsolutePath());
    RAFExample re = new RAFExample();

    try {
        re.saveArray(file,values);
        System.out.println("Current File Contents:  " + re.getFileContents(file));
        re.updateFile(file,9);
        System.out.println("Current File Contents:  " + re.getFileContents(file));
        re.updateFile(file,2342352);
        System.out.println("Current File Contents:  " + re.getFileContents(file));
        re.updateFile(file,-1);
        System.out.println("Current File Contents:  " + re.getFileContents(file));
    } catch (IOException e) {
        e.printStackTrace();  
    }
}

public void saveArray(File file, int[] values) throws IOException {
    BufferedWriter bw = new BufferedWriter(new FileWriter(file.getAbsoluteFile()));
    try{
        String toFile  = Arrays.toString(values);
        System.out.println("Writing the following string to the file: " + toFile);
        bw.write(toFile);
    }finally{
        bw.close();
    }
}

public void updateFile(File f, int value) throws IOException{
    RandomAccessFile raf = new RandomAccessFile(f,"rw");
    // Find the last space in the file
    final byte space = ' ';
    try{
        String s;
        if(raf.length() == 0){
            s = "[" + value + "]";
            raf.write(s.getBytes());
        }else{
            raf.seek(raf.length());
            int b = raf.read();
            while(raf.getFilePointer() - 2 > 0 && b != space){
                raf.seek(raf.getFilePointer() - 2);
                b = raf.read();
            }
            // now we are at the position to write the new value
            if(raf.getFilePointer() == 0){
                // We got to the beginning of the file,
                // which means there is 1 or 0 values
                s = "[" + value + "]";
            }else{
                s = String.valueOf(value);
            }
            raf.write(s.getBytes());
            raf.write(']'); // This follows the format of Arrays.toString(array)
            raf.setLength(raf.getFilePointer());
        }
    }finally{
        raf.close();
    }
}
private String getFileContents(File f){
    BufferedReader reader = null;
    StringBuilder sb = new StringBuilder(100);
    try{
        reader = new BufferedReader(new FileReader(f));
        while(reader.ready()){
            sb.append(reader.readLine());
        }
    }catch(IOException e){
        e.printStackTrace(System.err);
    }finally{
        if(reader != null){
            try{reader.close();}catch (IOException ignore){}
        }
    }
    return sb.toString();
  }
 }

答案 2 :(得分:1)

你有两个不同的问题。首先是如何获得“输入”。您希望用户添加的数据。要做到这一点,最简单的方法是在参数中使用命令行参数,并将其用作最终字符。

所以在执行bw.write之后但在bw.close之前执行

for (String str: args) {
    bw.write(str);
}

如果您需要真正等待输入但保持在命令行(而不是通过GUI),那么您需要从System.in()

读取

第二个问题是如何实际写入文件中的正确点。这可以通过阅读整个现有文件,然后回写追加或者可以通过打开文件,寻找正确的点,然后进行更改来完成。 Java中有一个随机访问文件系统可以帮助解决这个问题:

http://docs.oracle.com/javase/tutorial/essential/io/rafs.html