0

私のアプリケーション (DataSync) は、ルートのみがアクセスできるファイルを読み書きする必要があるため、シェルを使用してこれらのファイルを操作することに制限されています。現在、アクセスしたいファイルをキャッシュ ディレクトリにコピーしています。その後、Java コードからキャッシュ ファイルへの入力ストリームまたは出力ストリームを作成できます。ファイルの書き込みも同じように行われます (ただし、その逆です)。

このファイルのキャッシュには比較的時間がかかるため、キャッシュ ディレクトリを必要とせずにこれらのファイルを直接読み書きしたいと考えています。私は基本的に、プロセスの入力ストリームと出力ストリームを使用して、次のようにファイルの読み取りまたは書き込みを試みています。

Process p = Runtime.getRuntime().exec("su");
OutputStream out = p.getOutputStream();
InputStream in   = p.getInputStream();

// Write open file command to outputstream

// Read file contents from inputStream

out.close();
in.close();

プロセスからファイルを開き、それを stdout に送信して、Java アプリケーションがそのファイルを読み取れるようにする必要があります (同様の書き込みも可能です)。しかし、私は Linux にあまり詳しくないので、どこから始めればよいかわかりません。誰かが私を正しい方向に向けることができますか?

ありがとう、クイント。

4

1 に答える 1

2

私は自分の質問に答えるだけです。現時点で私がやっている方法は次のとおりです。

public static InputStream getInputStream(File file) throws IOException
{
    try
    {
        return new FileInputStream(file);
    }
    catch(Exception e)
    {
        Process p = Runtime.getRuntime().exec("su");
        DataOutputStream outputS = new DataOutputStream(p.getOutputStream());

        outputS.writeBytes("cat \"" + file.getPath() + "\"\n");

        outputS.writeBytes("exit\n");
        outputS.flush();
        outputS.close();

        return p.getInputStream();
    }
}

そして、OutputStream の場合:

public static OutputStream getOutputStream(File file) throws IOException
{
    Process p = Runtime.getRuntime().exec("su");
    DataOutputStream outputS = new DataOutputStream(p.getOutputStream());

    outputS.writeBytes("mkdir -p \"" + file.getParent() + "\"\n");
    outputS.writeBytes("cat - > \"" + file.getPath() + "\"\n");

    return (OutputStream) outputS;
}
于 2013-01-28T22:10:29.970 に答える