首先讲下我为什么会学习到这个内容:在学习ContentResolver的时候发现MediaStore.Images.Media.DATA这个属性被弃用了。代替他的方法是ContentResolver.openFileDescriptor通过这个方法打开uri对应的内容,在做处理。更多内容
FileDescriptor不可以直接对文件进行操作,需要搭配上FileOutputStream和FileInputStream使用。
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
}