Java.io
Hello, 好久没有更新博客了,今天和大家一探索io流。话不多说,直接开始。
File
文件或目录路径名的抽象表示
常用构造方法
-
File(File parent, String child) //文件类型的 文件夹 和 文件名 创建新的File 实例
-
File(strinh pathname)
-
File(String parent, string child) //字符串类型文件夹 和 文件名 创建新的File 实例
File dir = new File("G://javaFiles//1.txt");
File a = new File(dir,"a.txt"); // File(File parent, String child) 构造方法
a.createNewFile();
File b = new File("G://javaFiles//1.txt","b.txt"); //File(String parent, string child) 构造方法
b.createNewFile();
常见方法
- createNewFile() ;只能创建文件,不能创建多级目录,解决办法使用 mkdir方法
//注意G盘下并没有 delete文件夹,运行结果会报错
File file2 = new File("G://delete//b.txt");
file2.createNewFile();
- mkdir() 方法 创建一层文件夹; mkdirs()创建多层文件夹
public static void main(String[] args) throws IOException{
/*File file = new File("G://javaFiles//a.txt"); //用来创建文件 不能创建文件夹; G://javaFiles已存在
boolean flag = file.createNewFile(); // 用来创建文件
System.out.println(flag?"文件创建成功":"文件创建失败");*/
File dir = new File("G://javaFiles//1.txt");
// dir.createNewFile(); 无论后缀名是什么,创建的永远是文件
dir.mkdir(); //无论文件名是什么创建的永远是 文件夹;创建的只是有一层文件夹
}
- delete()
File a = new File(dir,"a.txt");
File b = new File("G://javaFiles//1.txt","b.txt");
a.delete();
b.delete();
-
getAbsolutePath() 得到文件的绝对路径;返回类型为字符串
-
getAbsoluteFile() 得到文件的绝对路径; 返回类型为文件
-
getPath() 将抽象路径 转换为 路径名字符串
-
renameto() 移动位置 并重命名 PS : 原来的文件会被删除>
File re = new File("G:\\MyPython\\crawler\\《三国演义》.txt");
File newFile = new File("G:\\javaFiles\\三国.txt");
re.renameTo(newFile);
字段
java 可以实现跨平台,但是Windows 和 Linux 使用的符号不一样,所以不能在代码中将此类符号写死
System.out.println(File.pathSeparator); //系统有关的路径分隔符 : ;
System.out.println(File.separator); //系统有关的路径分隔符 : \
文件遍历
- 栗子:遍历 C 盘下所有的 以 后缀名为 .zip 并且文件大于 100MB
public static void main(String[] args) throws IOException{
File h = new File("H:\\");
File[] files = h.listFiles();
myListFile(files);
System.out.println("H盘遍历完毕");
}
public static void myListFile(File[] files){
//files数组长度 不为空 并且长度不为0
if(files!=null && files.length>0){
for (File file:files) {
//如果 当前 是 文件:判断文件名是否为有.zip
if(file.isFile()){
if(file.getName().endsWith(".zip") && file.length()>=100*1024*1024){
System.out.println(file.getName());
}
}else{
//如果当前 是 文件夹 ,将此文件夹下 的 第一层存储到 files2数组中
File[] files2 = file.listFiles();
//递归调用myListFile()方法
myListFile(files2);
}
}
}
}
IO流分类
字节流
OutputStream
常用方法
-
close()
-
flush()
-
write(byte[] b)
-
write(byte[] b, int off, int length)
-
write(int b) //要写入的字节是参数 b的低八位
常见子类
-
FileOutputStream 用于写入诸如图像数据的原始字节流 每一个FileOutputStream 的对象就是向每一个文件 输出的一个流管道
-
常见构造方法
-
FileOutputStream(File file) 创建文件输出流 并 写入指定的 File对象的文件
-
FileOutputStream(File file,boolean append) 开启追加模式
-
FileOutputStream(String name) 传入文件字符串路径 并向 创建的文件写入
-
FileOutputStream(String name,boolean append) 开启追加模式
-
-
常用方法(继承父类)
-
write(byte[] b)
public static void main(String[] args) throws IOException {
//只会自动创建文件 但不会创建文件夹
FileOutputStream fos = new FileOutputStream("G:\\javaFiles\\1.txt\\fileOutS.txt");
//写入一个字节
fos.write(66); //写入:B
//写入一组字节
byte[] bytes = {56,77,85}; //写入: 8MU
fos.write(bytes);
byte[] bytes2 ="ABCeFH3KLI".getBytes();
fos.write(bytes2); //写入: ABCeFH3KLI
fos.close();
}
- write(byte[] b, int off, int length)
public static void main(String[] args) throws IOException {
//只会自动创建文件 但不会创建文件夹
FileOutputStream fos = new FileOutputStream("G:\\javaFiles\\1.txt\\fileOutS.txt");
byte[] bytes2 ="ABCeFH3KLI".getBytes();
fos.write(bytes2, 2,3); //写入: CeF
System.out.println("已经写出");
fos.close();
}
- write(int b) //要写入的字节是参数 b的低八位
InputStream
常见方法
-
read() 从输入流中读取下一个数据字节,返回 int,范围 0- 255。 如果文件读取完毕 返回 -1
-
read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数; -1 同上
-
read(byte[] b, int off, int end)
-
close()
常见子类
-
FileInputStream 常用方法同上
-
read()
FileInputStream fis = new FileInputStream("G:\\javaFiles\\a.txt") ;
while(true){
byte b = (byte) fis.read(); //read()每次读取有一个字节,读完当前字节后读取下一个字节;当读取完全部字节一直返回-1
if(b==-1){
break;
}
System.out.print((char)b);
}
- read(byte[]) PS: 当最后又一次读取的元素长度小于 数组的长度,为了保证每次读取长度固定,会将上一次 读取的 相应空缺位置的元素赋值给当前数组
FileInputStream fis = new FileInputStream("G:\\javaFiles\\a.txt") ;
byte[] bytes = new byte[10];
fis.read(bytes);
System.out.println(new String(bytes));
fis.read(bytes);
System.out.println(new String(bytes));
fis.read(bytes);
System.out.println(new String(bytes));
- 解决上述bug
//解决上述bug
byte[] bytes = new byte[10];
int len = fis.read(bytes); //10 //以整数形式返回实际读取的字节数
System.out.println("bytes:"+bytes);
System.out.println(new String(bytes,0,len));
len= fis.read(bytes); //10
System.out.println(new String(bytes,0,len));
len = fis.read(bytes); //7
System.out.println(new String(bytes,0,len));
字符流
Write
常见方法
-
write( char[] cbuf)
-
write(char[] cbuf, int off ,int len)
-
write(int c)
-
write( string str)
-
write(string ,int off, int len)
FileWriter fw = new FileWriter("G:\\javaFiles\\a.txt",true);
fw.write('a');
fw.write("风光无限是你,跌落尘埃也是你,重要的是你,而不是怎样的你!");
fw.close();
- append() PS :追加,并不是基于源文件进行追加,而是正常的写操作,当 append= false 时,如果源文件也有内容 会将源文件的所有内容清除 再写入新的内容
FileWriter fw = new FileWriter("G:\\javaFiles\\a.txt");
// fw.write('a');
// fw.write("风光无限是你,跌落尘埃也是你,重要的是你,而不是怎样的你!");
fw.append("天官赐福");
fw.close();
-
close()
-
flush() //PS: 写入会有缓存,需要刷新,否则文件不会也有内容; 调用close 方法时有会执行刷新操作。
常用子类
Read
常用子类
- FileReader()
常用方法
- read(char a)
FileReader fir = new FileReader("G:\\javaFiles\\a.txt");
while(true){
int r = fir.read();
if(r == -1){
break;
}
System.out.print((char)r);
}
//输出:天官赐福
- read(char[] a)
FileReader fr = new FileReader("G:\\javaFiles\\三国.txt");
char[] chars = new char[100];
while(true){
int len = fr.read(chars);
if(len ==-1){
break;
}
String text = new String(chars,0,len);
System.out.println(text);
}
fr.close();
字节转换字符流
-
字节输入流 转换为 字符输入流
FileInputStream fis = new FileInputStream("G:\\javaFiles\\三国.txt"); //字节输入流 转换为 字符输入流 //参数1. 要转换的字节流 //参数2.指定编码名称 InputStreamReader isr = new InputStreamReader(fis,"gbk"); while (true){ char[] c = new char[100]; int l = isr.read(c); if(l ==-1){ break; } System.out.println(c); isr.close();
-
字节输出流 转换为 字符输入流
//字节输出流 转换为 字符输入流 FileOutputStream fos = new FileOutputStream("G:\\javaFiles\\e.txt"); OutputStreamWriter a = new OutputStreamWriter(fos,"utf8"); a.write("di didadi didadidi,曾经做错的事多的像天上星"); a.flush(); a.close();
BufferRead
//缓存读取流,将字符 输入流 转换为带有缓存 可以又一次读取一行 的缓存字符串读取流
FileReader fw = new FileReader("G:\\javaFiles\\e.txt");
BufferedReader br = new BufferedReader(fw);
String text = br.readLine();
System.out.println(text);
Properties
//.properties 文件 与 properties类
// 写入
Properties ppt = new Properties();
ppt.put("name","那一世");
ppt.put("author","仓央嘉措");
ppt.put("info","西域最大的王,拉萨最美的情郎");
FileWriter fw = new FileWriter("G:\\javaFiles\\boks.properties");
ppt.store(fw,"存储图书");
fw.close();
//读出
Properties ppt1 = new Properties();
FileReader fr = new FileReader("G:\\javaFiles\\boks.properties");
ppt1.load(fr);
System.out.println(ppt1.getProperty("name"));
System.out.println(ppt1.get("author"));
System.out.println(ppt1.getProperty("info"));
fr.close();
输出:
那一世
仓央嘉措
西域最大的王,拉萨最美的情郎
序列化/反序列化
序列化:将对象存储到文件中
反序列化:将存储的对象加载出来
package Serialization;
import java.io.*;
public class Book{
public static void main(String[] args) throws IOException {
//序列化
Books b = new Books("高等数学","同济大学","计算机必学");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("G:\\javaFiles\\book.txt"));
oos.writeObject(b);
oos.close();
//反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("G:\\javaFiles\\book.txt"));
Books o = (Books) ois.readObject();
System.out.println(o.getInfo());
}
}
//Serializable 标记接口;必须打标记,否则不允许使用序列化
class Books implements Serializable{
private String name;
private String author;
private String info;
public Books(){
}
public Books(String name, String author, String info) {
this.name = name;
this.author = author;
this.info = info;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", info='" + info + '\'' +
'}';
}
}