比如我有一个txt文件,文件的行数是随时间增长的,现在我想每次只读文件的最后10行(最新写入的数据),不知道这个应该怎么去实现?有人能指导下吗~谢谢了。通过定时器刷新,隔一定时间就读取一次。

解决方案 »

  1.   

    有很多流是有skip功能的,你在第一次读以后,几下大小,第二次的时候直接skip过去。大小就要你自己控制了。
      

  2.   

    http://www.5fuyou.com/images/head/DownLoad.html 分享一个编程视频下载地址,很好,很强大
      

  3.   

    文件很大么,不大就按行读出来塞进List<String>,倒序遍历最后10个
      

  4.   

    LineNumberReader好像很少有人用,不知道能不能解决楼主的问题
      

  5.   


    package com.hoo.utils;   
      
    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.util.ArrayList;   
    import java.util.List;   
      
    public class OperateFileUtils {   
      
        /***************************************************************************  
         * <b>function:</b> 在java中 路径/需要替换成\\  
         * @createDate 2010-6-4 上午11:18:45  
         * @param file 替换的文件  
         * @return 替换后的路径  
         */  
        private static String getAvailablePath(File file) {   
            return file.getPath().replace('\\', '/');   
        }   
      
        /***************************************************************************  
         * <b>function:</b> 返回某个文件夹下所有的文件  
         * @createDate 2010-6-4 上午11:21:07  
         * @param fileList 找到的文件集合  
         * @param path 路径  
         * @param fileSuffix 要找的文件后缀  
         */  
        public static void getFiles(List<File> fileList, String path, String fileSuffix) {   
            File file = new File(path);   
            File[] files = file.listFiles();   
            if (files == null) {   
                return;   
            } else {   
                for (int i = 0; i < files.length; i++) {   
                    // 判断是否是文件夹   
                    if (files[i].isDirectory()) {   
                        // 递归调用getFiles方法,得到所有的文件   
                        getFiles(fileList, getAvailablePath(files[i]), fileSuffix);   
                    } else if (files[i].getName().lastIndexOf(fileSuffix) != -1) {// 只处理fileSuffix后缀的文档   
                        // copyFileAndAddPackageName(files[i]);   
                        fileList.add(files[i]);// 添加到文件集合中   
                    }   
                    // System.out.println(files[i].getAbsolutePath().replace('\\',   
                    // '/'));   
                }   
            }   
        }   
      
        /***************************************************************************  
         * <b>function:</b> 把文件内容复制到指定文件中  
         * @createDate 2010-6-4 下午12:09:42  
         * @author 3hhuj 胡佳  
         * @param file 要操作的文件  
         * @param toFile 保存的文件  
         */  
        public static void copyFile2TempFile(List<File> fileList, File toFile) {   
            BufferedWriter bw = null;   
            BufferedReader br = null;   
            FileWriter fileWriter = null;   
            FileReader fileReader = null;   
            try {   
                StringBuilder sb = new StringBuilder();   
                String content = "";   
                for (File textFile : fileList) {   
                    System.out.println(textFile.getName());   
                    fileReader = new FileReader(textFile);// 读取文件的内容   
                    br = new BufferedReader(fileReader);   
                    while ((content = br.readLine()) != null) {   
                        System.out.println(content);   
                        if (!content.trim().equals("")) {   
                            sb.append(content);// .append("\r");   
                        }   
                    }   
                }   
                fileWriter = new FileWriter(toFile);// 向文件中写入刚才读取文件中的内容   
                bw = new BufferedWriter(fileWriter);   
                bw.write(sb.toString());   
            } catch (Exception e) {   
                e.printStackTrace();   
            } finally {   
                try {   
                    bw.close();   
                    br.close();   
                    fileWriter.close();   
                    fileReader.close();   
                } catch (IOException e) {   
                    e.printStackTrace();   
                }   
            }   
        }   
      
        /***************************************************************************  
         *  <b>function:</b> 读取单个文件  
         * @createDate 2010-6-4 下午01:42:33  
         * @param file 读取内容的文件  
         * @param toFile 保存后的文件  
         */  
        public static void copyFile2TempFile(File file, File toFile) {   
            BufferedWriter bw = null;   
            BufferedReader br = null;   
            FileWriter fileWriter = null;   
            FileReader fileReader = null;   
            try {   
                StringBuilder sb = new StringBuilder();   
                String content = "";   
                fileReader = new FileReader(file);// 读取文件的内容   
                br = new BufferedReader(fileReader);   
                while ((content = br.readLine()) != null) {   
                    System.out.println(content);   
                    if (!content.trim().equals("")) {   
                        sb.append(content);// .append("\r");   
                    }   
                }   
                fileWriter = new FileWriter(toFile);// 向文件中写入刚才读取文件中的内容   
                bw = new BufferedWriter(fileWriter);   
                bw.write(sb.toString());   
            } catch (Exception e) {   
                e.printStackTrace();   
            } finally {   
                try {   
                    bw.close();   
                    br.close();   
                    fileWriter.close();   
                    fileReader.close();   
                } catch (IOException e) {   
                    e.printStackTrace();   
                }   
            }   
        }   
      
        public static void main(String[] args) {   
            List<File> fileList = new ArrayList<File>();   
            getFiles(fileList, "c:/txt_test", ".txt");   
            getFiles(fileList, "c:/txt", ".txt");   
            // 将读取的内容放入tempFile中   
            File tempFile = new File("c:\\temp.txt");   
            if (!tempFile.exists()) {   
                try {   
                    //不存在就创建一个   
                    tempFile = File.createTempFile("temp", ".txt", new File("c:\\"));   
                } catch (IOException e) {   
                    e.printStackTrace();   
                }   
            }   
            //copyFile2TempFile(fileList, tempFile);   
            copyFile2TempFile(new File("c:\\a.txt"), tempFile);   
        }   
    }  
    package com.hoo.utils;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.util.ArrayList;
    import java.util.List;public class OperateFileUtils { /***************************************************************************
     * <b>function:</b> 在java中 路径/需要替换成\\
     * @createDate 2010-6-4 上午11:18:45
     * @param file 替换的文件
     * @return 替换后的路径
     */
    private static String getAvailablePath(File file) {
    return file.getPath().replace('\\', '/');
    } /***************************************************************************
     * <b>function:</b> 返回某个文件夹下所有的文件
     * @createDate 2010-6-4 上午11:21:07
     * @param fileList 找到的文件集合
     * @param path 路径
     * @param fileSuffix 要找的文件后缀
     */
    public static void getFiles(List<File> fileList, String path, String fileSuffix) {
    File file = new File(path);
    File[] files = file.listFiles();
    if (files == null) {
    return;
    } else {
    for (int i = 0; i < files.length; i++) {
    // 判断是否是文件夹
    if (files[i].isDirectory()) {
    // 递归调用getFiles方法,得到所有的文件
    getFiles(fileList, getAvailablePath(files[i]), fileSuffix);
    } else if (files[i].getName().lastIndexOf(fileSuffix) != -1) {// 只处理fileSuffix后缀的文档
    // copyFileAndAddPackageName(files[i]);
    fileList.add(files[i]);// 添加到文件集合中
    }
    // System.out.println(files[i].getAbsolutePath().replace('\\',
    // '/'));
    }
    }
    } /***************************************************************************
     * <b>function:</b> 把文件内容复制到指定文件中
     * @createDate 2010-6-4 下午12:09:42
     * @author 3hhuj 胡佳
     * @param file 要操作的文件
     * @param toFile 保存的文件
     */
    public static void copyFile2TempFile(List<File> fileList, File toFile) {
    BufferedWriter bw = null;
    BufferedReader br = null;
    FileWriter fileWriter = null;
    FileReader fileReader = null;
    try {
    StringBuilder sb = new StringBuilder();
    String content = "";
    for (File textFile : fileList) {
    System.out.println(textFile.getName());
    fileReader = new FileReader(textFile);// 读取文件的内容
    br = new BufferedReader(fileReader);
    while ((content = br.readLine()) != null) {
    System.out.println(content);
    if (!content.trim().equals("")) {
    sb.append(content);// .append("\r");
    }
    }
    }
    fileWriter = new FileWriter(toFile);// 向文件中写入刚才读取文件中的内容
    bw = new BufferedWriter(fileWriter);
    bw.write(sb.toString());
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    try {
    bw.close();
    br.close();
    fileWriter.close();
    fileReader.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    } } public static void main(String[] args) {
    List<File> fileList = new ArrayList<File>();
    getFiles(fileList, "c:/txt_test", ".txt");
    getFiles(fileList, "c:/txt", ".txt");
    // 将读取的内容放入tempFile中
    File tempFile = new File("c:\\temp.txt");
    if (!tempFile.exists()) {
    try {
    //不存在就创建一个
    tempFile = File.createTempFile("temp", ".txt", new File("c:\\"));
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    //copyFile2TempFile(fileList, tempFile);
    copyFile2TempFile(new File("c:\\a.txt"), tempFile);
    }
    }
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/IBM_hoojo/archive/2010/06/04/5647373.aspx
      

  6.   

    感觉这个需求有点无理头。为什么是txt文件。那么多实现为什么选txt文件。
      

  7.   

    RandomAccessFile1每次读完都要关闭,如果不影响其他线程写入则可以不关2在程序中记录已读取的大小,getFilePointer();
    每次打开可直接seek到指定位置该类可以readLine()long getFilePointer() 
              Returns the current offset in this file. void seek(long pos) 
              Sets the file-pointer offset, measured from the beginning of this file, at which the next read or write occurs. 
      

  8.   

    RandomAccessFile能读出最后10行,要不再加个timer..
      

  9.   

    用RandomAccessFile
    然后往前查,看看是不是够十行,不够直接读取所有够的话,就读十行
      

  10.   

    看看这个,他是读取到最后一行,你可以改变一下
    http://www.javaeye.com/problems/42748
      

  11.   

    如果你用Linux操作系统的话:
    tail -f fileName
    就可以了
      

  12.   

    唉,先用笨办法实现了,RandomAccessFile这个类以前没有接触过,网上找了点例子看的不是很明白,先用笨办法解决了,我再研究下RandomAccessFile,搞定之后再改过来。公司让做一个FTP程序,实现定是上传下载功能,客户端用的swing,服务端是webservice。有详细的传输监控日志,本来是写数据库的,没什么问题,不过后来改成日志写本地文件,不写数据库了,所以才有这个问题。我现在方法是把文件内容放到list里,然后在取符合条件的,以下是代码:import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;public class FileRead {
    public List Test(String filepath)
    {
    List ls = new ArrayList();

    FileReader fr = null;
    BufferedReader br = null;
    String line = "";
    try {
    fr = new FileReader(filepath);
    br = new BufferedReader(fr);
    while ((line = br.readLine()) != null) {
    ls.add(line);
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } finally
    {
    if(br != null && fr != null)
    {
    try {
    br.close();
    br = null;
    fr.close();
    fr = null;
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    return ls;
    }
    }