/**
* IO流
* 文件流
*/
1.IO流(输入(input)输出(output)流)
输入流(读取文件,输出文件):input,reader
输出流(在文件中写入数据):output,writer
字节流(每一次读取一个字节数据):以Stream结尾的流一定是字节流
字符流(每一次读取一个字符数据):以Reader或者是Writer结尾的流一定是字符流
注意:一个汉字占两个字节长度,一个汉字算一个字符
Java中任何一个流一定继承于下列四个抽象类中的某一个
InputStream 它是所有输入字节流的父类
OutputStream 它是所有输出字节流的父类
Reader 它是所有输入字符流的父类
Writer 它是所有输出字符流的父类
2.字节流
2.1 用字节流读取文件(InputStream)
//读取目录下的文件(没有指定盘符,默认在此项目下创建该文件)
InputStream is = new FileInputStream("hello.txt"); //文件或文件夹不存在会报错
//read() 从输入流中读取一个字节,读取成功后,用于读取数据的光标的位置将会向后移一位
//在文件中每次读取一个字节,并返回它的 ascii 值
int c = is.read();
//强转得到字符
System.out.println((char)c);
//把读取的字节放到数组里
byte[] bs = new byte[8192];
//把读取的字节放到数组里面去
is.read(bs);
//遍历字节数组
for(byte b : bs) {
System.out.print((char)b);
}
问题:如果字节数组存满了,但还有字节在文件中,怎么办呢? 用循环
//如果文件中没有字节了会返回 -1
System.out.println(is.read(bs)); // -1
//记录读取的实际长度
int len = 0;
// is.read(bs) 把读取的字节放到数组里并返回长度
while ((len = is.read(bs)) != -1) {
for(int i = 0; i < len; i++) {
System.out.println((char)bs[i]);
}
}
//关闭流
is.close();
2.2 用字节流往文件中写入数据(OutputStream)
OutputStream os = new FileOutputStream("hello.txt"); //在目录正确的情况下,如果没有该文件,那么会在该目录下主动创建文件
//os.write(97); //这种方式太慢了,而且还要知道该字符的 ascii
// byte[] bs = {97, 98, 99, 100};
// os.write(bs); //这种方法也太慢了,也是需要知道这些字符的 ascii
String msg = "我是汉字";
//把字符串转化为字节数组
byte[] bs = msg.getBytes();
//写入文件中
os.write(bs);
os.close();
案例:复制粘贴功能
//读取需要复制的文件
InputStream is = new FileInputStream("/Users/youjing/Downloads/picture/My/小叮当.jpg");
//要被写入的文件
OutputStream os = new FileOutputStream("new.jpg");
//读取的字节要存入的数组
byte[] bs = new byte[1024];
//记录读取字节的实际长度
int len;
while ((len = is.read(bs)) != -1) {
//把字节数组从第 0 个到实际存入的字节长度写进文件中
os.write(bs, 0, len);
}
os.close();
is.close();
3.字符流
3.1 用字符流读取文件(Reader, BufferedReader)
Reader rd = new FileReader("hello.txt");
//上面的字符流有点低级,用高级一点的流(功能更强大)
// BufferedReader br = new BufferedReader(rd);
BufferedReader br = new BufferedReader(new FileReader("hello.txt")); //这种写法只需要关一个流
//跳过前三个,从第四个开始读取
r.skip(3);
System.out.println(r.read());
//读取一行
// String line = br.readLine();
// System.out.println(line);
//循环读取多行
String line = null;
while ((line = br.readLine()) != null) { //全部读取完会返回 null
System.out.println(line);
}
rd.close();
br.close();
3.2 用字符流在文件中写入数据(Writer, BufferedWriter)
Writer w = new FileWriter("hello.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter("hello.txt"));
//window 换行符: \r\n
//linux 换行符: \r
//mac 换行符: \n
//因为 \r\n 在三个系统中都解释为换行,所以一般用 \r\n 换行
//把 啦啦啦 写入文件中
bw.write("啦啦啦\r\n");
//这也是换行
bw.newLine();
bw.write("略略略");
bw.close();
w.close();
4.字节流转字符流
InputStream in = new FileInputStream("/Users/youjing/Documents/a.txt");
//将字节流转换成字符流
//Reader rd = new InputStreamReader(in);
Reader rd = new InputStreamReader(new FileInputStream("/Users/youjing/Documents/a.txt"));
//OutputStream 同理
5.文件流
5.1 定义一个名字叫 test 的东西(不是文件夹也不是文件,看创建的方法)
File file = new File("test");
//创建单文件夹
file.mkdir();
file = new File("a/b/c");
//创建多级文件夹
file.mkdirs();
file = new File("a.txt");
//创建文件
file.createNewFile();
//文件是否存在
System.out.println(file.exists());
//判断文件是否为一个目录
System.out.println(file.isDirectory());
//判断文件是否为一个文件
System.out.println(file.isFile());
file = new File("/Users/youjing/Documents");
//获得当前目录下所有的文件名称
String[] fname = file.list();
System.out.println(Arrays.toString(fname)); //打印数组元素
//获得当前目录下所有的文件
File[] files = file.listFiles();
System.out.println(Arrays.toString(files));
file = new File("new.jpg");
//删除目录或文件
System.out.println(file.delete());
//判断该文件的上一级是否存在
System.out.println(file.getParentFile().exists());
//在原有的数据上追加内容
// Writer wt = new FileWriter(new File("hello.txt"), true);
BufferedWriter bw = new BufferedWriter(new FileWriter("hello.txt", true)`));
bw.write("123123123");
bw.close();
Java笔记(IO流、文件流)
最新推荐文章于 2022-12-09 18:23:20 发布