【问题标题】:Append penultimate line追加倒数第二行
【发布时间】:2014-06-16 12:08:48
【问题描述】:

我目前将读取的文件存储在List<String> 中,将我的String 添加到列表的倒数第二位,最后将我的列表写入原始文件。

它工作正常,因为我的文件只有 20 行左右,但我觉得如果文件更大,这将是一个非常长的过程。

因此我的问题是:是否有类似Append 的方法来简单地选择要附加行的位置?

【问题讨论】:

    标签: java android file append


    【解决方案1】:

    只需使用附加模式打开一个java.io.FileOutputStream,然后编写您的单个字符串。

    使用这个类的如下构造函数是:

    FileOutputStream(String name, boolean append)

    这是为了追加到文件的末尾。

    您可以使用java.io.RandomAccessFile 编辑文件内的任何位置。

    编辑: 使用 RandomAccessFile 实现任务的示例代码。

    import java.io.RandomAccessFile;
    import java.util.ArrayList;
    import java.util.List;
    
    public class InsertPenultimateLine {
    
        private static String nl = System.getProperty("line.separator");
    
        private static void usingRAF() throws Exception {
            String fileName = "somefile.txt";
            String myLine = "blah-blah-blah";
    
            RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
    
            List<Byte> bytes = new ArrayList<Byte>();
            long len = raf.length();
            long index = len-1;
            for(;index>0;index--) {
                raf.seek(index);
                byte b = raf.readByte();
                if(b == 10) {
                    break;
                }
                bytes.add(0, b);
            }
    
            byte[] rawBytes = new byte[bytes.size()];
            for(int j=0;j<bytes.size();j++) {
                rawBytes[j] = bytes.get(j);
            }
            String str = new String(rawBytes);
            str = myLine + nl + str;
    
            raf.seek(index + 1);
            raf.write(str.getBytes());
    
            raf.close();
        }
    
        public static void main(String[] args) throws Exception {
            usingRAF();
        }
    }
    

    【讨论】:

    • 这只会让我写在文件的末尾,而不是选择位置。
    • 我正在尝试使用 RandomAccessFile 但我必须阅读整个文件,搜索倒数第二行的整数位置,然后在写入之前使用RandomAccessFile.Seek(int)。不确定它会比我目前的解决方案更好......
    • @Arty 如果您将整个文件存储在List&lt;String&gt; 中,那么这对于小文件来说可能没问题。如果文件很大(比如 500MB),那么在列表中缓存它可能不是一种可扩展的方式。顺便说一句,您无需阅读整个文件即可调用 seek 方法。使用length 方法获取整个文件的长度。如果您有单行的大致长度,则可以使用它来到达前一行。
    • 似乎RandomAccessFile.WriteChars(String) 覆盖了写入的位。示例:如果我在“g”位置的“abcdefghijklmno”中写“test”,我得到“abcdeftestklmno”,我想要“abcdeftestghijklmno”
    猜你喜欢
    • 2018-01-21
    • 2015-11-22
    • 2021-01-06
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多