代码之家  ›  专栏  ›  技术社区  ›  Dacto

PrintWriter异常:字符串索引超出范围

  •  0
  • Dacto  · 技术社区  · 15 年前

    我试图读取一个文件,然后将一些文本附加到文件中的某个位置(即@offset jab)。当我试图在偏移量jabjab处写入文件时,就会出现问题。怎么了?

    文件内容:

    Mi
    <?xml Version="1.0"?>
    

    _

    File f = new File("data.dat");
        String brstring = null;
        String entrystring = null;
        try {
            BufferedReader br = new BufferedReader(new FileReader(f));
            String line;
            StringBuilder result = new StringBuilder();
            while ((line = br.readLine()) != null) {
            result.append(line+"\r\n");
            }
            br.close();
            System.out.print(result);
            int jabjab = result.indexOf("?>");
            System.out.println(jabjab);
            PrintWriter fo = new PrintWriter(f);
            fo.write("ok", jabjab, 2);
            fo.flush();
            fo.close();
        } catch (Exception ex) {
            System.out.print(ex.getMessage());
        }
    

    控制台输出,包括错误:

    Mi// output of the result string
    <?xml Version="1.0"?>//output of the result string
    23//output of jabjab
    String index out of range: 25String index out of range: 25//output of exception
    

    1 回复  |  直到 15 年前
        1
  •  3
  •   Jim Garrison    15 年前

    我想你误解了PrintWriter.write(字符串、偏移量、长度)的定义。如果我读对了你的问题,你认为它会在那个偏移量写入输出文件。但是,偏移量指定要写入的字符串的起始位置,因此您尝试从偏移量23开始的字符串“ok”写入。由于该字符串只有2个字符,因此会出现异常。

    如果确实要覆盖文件中的特定字节,请查看java.io.RandomAccessFile。请注意,虽然可以用其他字节覆盖文件中的特定字节,但如果不将数据读入内存并将新副本写入磁盘,则无法“插入”数据或从文件中删除数据(导致文件长度不同)。