流(IO流):input-output-stream.
-
作用:实现两个设备之间的通信.
-
设备:内存,硬盘(磁盘),控制台,键盘,文件,网络
-
网络:在网络上,你的主机之外的环境.
-
流的分类:
-
根据操作的方式分类:输入流和输出流
-
根据数据的类型分类:字节流和字符流
- 字节流:传输的字节,可以传输任意类型的数据.—-视频,音频,文件,图片等
- 字符流:传输的也是字节,不同点在与传输的过程中加入了编码的操作,让我们在传输字符的时候更加的便捷——-文件
-
-
以内存为参考
- 字节流:–对应的父类
- 字节输入流:InputStream
- 字节输出流:OutputStream
-
字符流:–对应的父类
-
字符读入流(将数据输入内存):Reader
-
字符写出流(将数据从内存取出):Writer
-
先处理字符流:
-
实例:以磁盘的存储为例,将内容写入文件
- 分析:
- 因为传输的是字符—字符流
- 因为是从内存传出—写出流—FileWriter
注意点:
- 注意点一:关联文件的特点:如果之前不存在,程序会自动创建一个,如果已经存在了,直接使用.但是会将原文件的内容覆盖.
- 注意点二:如果只写名字,不写具体的路径,默认的路径是当前的工程.
- 注意点三:我们可以指定自己的路径,但是一定要保证路径存在.否则报异常:FileNotFoundException: W:\temp1.txt (系统找不到指定的路径。)
- 注意点四:在执行write方法时,数据被临时写入了流对象的内部数组中,这是一个字节数组,或默认取查编码表
- 注意点五:流使用完后必须关闭
- 注意点六:当流对象关闭后不能再进行任何操作,否则报异常:Stream closed
public static void main(String[] args) throws IOException {
//创建写出流对象并关联内容写出的文件
/*
* 注意点一:关联文件的特点:如果之前不存在,程序会自动创建一个,如果已经存在了,直接使用.但是会将原文件的内容覆盖.
* 注意点二:如果只写名字,不写具体的路径,默认的路径是当前的工程.
* 注意点三:我们可以指定自己的路径,但是一定要保证路径存在.否则报异常:FileNotFoundException: W:\temp1.txt (系统找不到指定的路径。)
*/
FileWriter fileWriter = new FileWriter("temp1.txt");
//调用写出方法
/*
* 注意点四:在执行write方法时,数据被临时写入了流对象的内部数组中,这是一个字节数组,或默认取查编码表
*/
fileWriter.write("bingbingAndChenchen");
//调用刷新方法--会将内容真正的写入文件
//fileWriter.flush();
//关闭流---a:将流关闭 b:刷新
//注意点五:流使用完后必须关闭
fileWriter.close();
//注意点六:当流对象关闭后不能再进行任何操作,否则报异常:Stream closed
//fileWriter.write("zhangsan");
}
文件的续写: FileWriter(String file,boolean value)
-
当value为true的时候,不会将原来的内容删除
-
:是转义字符 \t:制表符 \:普通的斜杠
-
实现换行:\r\n–windows下的换行 linux:\n
public static void main(String[] args) {
//创建对象并关联文件
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter("temp2.txt",true);
//写
fileWriter.write("bingbing");
fileWriter.write("\r\n");
fileWriter.write("zhansan");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//关闭
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
读文件的两种方式:
- 第一种 :read()–一个字符一个字符的读
-
第二种:read(字符数组)–一次可以读取多个字符,将读到的字符临时存储到了这个数组中.
实例:将数据从文件中取出–文件读入流(FileReader)
第一种 :read()–一个字符一个字符的读
public static void main(String[] args) throws IOException {
//创建对象并关联文件,关联的文件必须存在
FileReader fileReader = new FileReader("temp2.txt");
//* 第一种 :read()--一个字符一个字符的读
//a:会将当前的字符读出 b:将当前的指针后移一个字符
int data;
// data = fileReader.read();//这里得到是ASCII值
// System.out.println((char)data);
// data = fileReader.read();//这里得到是ASCII值
// System.out.println((char)data);
// data = fileReader.read();//这里得到是ASCII值
// System.out.println((char)data);
// data = fileReader.read();//这里得到是ASCII值
// System.out.println((char)data);
// data = fileReader.read();//这里得到是ASCII值
// System.out.println((char)data);
// data = fileReader.read();//这里得到是ASCII值
// System.out.println(data);//这里返回的是-1,代表读完了.
while ((data = fileReader.read()) != -1) {
System.out.println((char)data);
}
//关闭流
fileReader.close();
}
第二种:read(字符数组)–一次可以读取多个字符,将读到的字符临时存储到了这个数组中.
public static void main(String[] args) throws IOException {
//创建对象并关联文件,关联的文件必须存在
FileReader fileReader = new FileReader("temp2.txt");
/*
*数组是临时存放数据的地方,我们会将读到的字符放到数组中,数组的大小决定了我们一次可以读到的字符个数,
*但是从内存的角度考虑,临时数组并不是越大 越好,一般数组的大小在1Kb左右.
* 返回值:代表的是本次读到的真实字符的个数,如果返回值是-1代表读完了
*/
char[] arr = new char[2];
int num;
// num = fileReader.read(arr);
// System.out.println(new String(arr,0,num)+" "+num);
// num = fileReader.read(arr);
// System.out.println(new String(arr,0,num)+" "+num);
// num = fileReader.read(arr);
// System.out.println(new String(arr,0,num)+" "+num);//代表将字符数组从下标0开始的num个字符转成字符串
// num = fileReader.read(arr);
// System.out.println(new String(arr)+" "+num);//-1,说明读完了
while ((num = fileReader.read(arr)) != -1) {
System.out.println(new String(arr,0,num)+" "+num);
}
//关闭流
fileReader.close();
}
路径的讲解:
-
相对路径和绝对路径
-
实例: D:\workspace\BigData1715N19\src\com\qianfeng\test\Demo1.java 绝对路径
-
com\qianfeng\test\Demo1.java 相对路径
-
相对路径:从路径中间的某个部位开始一直到当前的文件名字
-
绝对路径:一个文件的完整路径,即从根目录开始的路径.
-
路径中的/ \是转义字符 \==/
实例:实现文件的复制
- 要求:将Demo1的内容拷贝到temp3.txt
public static void main(String[] args) throws IOException {
//1.创建读入流与写出流并关联对应的文件
FileReader fileReader = new FileReader("src/com\\qianfeng\\test\\Demo1.java");
FileWriter fileWriter = new FileWriter("temp3.txt");
//2.读写
//一次多多个字符
// char[] arr = new char[10];
// int num;
// while ((num = fileReader.read(arr)) != -1) {
// //将字符数组的部分内容写入文件
// fileWriter.write(arr, 0, num);
// }
//一次读一个字符
int num;
while ((num = fileReader.read()) != -1) {
fileWriter.write(num);//自带了编码
}
//3.关闭资源
fileReader.close();
fileWriter.close();
}
版权声明:本文为forever428原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。