Implémenter le retour en arrière du pointeur de fichier en Java

besoin

Utilisez le flux de lecture de fichier pour réaliser le retour arrière du pointeur de fichier. Lisez chaque ligne de données dans le fichier texte, enregistrez la position du dernier caractère lu et la position du prochain caractère à lire, et affichez la ligne lue en dernier.

environnement de laboratoire

Jdk8, IDÉE

procédure d'expérience

train de pensée

Cette expérience utilise les fonctions de remarque, de réinitialisation et de lecture de BufferReader :
1. remarque() : marque la position du caractère, s'il n'a jamais été marqué, il marquera la position du premier caractère du fichier par défaut

  /**
     * Marks the present position in the stream.  Subsequent calls to reset()
     * will attempt to reposition the stream to this point.
     *
     * @param readAheadLimit   Limit on the number of characters that may be
     *                         read while still preserving the mark. An attempt
     *                         to reset the stream after reading characters
     *                         up to this limit or beyond may fail.
     *                         A limit value larger than the size of the input
     *                         buffer will cause a new buffer to be allocated
     *                         whose size is no smaller than limit.
     *                         Therefore large values should be used with care.
     *
     * @exception  IllegalArgumentException  If {@code readAheadLimit < 0}
     * @exception  IOException  If an I/O error occurs
     */
    public void mark(int readAheadLimit) throws IOException {
    
    
        if (readAheadLimit < 0) {
    
    
            throw new IllegalArgumentException("Read-ahead limit < 0");
        }
        synchronized (lock) {
    
    
            ensureOpen();
            this.readAheadLimit = readAheadLimit;
            markedChar = nextChar;
            markedSkipLF = skipLF;
        }
    }

2.reset() : Retour à la dernière position marquée

/**
 * Resets the stream to the most recent mark.
 *
 * @exception  IOException  If the stream has never been marked,
 *                          or if the mark has been invalidated
 */
public void reset() throws IOException {
    
    
    synchronized (lock) {
    
    
        ensureOpen();
        if (markedChar < 0)
            throw new IOException((markedChar == INVALIDATED)
                                  ? "Mark invalid"
                                  : "Stream not marked");
        nextChar = markedChar;
        skipLF = markedSkipLF;
    }
}

3.readline() : Lit une ligne de données (à partir de l'emplacement du pointeur de fichier)

code source

    public static void readTxtFile3(String fileName) throws IOException {
    
    
        int past_pos = 1; // 文件指针上一次所在位置
        int cur_pos = 1; // 文件指针当前所在位置(就是下一个要读取的字符的位置)
        int cur_lineNumber = 1;
        InputStreamReader fr = new InputStreamReader(new FileInputStream(fileName), "UTF-8"); // 指定以UTF-8编码读入
        BufferedReader br = new BufferedReader(fr);
        String line = "";
        while ((line = br.readLine()) != null) {
    
      // 文件未到文件尾
            past_pos = cur_pos;
            cur_pos += line.length();
            br.mark(past_pos);
            br.reset();
            System.out.println("第 " + cur_lineNumber + " 行: " + past_pos + "," + cur_pos);
            System.out.println(line);
            cur_lineNumber++;
        }
    }

    public static void main(String[] args) throws IOException {
    
    
        String fileName = "D:\\data\\pdata\\all_person_info.txt"; // 读取文件
        int totalNo = getTotalLines(fileName);  // 获取文件的内容的总行数
        System.out.println("本文总共有:" + totalNo + "行");
        ReadFile2.readTxtFile3(fileName);
    }

résultat de l'opération

contenu des documents
Résultats de la

insuffisant

Les documents officiels de ces fonctions mentionnent également que si le fichier est trop volumineux, c'est-à-dire que le nombre de caractères dépasse la plage du type int, la fonction remarque() échouera. Quant à la façon de le résoudre, vous devriez pouvoir pour utiliser l'objet de flux d'entrée d'octets de fichier ! ! !
Comment y parvenir, s'il vous plaît se référer à mon prochain article!

Je suppose que tu aimes

Origine blog.csdn.net/dubulingbo/article/details/106996696
conseillé
Classement