Java I/O
程序的输入、输出操作
站在程序的角度,读数据进来叫输入,往外写东西叫输出
文件
相关记录或放在一起的数据的集合
JAVA API :java.io.File 类
File 物理文件或目录
创建文件对象和常用方法
//创建文件对象(文件或文件夹) 路径字符串作为参数
File file = new File("a.txt");
//如果文件不存在 创建文件
if (!file.exists()) {//判断文件或目录是否存在
try {
//创建空文件 不会创建文件夹
file.createNewFile();//出现必须要处理的异常
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(file.isFile());//判断是否是文件
System.out.println(file.isDirectory());//判断是否是目录
System.out.println("长度是:"+file.length());//文件的长度
System.out.println("名称是:"+file.getName());//文件或目录的名称
System.out.println("相对路径是:"+file.getPath());//相对路径
System.out.println("绝对路径是:"+file.getAbsolutePath());//绝对路径
//file.delete();//删除文件
//canRead canWrite canExecute 可读可写 可执行
System.out.println(file.canExecute());
System.out.println(file.canRead());
System.out.println(file.canWrite());
创建文件夹和文件夹下的文件
单独创建文件夹
//单独创建文件夹 在src文件夹下创建名称为1的文件夹
File file1=new File("src/1");
file1.mkdir();
System.out.println("文件夹的名称是:"+file1.getName());
//getName()获取的是路径下的最后一个文件夹的名称
同时创建文件夹和文件
//创建文件夹和文件 test hello都不存在
File file = new File("test/hello/a.txt");
File f=file.getParentFile();//创建a.txt的上一级文件对象
f.mkdirs();//递归创建文件夹
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
如果不创建上一级文件对象,直接递归创建文件夹,那么最后一级的文件也会创建文件夹
File file = new File("test/hello/a.txt");
file.mkdirs();//最后会创建一个
renameTo();:移动重命名
//创建文件夹和文件 test hello都不存在
File file = new File("test/hello/a.txt");
File f=file.getParentFile();//创建a.txt的上一级文件对象
f.mkdirs();//递归创建文件夹
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//b.txt文件不存在
File file2=new File("b.txt");
file.renameTo(file2);
test/hello文件夹下的文件a.txt重命名为b.txt,同时移动了路径
前提是a.txt文件必须存在 移动的目标路径必须存在 同时是同一平台操作
具体用法参考链接
https://blog.youkuaiyun.com/u010648555/article/details/78356040
流
通过流来读写文件
流是一组有序的数据序列
以先进先出方式发送信息的通道
输入/输出流与数据源
流的分类
输入输出流是相对于计算机内存来说的
字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流
FileInputStream
InputStream 抽象类 父类 字节输入流
int read() 从输入流一个字节一个字节的读 返回字节对应的整数表示形式 比如a 对应97 如果到了输入流的末尾,返回-1
int read(byte[] b) 从输入流读若干个字节,把这些字节保存到数组b中,返回的是读取到的字节数(多少个字节)且将读取到的字节存储到b中,如果到了输入流的末尾,返回-1
int read(byte[] b ,int off, int len) 从输入流读若干个字节,把这些字节保存到数组b中,off指的是字节数组中开始保存数据的起始下标,len指的是读的字节数目,返回的是读取到的字节数(多少个字节),且保存在数组b中,如果到了输入流的末尾,返回-1
int available(); 可以从输入流读取字节数目;
FileInputStream(File file)
FileInputStream(String name) 路径做参数
借助read()方法读
FileInputStream fis=null;
//读a.txt文件中的内容
//输入流 路径做参数
try {
fis=new FileInputStream("a.txt");
System.out.println("可以读到的字节数是:"+fis.available());
//借助输入流的方法读文件 read
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);//data返回的是整数形式 转换成char形式
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
fis.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
借助read(byte[] b)
FileInputStream fis=null;
//读a.txt文件中的内容
//输入流 路径做参数
try {
fis=new FileInputStream("a.txt");
System.out.println("可以读到的字节数是:"+fis.available());
//借助数组的方式 创建数组 数组长度就是可读到的字节数
byte[] b=new byte[fis.available()];
fis.read(b);//从输入流读若干个字节,把这些字节保存到数组b中
//保存的是字节的整数形式
//转换成字符串
String s=new String(b);//创建字符串对象 可以用byte数组做参数
System.out.println(s);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
fis.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
演示int read(byte[] b ,int off,int len)
流是顺序的, 先进先出的队列
你想要读取到某一段流,就必须先把前面的流读取完毕后,才能读后面的
f.txt中是123456789 我只想读89
FileInputStream fis=new FileInputStream("f.txt");
byte[] b= new byte[fis.available()];
// fis.read(b);
fis.read(b,0,7);//保存到b数组 1234567
//这里的0 是b数组的下标起始位置 7是read的数目
// System.out.println(new String(b));
//文件其实只剩下89
b=new byte[fis.available()];//再重新初始化
fis.read(b,0,2);//保存到b数组是89
System.out.println(new String(b));
FileInputStream fis =new FileInputStream("f.txt");
byte[] b=new byte[fis.available()];
fis.read(b,0,7);
System.out.println(new String(b));
fis.read(b,7,1);//读一个出来8 在下标7的位置
System.out.println(new String(b));
FileInputStream fis =new FileInputStream("f.txt");
byte[] b=new byte[fis.available()];
fis.read(b,0,7);
System.out.println(new String(b));//b数组里是1234567
fis.read(b,0,1);//读一个出来8 然后去置换下标位置为0的1
System.out.println(new String(b));
FileInputStream fis=null;
//读a.txt文件中的内容
//输入流 路径做参数
try {
fis=new FileInputStream("a.txt");
System.out.println("可以读到的字节数是:"+fis.available());
//借助数组的方式 创建数组 数组长度就是可读到的字节数
byte[] b=new byte[4];
int tem;
//这里的理解是重点
while((tem=fis.read(b))!=-1){//fis.read(b)每次返回的是实际读取的个数 不超过b的长度的最大值
System.out.println(new String(b,0,tem));
}
// fis.read(b);//
// fis.read(b,0,6);//从输入流读若干个字节,把这些字节保存到数组b中
// fis.read(b,6,2);
//保存的是字节的整数形式
//转换成字符串
// String s=new String(b);//创建字符串对象 可以用byte数组做参数
// System.out.println(s);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
fis.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream
OutputStream类 抽象类 父类 字节输出流
方法与FileInputStream相似
flush():强制将缓冲区清空
new FileOutputStream(String path,boolean append):可以追加覆盖或追加文件
FileOutputStream fos=new FileOutputStream("b.txt");
//FileOutputStream fos=new FileOutputStream("b.txt",true);//追加
String s="firendship is precious";
byte[] b=s.getBytes();//将字符串打散为字节数组
// fos.write(b,0,b.length);//从0下标开始 长度为b.length
fos.write(b);//以数组的方式往里面写
fos.close();
//边读边写
FileInputStream fis=new FileInputStream("f.txt");
FileOutputStream fos=new FileOutputStream("a.txt");
int tmp;
while ((tmp = fis.read()) != -1) {
fos.write((char)tmp);
}
//全部读进去再写出来
FileInputStream fis=new FileInputStream("D:/IOTest/picture.jpg");
FileOutputStream fos=new FileOutputStream("picture.jpg");
byte[] b=new byte[fis.available()];
fis.read(b);//保存到b数组中
fos.write(b);//将b数组写出来
创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件