逐行读取随机访问文件中的文件,并从每一行中获取部分字符串

时间:2019-01-26 13:28:58

标签: java file-io

我的目标是读取文本文件中的行并在文件中查找位置,然后使用Java中的randomaccessfile IO从该位置读取字符串直至给定长度。我已经编写了以下代码,我的代码将进入无限循环并始终打印第一行。下面是代码。有人能帮我吗? 包装测试;

import java.io.RandomAccessFile;
import java.util.LinkedHashMap;
import java.util.Map;

public class MyTest {

    static byte[] b;
    static Map<String, Integer> pos = new LinkedHashMap<>();
    static Map<String, Integer> length = new LinkedHashMap<>();
    static RandomAccessFile raf;
    static String str = null;

    public static void main(String[] args) throws Exception {
        pos.put("name", 0);
        pos.put("age", 3);
        pos.put("gender", 8);

        length.put("name", 2);
        length.put("age", 6);
        length.put("gender", 10);
        raf = new RandomAccessFile("mytext", "r");
        while ((str = raf.readLine()) != null) {
            for (Map.Entry<String, Integer> map : pos.entrySet()) {
                String key = map.getKey();
                read("mytext", map.getValue(), length.get(key));
            }
        }
    }

    public static void read(String path, int position, int length) throws Exception {
        b = new byte[500];
        raf.seek(position);
        raf.read(b, position, length);
        System.out.println(new String(b));
    }
}

2 个答案:

答案 0 :(得分:1)

documentationreadLine()指定为

  

从该文件读取下一行文本。此方法从当前文件指针开始连续读取文件中的字节,直到到达行终止符或文件末尾为止。 [...]

seek(long pos)

  

设置文件指针偏移量,从该文件的开头开始测量,在该位置下一次读取或写入。 [...]

因此,在您的read()中,将指针设置为readLine()循环中的另一个位置。如果该位置再次是文件的开头,您将一次又一次地读取第一行。

答案 1 :(得分:0)

在这个例子中,我们首先将数据写入一个具有 ramdom 访问文件的文件中,然后我们读取它。

public static void main(String[] args) throws IOException {
        int[] listaNumeros = new int[20];
        ArrayList<Integer> num1 = new ArrayList();
        for (int i = 0; i < 20 ; i++) {
            listaNumeros[i]=numAleatorios(20,40);
        }
        try(RandomAccessFile doc = new RandomAccessFile("ficheros/numeros2.txt","rw");){
            for(int n:listaNumeros)
                doc.writeInt(n);
            //System.out.println(doc.length());
            //String s = String.valueOf(doc.read());
            //System.out.println(s);
            //num1.add(doc.read());

        }catch (IOException e){
            e.printStackTrace();
        }

        try(RandomAccessFile doc = new RandomAccessFile("ficheros/numeros2.txt","rw");){
            while(doc.getFilePointer()<doc.length()){
                System.out.println(doc.readInt());
                num1.add(doc.readInt());
            }
            System.out.println(media(num1));
        }catch (IOException e){
            e.printStackTrace();
        }
    }

不要忘记使用不同的 RamdomAccessFil 写入和读取。