【问题标题】:Copy a file into an other starting from a specific position从特定位置开始将文件复制到另一个文件中
【发布时间】:2016-02-25 12:51:19
【问题描述】:

我有以下超过确定大小的文件,我想减小它,但我对文件的最后几行感兴趣,所以我想删除第一行,直到大小等于允许的大小,

在 java 中有没有办法做到这一点?

【问题讨论】:

  • 你想就地做,或者重写文件的解决方案可以吗?
  • 欢迎提出任何建议
  • 这个答案看起来不错:stackoverflow.com/questions/14280385/…
  • 我已经尝试过了,当我截断它时,它会保留第一行而不是最后一行。
  • 如何将文件指针设置为结束文件减去最大大小并检查 >= 0。然后从那里读取?

标签: java java-io truncation


【解决方案1】:

试试这个:

long MAX_FILE_SIZE = 512;

try(RandomAccessFile file = new RandomAccessFile("Path to inputfile", "r"))
{
    long fileSize = file.length();

    long readStartPosition = fileSize - MAX_FILE_SIZE;
    if(readStartPosition < 0)
    {
        readStartPosition = 0;
    }

    file.seek(readStartPosition);

    try(OutputStream outputStream = new BufferedOutputStream(new FileOutputStream("Path to outputfile")))
    {
        byte[] buffer = new byte[1024];
        for(int bytesRead = file.read(buffer); bytesRead != -1; bytesRead = file.read(buffer))
        {
            outputStream.write(buffer, 0, bytesRead);
        }
    }
}
catch(Throwable t)
{
    System.out.println(t);;
}

或者这个,如果你想保留同一个文件:

long MAX_FILE_SIZE = 512;

try(RandomAccessFile file = new RandomAccessFile("Path to inputfile", "rw"))
{
    long fileSize = file.length();

    long readStartPosition = fileSize - MAX_FILE_SIZE;
    if(readStartPosition < 0)
    {
        return;
    }

    long writePosition = 0;
    byte[] buffer = new byte[1024];

    file.seek(readStartPosition);
    for(int bytesRead = file.read(buffer); bytesRead != -1; bytesRead = file.read(buffer))
    {
        long currentPosition = file.getFilePointer();

        file.seek(writePosition);
        file.write(buffer, 0, bytesRead);

        writePosition += bytesRead;

        file.seek(currentPosition);
    }

    long newSize = file.length() - readStartPosition;
    file.setLength(newSize);
}
catch(Throwable t)
{
    System.out.println(t);;
}

注意:这两个示例都写在我的脑海中,但它们应该可以工作。至少你掌握了窍门。

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 2015-01-30
    • 2013-05-02
    • 1970-01-01
    相关资源
    最近更新 更多