1

/proc/%d/stat我在使用我的 Java 方法 copyFiles()读取文件时遇到问题(源代码如下)。我找到了使用类似 readProc() 方法的解决方法。

现在我想知道是什么问题。创建了输出文件,但每个文件都有 0 字节(在 /proc/ 中所有文件都是 0 字节,因为它不是标准文件系统)。FileUtils 来自 Apache Commons IO 库。

我尝试使用 java.nio 来做同样的事情——再次抛出 IOException ,表明每个文件的属性都是错误的。

我删除了有关解析异常等的部分代码。

为什么这适用于 FileInputStream,但不适用于FileUtils.copyFile()?

public void copyFiles() {
    final File dir = new File("/proc");
    final String[] filedirArray = dir.list();
    long counter = 0;
    for(String filedir : filedirArray) {
            final File checkFile = new File(dir, filedir);
            if (checkFile.isDirectory()) {
                    try {
                            Integer.parseInt(filedir);
                            File srcFile = new File(checkFile, "stat");
                            File dstFile = new File("/home/waldekm/files/stat" + "." + Long.toString(counter++));
                            try {                                    
                                FileUtils.copyFile(srcFile, dstFile);
                            } catch (IOException e1) {}
                    } catch (NumberFormatException e) {
                            // not a number, do nothing
                    }                        
            }
    }
}

public static void readProc(final String src, final String dst) {
    FileInputStream in = null;
    FileOutputStream out = null;

    File srcFile = new File(src);
    File dstFile = new File(dst);

    try {
        in = new FileInputStream(srcFile);
        out = new FileOutputStream(dstFile);
        int c;
        while((c = in.read()) != -1) {
            out.write(c);
        }
    } catch (IOException e1) {
 }  finally {

        try {
            if (in != null) {
                in.close();
            }
        } catch (IOException e1) {}
        try {
            if (out != null) {
                out.close();
            }
        } catch (IOException e1) {}
    }
4

3 回答 3

2

原因很可能是操作系统将文件大小报告为零。

在我的机器上,man 2 stat这样说:

"对于目录下的大多数文件/proc,在字段stat()中不返回文件大小st_size;而是在字段中返回值 0。 "

stat系统调用将是 JVM 用来找出文件大小的方法。)

于 2011-08-16T12:43:04.830 回答
1

这是一段代码,它会使用 Android 的 Process 类中可用(但未直接记录)的方法从 proc 文件中读取特定字段。修改 FORMAT 缓冲区和输出缓冲区大小以从 proc 文件中读取更多/不同的值,

int PROC_SPACE_TERM = (int)' ';
int PROC_OUT_LONG = 0x2000

public static final int[] PROCESS_STATS_FORMAT = new int[] {
    PROC_SPACE_TERM,
    PROC_SPACE_TERM,
    PROC_SPACE_TERM,
    PROC_SPACE_TERM,
    PROC_SPACE_TERM,
    PROC_SPACE_TERM,
    PROC_SPACE_TERM,
    PROC_SPACE_TERM,
    PROC_SPACE_TERM,
    PROC_SPACE_TERM,
    PROC_SPACE_TERM,
    PROC_SPACE_TERM,
    PROC_SPACE_TERM,
    PROC_SPACE_TERM|PROC_OUT_LONG,                  // 13: utime
    PROC_SPACE_TERM|PROC_OUT_LONG                   // 14: stime
};

long buf[] = new long[2];

try {
    int pid = 1000; // Assume 1000 is a valid pid for a process. 
    Method mReadProcFile = 
              Process.class.getMethod("readProcFile", String.class,
                                      int[].class, String[].class,   
                                      long[].class, float[].class);
    mReadProcFile.invoke(null, "/proc/" + pid + "/stat", 
                         PROCESS_STATS_FORMAT, null, buf, null);

    return buf;

} catch(NoSuchMethodException e) {
    Log.e(TAG, "Error! Could not get access to JNI method - readProcFile");
} catch (InvocationTargetException e) {
Log.e(TAG, "Error! Could not invoke JNI method - readProcFile");
} catch (IllegalAccessException e) {
    Log.e(TAG, "Error! Illegal access while invoking JNI method - readProcFile");
}

return null;
于 2013-06-23T14:35:34.163 回答
-1

我看到您正在创建一个 FileInputStream 来读取 /proc 文件。相反,我建议您创建一个 FileReader 对象。FileInputStream 因 /proc 文件的文件长度不足而被绊倒,但 FileReader 没有。

于 2017-01-15T03:18:11.863 回答