JAVA之IO
IO的分类
IO是一种以内存
为视角,对文件的读取和写入。Output
和Write
是内存对文件的写入,Input
和Reader
是内存对文件的读取。
根据对文件写入读取的最小执行单位,把IO分为两类:字节流、字符流
。
字节流IO:表示内存对文件的写入和读取的最小的执行单位为字节Byte
,以OutputStream、InputStream
为基类。
字符流IO:表示内存对文件的写入和读取最小的执行单雯为字符Char
,以Writer、Reader
为基类
File类通过文件所在的路径或uri表示要操作的文件。看看File常用的构造函数
// 文件路径
public File(String pathname)
// 路径和文件名
public File(String parent, String child)
// 文件所在uri
public File(URI uri)
字节流
字节流以Byte
来进行文件的写入和读取。以InputStream和OutputStream为基类,其中以FileInputStream和FileOutputStream为字节流IO的代表。
FileOutputStream
以byte为最小单位对文件进行写入。以下是FileOutputStream常用的write()写入方法和构造函数:
// 以byte数组进行文件写入
public void write(byte b[]) throws IOException {
// Android-changed: Write methods delegate to write(byte[],int,int) to share Android logic.
write(b, 0, b.length);
}
// 只写入一个字节
public void write(int b) throws IOException {
// Android-changed: Write methods delegate to write(byte[],int,int) to share Android logic.
write(new byte[] { (byte) b }, 0, 1);
}
// 写入len长度的字节数组
public void write(byte b[], int off, int len) throws IOException {
// 文件路径
public FileOutputStream(String name) throws FileNotFoundException {
// 文件
public FileOutputStream(File file) throws FileNotFoundException {
FileInputStream
以byte
为最小单位,对文件进行读取。一下是读取方法read()和构造方法。
// 从文件读入一个字节,如果没有内容返回-1
public int read() throws IOException {
// Android-changed: Read methods delegate to read(byte[], int, int) to share Android logic.
byte[] b = new byte[1];
return (read(b, 0, 1) != -1) ? b[0] & 0xff : -1;
}
// 从文件读入字节数组为单位,如果没有内容返回-1
public int read(byte b[]) throws IOException {
// Android-changed: Read methods delegate to read(byte[], int, int) to share Android logic.
return read(b, 0, b.length);
}
// 从文件读取len长度的字节到数组
public int read(byte b[], int off, int len) throws IOException {
// 文件路径
public FileInputStream(String name) throws FileNotFoundException {
//文件
public FileInputStream(File file) throws FileNotFoundException {
字节流案例
案例:跟图片的路径,用字节流复制一张相同的图片,并展示出来。
/**
* 复制图片(到外部私有存储)
* path: 图片的真实路径
*/
private fun copyImage(imgPath: String?) {
try {
// FileInputStream
val file = File(imgPath)
val inputStream = FileInputStream(file)
// FileOutputStream
val outputFile = File(getExternalFilesDir("hello"), "li.jpg")
val outputStream = FileOutputStream(outputFile)
// 复制
val byteArray = ByteArray(8 * 1024)
while ((inputStream.read(byteArray)) != -1) {
outputStream.write(byteArray)
}
inputStream.close()
outputStream.close()
val file2 = File(getExternalFilesDir("hello"), "li.jpg")
val fileInputStream = FileInputStream(file2)
val bitmap = BitmapFactory.decodeStream(fileInputStream)
imgView?.setImageBitmap(bitmap)
} catch (e: IOException) {
e.printStackTrace()
}
}
字节流全部类
字节流ObjectOutpueStream、ObjectInputStream:序列化和反序列化的类
BufferedOutputStream、BufferedInputStream:内存缓存一定数据后才写入文件,减少对硬盘的读写操作次数。
字符流
字符流以Char
来进行文件的写入的读取。以Writer和Reader为基础,其中以FileWriter和FileReader为字符流IO的代表。
FileWriter
以char为最小单位对文件进行写入。这样就可以适配英语以外的如中文的适配。以下是FileWriter常用的write()写入方法和构造函数。
// 以字符数组写入
public void write(char cbuf[])
abstract public void write(char cbuf[], int off, int len)
// 以字符串写入
public void write(String str)
public void write(String str, int off, int len)
public void write(int c)
public FileWriter(String fileName)
public FileWriter(File file)
FileReader
以char为最小单位对文件进行读取,以下是FileReader常用的read()方法和构造函数。
// 读取一个字符,没有内容返回-1
public int read() throws IOException {
char cb[] = new char[1];
if (read(cb, 0, 1) == -1)
return -1;
else
return cb[0];
}
// 读取一个字符数组,没有内容返回-1
public int read(char cbuf[]) throws IOException {
return read(cbuf, 0, cbuf.length);
}
// 读取len长度到字符数组,没有内容返回-1
abstract public int read(char cbuf[], int off, int len) throws IOException;
public FileReader(String fileName) throws FileNotFoundException {
public FileReader(File file) throws FileNotFoundException {
字符流案例
案例: 用字符流复制一个图片的文件
private fun copyImageByChar(imgPath: String?) {
try {
val fileReader = FileReader(imgPath)
// FileWriter
val file = File(cacheDir, "char.txt")
val fileWriter = FileWriter(file)
// 复制
val charArray = CharArray(8 * 1024)
var size = fileReader.read(charArray)
while (size >= 0) {
fileWriter.write(charArray)
size = fileReader.read(charArray)
}
fileReader.close()
fileWriter.close()
} catch (e: IOException) {
e.printStackTrace()
}
}