JAVA学习九:IO

IO
1.java.io.file
file是文件和目录路径名的抽象表示。
file对象就是表示某个文件,并提供了很多方法来操作这个文件。

file对象表示一个文件,但是这个文件不一定存在,这时可使用
createNewFile()来创建新文件,当且仅当此文件不存在时才创建。

构造方法:
File(String pathname) 指创建一个路径为pathname的file对象。
File(File parent,String child) 传入一个文件夹,再在内部创建一个文件。
File(String parent,String child) 传入一个文件夹名称,再在内部创建文件。

方法:
file.creatNewFlie() 当文件不存在时创建新文件
file.mkdir() 当文件夹不存在时创建文件夹
file.getAbsolutePath() 获取文件路径地址的字符串
file.getName() 获取文件名称的字符串
file.getParent() 获取父文件夹的名称
file.length() 获取文件的大小,字节单位
file.exists() 判断文件是否存在,返还布尔
file.isFile() 判断是否是文件
file.listFiles() 获取文件夹中的所有文件对象,返还File[]
file.list() 获取文件夹中的所有文件字符串描述,返还String[]
file.mkdirs() 创建一层文件夹,如”c://ha/ha/ha”可以创建所有文件夹。
file.renameTo(File dest) 重命名,实现是复制一个文件,重新命名,可以实现把文件从原来位置转移到新的路径。

系统分隔符:
由于java跨平台的特性,不同平台的路径和名称分隔符不同可能导致程序无法正确执行,因此编译时需要使用到分隔符的,统一使用系统提供的属性。

路径分隔符—File.pathSeparator所有需要使用”;”的地方,改用路径分隔符
名称分隔符—File.separator所有需要使用”\”的地方,改用名称分隔符

2.文件遍历案例
先导入文件夹,遍历文件夹下的所有文件,然后判断文件后缀或者大小,如果是文件夹则递归调用自己,再判断文件夹底下的文件。。。
Public static void listFiles(File[] files){
if(files != null && files.length>0){
for(File file:files){
//文件
if(file.isFile()){
if(file.getName().endsWith(“avi”)){
//找到了一个avi文件
if(file.length()?10010241024)//100M
System.out.println(“找到了一个avi文件:且大小大于200M”);
}
}else{
//文件夹
File[] files2 = file.listFiles();//获取文件夹下所有文件
listFiles(files2);//递归调用自己
}
}
}
}

3.文件过滤器(了解)
当需要过滤文件时,只需要先建立一个过滤器的对象FileFilter(这个是接口,需要实现后才能使用),然后在内部写自己的规则。就可以实现过滤了。

4.相对路径和绝对路径
绝对路径:从盘符开始,是一个完整的路径,例如:C//a.txt

绝对路径:在Java代码中是相对于项目目录路径,这是一个不完整的便捷路径,在Java开发中很常用:例如:a.txt — 即在项目所在文件夹下的a.txt。

5.流概述
IO流概述:
使用电脑拷贝文件,或者从网上下载文件,都是数据在传输,
可以将这种数据传输的操作,看做一种数据的流动,按照流动的方向分为,
输入Input和输出Output。

Java中的IO操作主要指的是java.io包下的一些常用类的使用,通过这些常用类对数据进行读取(输入流)和写出(输出流)。

IO流的分类
按照流动方向分,可以分为:输入流和输出流
按照流动的数据类型来分:字节流,字符流

字节流:

  • 输入流:顶级父类 InputStream
  • 输出流: OutputStream

字符流:

  • 输入流: Reader
  • 输出流: Writer

6.字节流
一切皆字节:计算机中的任何数据(文本、图片、视频)都是以二进制的形式存储的。
在数据传输时也都是以二进制的形式存储的。
后续学习的任何流,在传输时底层都是二进制。
OutputStream:
此抽象类是表示输出字节流的所有类的超类。

方法:
close();关闭此输出流并释放系统资源
flush();刷新输出流并强制写出缓冲区的数据。

write(byte[] b);写出一个字节数组的所有内容。
write(byte[] b,int a,int b);写出从a下标开始,共b个的字节数据。
wirte(int a);传的是int,当做字节来用。最大值255

最常用子类:FileOutputStream
每一个对象就表示向某个文件输出的流管道,就可以通过这个对象向某个文件输出。
构造方法:
1.传入一个文件对象建立一个这个文件的输出流
FileOutputStream(File file)
FileOutputStream(File file,boolean append)

2.传入文件路径来描述
FileOutputStream(String name)
FileOutputStream(String name,boolean append)

append表示文件原有内容情况下,接着往后写或者清空内容重写。
true表示接着往后写,false或者不传append表示清空重写。
只有流对象创建之初生效,后续写内容都是写在一个文件中。

InputStream
方法:
int * = read(); 读取下一个字节数据,范围0-255,如果没数据了返回-1
int * = read(byte[] b); 将文件中的内容读取到参数的字节数组中,返回的是数组长度。

常见子类:FileInputStream
构造方法:
FileInputStream(File file); 传入文件对象建立文件输入流
FileInputStream(String name); 传入文件路径建立输入流

方法:
close
read()
read(byte[] b)

FileInputStream fis = new FileInputStream(“c://a.txt”);
while(true){
byte b = (byte)fis.read();
if(b == -1){
break;
}
System.out.print(b);
}
fis.close;

使用while循环打印文件内容,文件末尾没数据后返回-1,打破循环。

byte[] bytes = new byte[10];
fis.read(bytes);
System.out.print(new String(bytes));
fis.read(bytes);
System.out.print(new String(bytes));

当最后一次读取数据不够数组长度时,不会将之前读取的数据后半段消除。
因此可以使用返回值:
int len = fis.read(bytes);
System.out.print(new String(bytes,0,len));
只打印从0下标到返回值长度的len下标。

当我们从网上下载文件时不确定何时结束。可以使用返回值-1的特性。
读取到文件末尾没数据后,返回值是-1.

平时使用第二种读取数组的方式输入流。
其他子类跟FileInputStream差不多。

7.文件加密和解密

String fileName = “a.txt”;
File oldFile = new File(fileName);
//原文件: a.txt
File newFile = new File(oldFile.getParentFile(),”mi-”+oldFile.getName());
//加密存储的新文件: mi-a.txt

FileInputStream fis = new FileInputStream(oldFile);
FileOutputStream fos = new FileOutputStream(newFile);

while(true){
int b = fis.read();
//核心:任何数据^相同的数字两次 结果就是其本身
if(b == -1){
break;
}
fos.write(b^10);
}
System.out.print(“加密或解密已完成”);

8.字符编码
UTF-8:
可变长度字符编码
任何乱码原因:数据的输入方和接收方使用的编码不同。

9.字节流读取文字
想要直接读取硬盘中文字类型的文件,如果直接使用read方法读取会导致乱码,这是由于编译器与文本的编码不一致导致的问题。
但是在项目中新创建文字文本可以读取文件,这是因为编译器默认使用UTF-8编码。

由于无法确定一段数据最后一个字符为几个字节,所以经常可能出现只读取一般字节的字符,导致乱码。所以只能一次性读取完。

10.字符的输出流
Writer
writer(int c)
writer(String s)

我们使用子类的FileWriter
构造器方法:
FileWriter(File file)
FileWriter(String fileName) //非追加模式

FileWriter(String fileName,boolean append) //追加模式,append为true

代码:
FileWriter fw = new FileWriter(c://b.txt);
fw.write(“锄禾日当午”);
fw.append(“汗滴禾下土”);//跟write一样,都是在文件内继续写。
//但是此方法会返回输出流对象。
fw.close;

11.字符的输入流
Reader
方法
read();
read(char[] chars);

使用的子类
FileReader

FileReader fr = new FileReader(“b.txt”);
while(true){
int c = fr.read();
if(c == -1)
break;
System.out…;
}
fr.close();
//一次读取一个字符

FileReader fr = new FileReader(“b.txt”);
char[] chars = new char[100];
//字符数组有默认值,是空格,转为int就是0。
fr.read(chars);
//此时并未考虑文件是否有100个字符。这时获取到的字符串后面全是空格。
String text = new String(chars);
System.out.print(text);

所以可以跟之前一样使用返回值
int len = fr.read(chars);
String text = new String(chars,0,len);

12.flush刷新管道
当IO流进行输入/输出时,使用数组获取数据,当未获取全部数组时,
缓存区是不会读取数据的。
如果不使用.close();方法关闭数据,那么所有数据仍在内存中缓存,还没有到文件中。close方法会自动刷新数据,跟flush一样,也是可以将数据写入文件中。

13.字节转换字符流
更精准的描述不是转换。而是将字节流转换为字符流: 使用了装饰者设计模式。

FileInputStream fis = new FileInputStream(c://a.txt);
//将字节输入流转换为字符输入流
InputStreamReader isr = new InputStreamReader(fis,”gbk”);
//参数1.要转换的字节流
//参数2.指定编码名称
while(true){
int c = isr.reader();
if(c == -1)
break;
System.out.print((char)c);
}

14.打印流与缓存读取流
//字符输出(打印流)

PrintStream ps = new PrintStream(“c://c.txt”);
ps.println(“锄禾让我”);
//可以向文件中输出字符
PrintWriter pw = new PrintWriter(“c://c.txt”);
pw.println();
pw.flush();
//PS和PW功能差不多,区别在PW字符输入流需要刷新管道。

//缓存读取流:将字符输入流 转换为带有缓存 可以一次读取一行的字符读取流

FileReader fr = new FileReader();
BufferedReader br = new BufferedReader();
String text = br.readLine();
//读取一行字符,读到文件末尾返回null

15.收集异常日志
try{
String s = null;
s.toString();
}catch(Exception e){
e.printStackTrace();
}//此时发生错误后只会将错误输出到控制台。

try{
String s = null;
s.toString();
}catch(Exception e){
PrintWriter pw = new PrintWriter(“c://bug.txt”);
//创建字符输出流
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm”);
//创建日期格式—精确到分
pw.println(sdf.format(new Date));
//将当前日期的format格式输出到bug.txt文件中
e.printStackTrace(pw);//将错误信息输出到pw输出流,输出到文件。
pw.close();
16.properties
既属于IO又属于MAP集合。
.properties文件与Properties类。

Properties ppt = new Properties();
//键值对存储 每一行都是一个键值对
方法
ppt.load(Reader reader);
ppt.load(InputStream in);
功能都是把一个文件加载成程序中的一个MAP集合。
ppt.store(同上,传入一个字节流或者字符流);
功能是把MAP中存储的键值对编译成.properties文件。

ppt.put(“name”,”APPLE”);
ppt.put(“info”,”tell apple”);
FileWriter fw = new FileWriter(“c://book.properties”);
ppt.store(fw,”存储的图书”);
fw.close();

//上述可以将程序中的MAP存储到文件中

读取:
Reader r = new FileReader(“c://book.properties”);
ppt.load®;
Sout(ppt.get(“name”));//输出集合中的name键对应的值。

17.序列化技术
将程序中的对象直接以文件的形式存储起来。
以内存序列存储。

如快递管理的序列化,
把所有快递放到一个集合中,只需要往集合里放数据的时候把集合存到文件中即可。

反序列化

try-with-resources

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值