java - 调用 RandomAccessFile 实例的 setLength 方法时出现无效参数错误

标签 java

这是代码:

package vu.co.kaiyin;

import java.io.FileOutputStream;
import java.io.RandomAccessFile;



import java.io.*;

/**
 * Created by IDEA on 14/06/15.
 */
public class Test {

    public static void truncateFromEnd(File filename, int n) throws Exception {
        if(n < 0) {
            throw new Exception("Can't truncate by a negative number");
        }
        try (RandomAccessFile raf = new RandomAccessFile(filename, "r")) {
            long originalLength = raf.length();
            long newLength = originalLength - (long) n;
            if(newLength < 0) {
                newLength = 0;
            }
            raf.setLength(newLength);
        }
    }

    public static void truncateFromEnd(String filename, int n) throws Exception {
        truncateFromEnd(new File(filename), n);
    }

    public static void main(String[] args) throws Exception {
        FileOutputStream fo = new FileOutputStream("/tmp/bin.out");
        byte[] data = new byte[] {1, 2, 3, 4, 5};
        fo.write(data);
        fo.close();
        truncateFromEnd("/tmp/bin.out", 1);
    }
}

这是错误:

/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/bin/java -Didea.launcher.port=7532 "-Didea.launcher.bin.path=/Applications/IntelliJ IDEA 14 CE.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Users/kaiyin/workspace/BedWorks/target/classes:/Applications/IntelliJ IDEA 14 CE.app/Contents/lib/junit-4.11.jar:/Applications/IntelliJ IDEA 14 CE.app/Contents/lib/hamcrest-core-1.3.jar:/Applications/IntelliJ IDEA 14 CE.app/Contents/lib/hamcrest-library-1.3.jar:/Users/kaiyin/.m2/repository/com/google/guava/guava/18.0/guava-18.0.jar:/Users/kaiyin/.m2/repository/commons-io/commons-io/1.3.2/commons-io-1.3.2.jar:/Applications/IntelliJ IDEA 14 CE.app/Contents/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMain vu.co.kaiyin.Test
Picked up _JAVA_OPTIONS: -Xms256m -Xmx2g
Exception in thread "main" java.io.IOException: Invalid argument
    at java.io.RandomAccessFile.setLength(Native Method)
    at vu.co.kaiyin.Test.truncateFromEnd(Test.java:25)
    at vu.co.kaiyin.Test.truncateFromEnd(Test.java:30)
    at vu.co.kaiyin.Test.main(Test.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

Process finished with exit code 1

我做错了什么吗?

最佳答案

您可能需要通过在构造函数中传递 rw(读/写)来授予您的 RandomAccessFile 写入权限。

try (RandomAccessFile raf = new RandomAccessFile(filename, "rw"))

如果您要更改文件长度,那么您肯定是在写入它。

关于java - 调用 RandomAccessFile 实例的 setLength 方法时出现无效参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30990163/

相关文章:

java - JSF 2 - 未检测到@ManagedBean

java - 在 Selenium 中定位 href 元素

java - 检查当前使用哪个 ArrayAdapter Spinner

java - 随机生成器似乎没有生成某些数字 : is my code wrong or is it a feature of objects of type Random?

java - 1.7 中 javax.sql.CommonDataSource 添加的新方法

java - 如何从存储为 r、g、b 的像素创建图像,每个像素在数组中占据不同的位置?

java - Spring Security 忽略多个 HTTP 配置

java - 为什么 for 循环在我的 Java 程序中迭代的次数超过给定条件

java - Hibernate IllegalArgumentException 调用 setter

java - windows 7,一些 SWT 对话框显示不完整