I-就是从硬盘到内存
O-就是从内存到硬盘
操作IO需要有异常信息处理
File的API可以直接访问底层文件系统。以下为基本用法
实例化一个File对象,可以是一个文件也可以是一个目录
File file = new File(filePath);
File file = new File(fileDir, fileName);
检测文件是否存在
boolean fileExist = file.exists();
文件长度
long length = file.length();
重命名或移动文件
boolean success = file.renameTo(new File(anotherPath));
删除文件
boolean success = file.delete();
检测文件是否为目录
boolean isDirectory = file.isDirectory();
读取文件中的文件列表
File[] files = file.listFiles();
String[] files = file.list();
文件分隔符
File.separator
InputStream是最基本的输入流,读取基于字节的数据,一次读取一个字节。
InputStream is = new FileInputStream(file);
is.read();//读取一个字节
is.read(bytes);//读取一定量的字节,存储在缓冲区byte数组中
is.read(bytes, off, len);
is.available();//字节数
is.close();
OutputStream os = new FileOutputStream(file);
os.write(bytes);
os.write(bytes, off, len);
os.write(byte);
os.flush();//刷新输出流并强制写出所有缓冲的输出字节
os.close();
InputStreamReader是字节输入流转换成字符输入流的桥梁。
InputStreamReader isr = new InputStreamReader(is);
常用构造方法
InputStreamReader(InputStream in)
创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, Charset cs)
创建使用给定字符集的 InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec)
创建使用给定字符集解码器的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
OutputStreamWriter 是字节输出流转换成字符输出流的桥梁。
OutputStreamWriter osr = new OutStreamputWriter(os);
常用构造方法
OutputStreamWriter(OutputStream out)
创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs)
创建使用给定字符集的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
创建使用给定字符集编码器的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName)
创建使用指定字符集的 OutputStreamWriter。
BufferedReader能为字符输入流提供缓冲区,可以提高许多IO处理的速度。可以一次读取一大块的数据,而不需要每次从网络或者磁盘中一次读取一个字节。特别是在访问大量磁盘数据时,缓冲通常会让IO快上许多。
BufferedReader br = new BufferedReader(isr);
String lineString = br.readLine();
br.flush();
br.close();
BufferedWriter可以为输出流提供缓冲区。可以构造一个使用默认大小缓冲区。
BufferWriter bw = new BufferWriter(osr);
bw.write(string);
bw.close()
字节流读取文件
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
字符流读取文件
BufferReader br = new BufferedReader(new InputStreamRreader(fis));
String line = “”;
while((line = br.readLine()) != null){
}
br.flush();
br.close();
字节流写文件
FileOutputStream fos = new FileOutputStream(file);//覆盖文件的内容
FileOutputStream fos = new FileoutputStream(file, true);//拼接到文件内容后面
fos.write(buffer);
fos.close();
字符流写文件
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(fos));
bw.write(string);
bw.close();
压缩
FileInputStream fis = new FileInputStream(file);
String zipPath = file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("."))
+ ".zip";
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipPath));
zos.putNextEntry(new ZipEntry(file.getName()));
int len = 0;
byte[] buff = newbyte[10240];
while ((len = fis.read(buff)) != -1) {
zos.write(buff, 0, len);
zos.flush();
}
zos.finish();
zos.close();
fis.close();
解压
String filePath = file.getAbsolutePath().substring(0,
file.getAbsolutePath().lastIndexOf("."));
ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
ZipEntry zipEntry = null;
while ((zipEntry = zis.getNextEntry()) != null) {
if (!zipEntry.isDirectory()) {
File f = new File(filePath + "\\" + zipEntry.getName());
f.getParentFile().mkdirs();
FileOutputStream fos = new FileOutputStream(f);
int len = 0;
byte[] buff = newbyte[10240];
while ((len = zis.read(buff, 0, len)) != 0) {
fos.write(buff, 0, len);
fos.flush();
}
fos.close();
}
}
zis.closeEntry();
zis.close();
允许来回读写文件,也可以替换文件中的某些部分。
RandomAccessFile file = new RandomAccessFile(filePah, “rw”);
第二个参数”rw”表示以读写的方式打开文件。
在RandomAccessFile的某个位置读写之前,必须把文件指针指向改位置,通过seek()
File.seek(200);
long pointer = file.getFilePointer();
int aByte = file.read();
read()方法返回当前RandomAccessFile实例的文件指针指向的位置中包含的字节内容。read()方法在读取完一个字节之后,会自动把指针移动到下一个可读字节。这意味着使用者在调用完read()方法之后不需要手动移动文件指针
file.write("Hello World".getBytes());
与read()方法类似,write()方法在调用结束之后自动移动文件指针,所以你不需要频繁地把指针移动到下一个将要写入数据的位置。