1.什么是流
2.File类的使用
代码如下:
package com_imooc.wenjian;
import java.io.File;
import java.io.IOException;
public class file_test {
public static void main(String[] args) {
//实例化一个file对象
File f=new File("E:\\项目\\mooc.txt");
File f1=new File("E:\\项目\\王二狗");
File f2=new File("E:\\项目\\王大狗\\李二蛋");
//创建文件
try {
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//创建目录
f1.mkdir(); //单级别目录
f2.mkdirs(); //多级别目录
//检查文件状态
System.out.println("文件是否是目录:"+f.isDirectory());
System.out.println("文件是否是文件:"+f.isFile());
System.out.println("文件是否是隐藏文件:"+f.isHidden());
System.out.println("文件路径是否真实存在:"+f.exists());
//删除文件或者目录
f1.delete();
}
}
3.字节流
InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。
字节流分为两大类:1.InputStream;2.OutputStream;
3.1 InputStream
包含有:
我们这里暂先用FileInputStream作为参考:
实际的代码操作:
package com_imooc.wenjian;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class InputStream_test {
public static void main(String[] args) {
//创建文件
File f = new File("C:\\Users\\Administrator\\Desktop\\mooc.txt");
//读取信息(两种写法)
try {
FileInputStream info = new FileInputStream("C:\\Users\\Administrator\\Desktop\\mooc.txt");
FileInputStream info1 = new FileInputStream(f);
//1.读取了一个字节
int n = info.read();
System.out.println((char) n);
System.out.println("====================");
//2.赋值与字节数组读取
byte[] b = new byte[20];
info1.read(b);
System.out.println(new String(b));
System.out.println("====================");
//3.循环读取
while (n != -1) {
System.out.print((char) n);
n = info.read();
}
//最后关闭流
info.close();
info1.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
需要注意的是:int n = info.read()和byte[] b = new byte[20];info1.read(b);还是有本质的区别的;
int n = info.read()获取的n,此时的n虽未int类型,但是实际是ASCII中的代表数字,所以直接使用(char) n可以得到我们要的文字;
但是byte[] b = new byte[20];int n= info1.read(b);中的n此时只是代表读取数据的时候的大小(站位的大小),所以(char) n的话并无实际的意义;
3.2 OutputStream
包含有:
我们这里暂先用FileOutputStream作为参考:
package com_imooc.wenjian;
import java.io.*;
public class OutputStream_test {
public static void main(String[] args) {
File f = new File("C:\\Users\\Administrator\\Desktop\\mooc1.txt");
try {
FileOutputStream info = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\mooc.txt");
FileInputStream fis1 = new FileInputStream("C:\\Users\\Administrator\\Desktop\\mooc.txt");
//true是做追加处理,不覆盖源文件
FileOutputStream info1 = new FileOutputStream(f, true);
FileInputStream fis = new FileInputStream(f);
//1.写入单个数据(清空数据后,重新编写)
info.write('a');
info.write('b');
System.out.println((char) fis1.read());
System.out.println((char) fis1.read());
System.out.println("=========================");
//2.写入多个数据;
String st = "cdefgh";
info.write(st.getBytes());
int n = fis1.read();
while (n != -1) {
System.out.println((char) n);
n = fis1.read();
}
System.out.println("=========================");
//3.选择性写入数据(选取字符1-4的字段)
info.write(st.getBytes(),1,4);
n = fis1.read();
while (n != -1) {
System.out.println((char) n);
n = fis1.read();
}
//最后关闭输入输出流
info.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.3 例题
我们采用的是copy的例子来进行代码的演示:
利用之前学习的字节流,来把图中1.png复制一份,并命令为2.png
package com_imooc.wenjian;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class wenjiankaobei {
public static void main(String[] args) {
try {
//1.创建流
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\1.png");
FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\2.png");
//2.读入数据并写入流
byte[] b = new byte[1024];
int n = fis.read(b); //读入的数据暂存于字节b
while (n != -1) {
fos.write(b, 0, n);
n = fis.read(b);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.4 缓存流
package com_imooc.wenjian;
import java.io.*;
public class buffered {
public static void main(String[] args) {
File f = new File("C:\\Users\\Administrator\\Desktop\\mooc.txt");
try {
//1.创建字节流(输入输出)
FileInputStream fis = new FileInputStream(f);
FileOutputStream fos = new FileOutputStream(f);
//2.创建缓存流(输入输出)
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
//3.缓存输出流(write)
bos.write(11);
bos.write('a');
bos.write('b');
bos.write('c');
bos.write("defghi".getBytes());
bos.flush(); //刷新缓冲输出流
bos.close(); //关闭缓存输出流
//4.缓存输入流(read)
System.out.println(bis.read());
int n=bis.read();
while (n != -1){
System.out.println((char) n);
n=bis.read();
}
bis.close(); //关闭缓存输入流
//5.关闭字节流
fis.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.字符流
Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
输入流:
输出流:
4.1 FileWriter和FileReader
package com_imooc.wenjian;
import java.io.*;
public class file_rw {
public static void main(String[] args) throws IOException {
//1.设置字符输入输出流
File f = new File("C:\\Users\\Administrator\\Desktop\\mooc1.txt");
//Writer w = new FileWriter(f, true); 添加true代表可以进行文件的追加
Writer w = new FileWriter(f, true);
Reader r = new FileReader(f);
//2.写入
w.write("来了,老弟");
w.write("我来了,老妹");
w.flush(); //刷新流
w.close(); //关闭流
//3.读取
char[] c = new char[1024];
int n = r.read(c);
while (n != -1) {
System.out.println(c);
n = r.read(c);
}
r.close(); //关闭流
}
}
4.2 字节字符流的转换
package com_imooc.wenjian;
import java.io.*;
public class input_reader {
public static void main(String[] args) {
try {
//1.分别创建字节字符流
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\mooc1.txt");
InputStreamReader isr = new InputStreamReader(fis);
FileOutputStream fos=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\mooc2.txt");
OutputStreamWriter osw=new OutputStreamWriter(fos);
//2.转化字节输入流
char[] c = new char[10];
int nn = 0;
while ((nn = isr.read(c)) != -1) {
String st = new String(c, 0, nn); //选定长短,防止多输出
System.out.print(st);
}
//3.转化字节输出流
osw.write(65);
osw.write('a');
osw.write('b');
osw.write('c');
osw.write("Hello World");
osw.flush();
osw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
字节流和字符流的区别
字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的,但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的Encode来处理,也就是要进行字符集的转化。这两个之间通过InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联。在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。
5.对象序列化
步骤:
实例:
创建goods.java
package com_imooc.wenjian;
import java.io.Serializable;
public class goods implements Serializable {
private int id;
private String name;
private double price;
public goods(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "goods{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}
执行man
package com_imooc.wenjian;
import java.io.*;
public class duixiangxulie {
public static void main(String[] args) {
try {
//1.创建字节流和对象流
goods g = new goods(1, "小浣熊", 1.5);
FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\goods.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\goods.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
//2.写入
oos.writeObject(g);
oos.flush();
oos.close();
//3.读取
try {
goods gg = (goods) ois.readObject();
System.out.println(gg);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
生成文件: