学习IO的时候,发现IO的方法很多,各种类也很复杂,这里做个小整理吧,一点点来理解IO
java的集合框架存在与java.util包中
IO框架: 类和接口存在于java.io
File 类
File类介绍和路径分隔符:
File类是IO包中唯一表示
磁盘文件和磁盘目录
的对象的路径。
该类包含了创建、删除、重命名文件、判断文件读写权限以及文件是否存在、查询等功能方法。
只能设置和获取文件本身的信息(就是文件的属性),不能设置和获取文件的内容。
Java做开发:一次编写,多处运行(强调的是Java的跨平台型)。
-----------------------------------------------------------------------------------
大小写问题:
Unix:严格区分大小写。
Windows:默认情况下是
不区分大小写的。
路径分隔符,属性分隔符:
Unix:使用"/"来
分割目录路径
;使用":"来
分割属性。
Windows:使用"\"来分割目录路径。但是在Java中一个"\"表示转义,在Windows平台的Java代码中表示一个路径,就得使用两个\\,但是Windows支持/;使用";"来分割属性。
因为不确定运行的系统平台,所以不确定如何编写分隔符。因此在File类中提供了两类常量,分别来表示路径分割符和属性分割符。
获取属性分割符:File.pathSeparator(返回一个String)或File.pathSeparatorChar(返回一个Char)
获取路径分割符:File.Separator(返回一个String)或File.SeparatorChar(返回一个Char)
例:
String path1 = "c:\\will\\123.txt";
String path2 = "c:/will/123.txt"; //推荐
String path3 = "c:" + File.Separator + "will" + File.Separator + "123.txt";
File类中方法-文件操作
boolean isFile():是否是文件
boolean createNewFile():创建新的文件
static File createTempFile(String prefix , String suffix):创建临时文件
boolean delete():删除文件
void deleteOnExit():在JVM停止时删除文件
boolean exists():判断文件是否存在
boolean renameTo(File dest):重新修改名称
操作File路径和名称:
File getAbsoluteFile():获取绝对路径
String getAbsolutePath():获取绝对路径
String getPath():获取文件路径
String getName():获取文件名称
File getParentFile():获取上级目录文件
String getParent():获取上级目录路径
---------------------------------------------------------------------------------------------------
private static void listAllFile(File f) {
System.out.println(f);
File[] fs =f.listFiles();
//打印一级文件
for(File file : fs){
System.out.println(file);
//如果是文件夹,则使用递归
if(file.isDirectory()){
listAllFile(file);
}else {
//如果是子文件,则打印文件(递归的出口)
System.out.println(file);
}
}
}
【IO概述】
IO(Input/Output):输入和输出。
IO设备:和电脑通信的设备。
输入设备:麦克风、扫描器、键盘、鼠标等。
输出设备:显示器、打印机、投影仪、耳机、音响等。
为什么程序需要IO呢?
存储游戏数据(XXX-888分)、查看游戏英雄榜、上传和下载操作
IO操作是一个相对的过程,一般我们在程序的角度来考虑。
程序需要数据:把数据流入到程序中:输入。
程序需要保存数据,把数据传递给别人:输出。
输入模式:文件/网络/压缩包/其他数据源→数据流→Java程序
输出模式:Java程序→数据流→文件/网络/压缩包/其他数据源
----------------------------------------------------------------------------
IO流的分类:
①根据流向划分:输入流和输出流
②根据数据单位划分:字节流和字符流
③根据功能划分:节点流和包装流
四大基流:
字节输出流(OutputStream)、字节输入流(InputStream)、字符输出流(Write)、字符输入流(Reader);
四大基流都是抽象类,其他流都是继承于这四大基流的;
所以不能创建四大基流的对象,只能创建其
子类对象
;
无论是什么流,都有
close方法,用来关闭资源
。
(如果操作文件,就得开通一个流对象关联我们的磁盘文件,如果不关闭资源,那么磁盘的文件一直被程序所引用着,不能删除,也不能更改。)
操作IO流的模板:
①创建源或者目标对象
(
挖井
)。
例:输入操作→把文件中的数据流向到程序中,此时文件是源,程序是目标。
例:输出操作→把程序中的数据流向到文件中,此时文件是目标,程序是源。
②创建IO流对象
(
水管
)。
例:输入操作→创建输入流对象。
例:输出操作→创建输出流对象。
③具体的IO操作。
例:输入操作→输入流对象的read方法。
例:输出操作→输出流对象的write方法。
④关闭资源
(
勿忘
)。
例:输入操作→输入流对象.close();
例:输出操作→输入流对象.close();
操作IO流的六字真言:
读进来(进来强调了是输入,读说明是read方法)
写出去(出去强调了是输出,写说明是write方法)
【文件流概述】
文件流:程序和文件打交道(此处的文件指的是纯文本文件,如:txt,不要使用word、excel)。
FileInputStream:文件的字节输入流
FileOnputStream:文件的字节输出流
FileReader:文件的字符输入流
FileWrite:文件的字符节输出流
-------------------------------------------------------------------
【文件字节输出流】
1.创建目标对象(表示把数据保存到哪一个文件)
例:
File targe = new File("file/stream.txt");
2.创建文件字节输出流对象(水管)
例:
OutputStream out = new FileOutputStream(target, ture); //true表示需要追加文件内容
3.具体的输出操作(往外写操作)
void write(int b):把一个字节写出到文件中
void write(byte[ ] b):把数组b中所有的字节都写出到文件中去
void write(byte[ ] b, int off, int len):把数组b中的从off索引开始的len个字节写出到文件中去(推荐使用)
例:
out.write(65); //写出A
out.write("ABCDE".getBytes()); //getBytes()方法可以将字符串转成Byte数组
out.write("WillLucyLily".getBytes(), 5, "WillLucyLily".length()); //length()方法可以获取字符串的长度
4.关闭资源对象
例:
out.close();
【文件字节输入流】
1.创建源(挖井)
例:
File f = new File("file/stream.txt");
2.创建文件字节输入流对象,并接在源上
例:
InputStream in = new FileInputStream(f);
3.具体的读取操作
int read():读取一个字节,返回读取的字节;如果读取到最后没有数据的时候,返回-1;
int read(byte[ ] b):读取多个字节,并存储到数组b中,从数组b的索引为0的位置开始存,返回读取了几个字节;(推荐使用)
int read(byte[ ] b, int off, int len):读取多个字节,并存储到数组b中,从数组b的索引位置开始存储;
例:
int data = in.read(); //获取stream.txt文件中的第一个字节A→65
byte[ ] buffer = new byte[5]; //此时buffer最多只能存储5个字节
System.out.println(Arrays.toString(buffer)); //将数组buffer打印出来
String str = new String(buffer, 0, 7); //将buffer数组从索引为0的位置,取7个元素,存入到str数组中。
4.关闭资源对象
例:
in.close();
【文件的拷贝操作
】
文件的拷贝操作实际上就是输入操作和输出操作的结合
public class StreamCopyDemo {
public static void main(String[] args) throws IOException{
//1.创建源
File srcfile = new File("file/stream.txt");
File desfile = new File("target/tr.txt");
//2.创建流管道
InputStream fis = new FileInputStream(srcfile);
OutputStream fos = new FileOutputStream(desfile);
//3.读取操作
int len = -1 ;//表示已经读取了多少个数据,-1表示文件已经读取到了最后
byte[] buffer = new byte[1024];//创建容量为1024的缓冲区(存储已经读取的数据)
while( (len = fis.read(buffer))!=-1){
fos.write(buffer, 0, len);//将缓冲区中的数据通过输出流写到目标文件
}
//4.关闭资源
fis.close();
fos.close();
}
}