FileDescriptor

399 阅读1分钟

首先讲下我为什么会学习到这个内容:在学习ContentResolver的时候发现MediaStore.Images.Media.DATA这个属性被弃用了。代替他的方法是ContentResolver.openFileDescriptor通过这个方法打开uri对应的内容,在做处理。更多内容

FileDescriptor不可以直接对文件进行操作,需要搭配上FileOutputStreamFileInputStream使用。

他还有另外一个作用,作为输出屏幕的输入和输出,比如我们的idea,我们想监听在黑框框输入啥,可以按照下面这样做:

public static void main(String[] args) {
    FileInputStream out = new FileInputStream(FileDescriptor.in);
    try {
        System.out.println("read():" + (char) out.read());
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
// idea会等待你在黑框框里面输入内容。
// 你输入完然后就会打印你刚才输入的内容

我们想打印一句话在黑框里可以这么做:

void testWrite() throws IOException {
    FileOutputStream out = new FileOutputStream(FileDescriptor.out);
    fout.write("Hello".getBytes());
    out.close();
    fout.close();
}
//idea下面的黑框框就会输出: Hello.

in,out,err:
上面已经通过实战给你演示了一下:

  • in: 标准输入(键盘)的描述符
  • out: 标准的输出(屏幕)的描述符
  • err: 标准错误输出(屏幕)的描述符

下面演示下如何使用FileDescriptor来对文件进行读写操作。

public class FileDEscriptorTest {
    private String fileName = "/testt.txt";
    private String outText = "hello yu";

    public static void main(String[] args) {
        FileDEscriptorTest fileDEscriptorTest = new FileDEscriptorTest();
        fileDEscriptorTest.testWrite();
        fileDEscriptorTest.testRead();
    }

    void testRead() throws IOException {
        FileInputStream fis = new FileInputStream(fileName);
        FileDescriptor fd = fis.getFD();
        FileInputStream fss = new FileInputStream(fd);
        System.out.println("in1.read():" + (char) fis.read());
        System.out.println("in2.read():" + (char) fss.read());
        fis.close();
        fss.close();
    }

    void testWrite() throws IOException {
        FileOutputStream fout = new FileOutputStream(fileName);
        FileDescriptor fd = fout.getFD();
        FileOutputStream out = new FileOutputStream(fd);
        fout.write("Hello".getBytes());
        out.write("World".getBytes());
        out.close();
        fout.close();
    }
}

这还有个ParcelFileDescriptor的讲解,底层还是和FileDescriptor一样。:blog.csdn.net/weixin_3042…


Android拷贝图片

private fun readFileContent(fileDescriptor: FileDescriptor?): File? {
    var targetFile = File(cacheDir.absolutePath + "/other.jpg")
    if (fileDescriptor == null) {
        return null
    }
    var fileInputStream: FileInputStream? = null
    try {
        fileInputStream = FileInputStream(fileDescriptor)
    } catch (e: Exception) {
        e.printStackTrace()
        return null
    }
    var fileOutputStream = FileOutputStream(targetFile)
    val bytes = ByteArray(1024)
    var by: Int
    try {
        while (fileInputStream.read(bytes).also { by = it } != -1) {
            fileOutputStream.write(bytes, 0, by)
        }
    } catch (e: Exception) {
    } finally {
        fileOutputStream.close()
        fileInputStream.close()
    }
    return targetFile
}