IO流:input-outputStream,作用:实现两个设备之间的数据传输。
设备:磁盘(硬盘),内存,键盘,文件,网络,控制台 -- 可以输入输出数据的
网络:当前主机之外的网上资源
分类:
根据操作的方式:输入流和输出流
根据数据的类型:字节流和字符流
字节流:传输的是字节,可以操作任意类型的数据 ------ 音频,视频,文件,图片等
字符流:传输的是字节,不同点是在传输过程中加入了编码的操作,让我们的操作更方便------文本
输入输出,读入写出都是以内存为参考
字符流的两个父类:
字符读入流(将数据输入内存):Reader
字符写出流(将数据从内存取出):Writer
字节流:
字节输入流:InputStream
字节输出流:OutputStream
实例:将数据从内存放入磁盘,字符写出流---FileWriter
public class Demo {
public static void main(String[] args) throws IOException {
//1.创建FileWriter对象并关联文件
FileWriter fw = new FileWriter("temp1.txt");
/*
注意点一:如果我们只写名字,不写具体的路径,默认的路径是当前的工程
注意点二:如果关联的文件之前不存在,会创建一个新的,如果存在,直接使用,但是会将之前的内容覆盖掉
注意点三:我们可以创建自己的路径,但是一定要保证路径是真实存在的.否则报异常---java.io.FileNotFoundException: W:\temp1.txt (系统找不到指定的路径。)
*/
//2.进行写出操作
fw.write(" bing bing _ chen chen ");
/*
注意点一:在执行write方法时,临时将内容写入了流的字节数组中,这里会自动去查编码表.
*/
//3.刷新
fw.flush();
/*
将内容真正写如磁盘
*/
//4.关闭流
fw.close();
/*
功能:a.刷新,b.关闭流。
注意一:流使用完必须关闭
注意二:流关闭后不能再进行写入操作 -- java.io.IOException: Stream closed
}
}
实例:将数据从磁盘读入内存,字符读入流---FileReader
/*
read():一次读一个字符
a:会将当前的字符读出 b:会将指针指向下一个字符
方法的返回值就是读到的字符,当将所有字符读完的时候,返回-1.
read(数组):一次读多个字符,读到的字符会临时存放在临时数组中
数组是临时存放数据的地方,数组的大小决定了我们一次读到的字符个数
一般这个数组的大小在1kb左右
返回值代表当次读到的真实字符个数.如果返回值是-1,代表读完了
*/
public class Demo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fr = new FileReader("temp1.txt");
int num = 0;
//第一种读入:
while((num = fr.read())!=-1) {
System.out.print((char) num);
}
//第二种读入:
char[] arr = new char[5];
while((num = fr.read(arr))!=-1) {
System.out.println(new String(arr,0,num) );
}
fr.close();
}
}
关于\
\代表转义字符 \t:制表符 \n:换行符 \\:表示普通的\
在表示路径的时候,\与/意思一样。
绝对路径和相对路径
D:\\workspace\\BigData1716N21/src/com/qianfeng/test/Demo1.java----绝对路径
src/com/qianfeng/test/Demo1.java---相对路径
绝对路径:一个文件的完整路径,从根目录开始到当前的文件
相对路径:从路径中的某一个部位开始一直到当前的文件---保证了程序的可移植性
/*
小练习:完成文件的复制
*/
public class Demo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("E:\\Administrator\\代码\\Java\\BigData1716N21\\src\\com\\qianfeng\\test\\Demo8.java");
FileWriter fw = new FileWriter("temp2.txt");
int num = 0;
while((num = fr.read())!= -1) {
fw.write((char)num);
}
fr.close();
fw.close();
}
}
文件的续写
/*
文件的续写--FileWriter("路径",value)
当value=true的时候,不会将原来的内容删掉,往后接着写
换行:windows下的换行:\r\n linux:\n
*/
public class Demo {
public static void main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("temp1.txt",true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fw.write("\r\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fw.write("ou ha ha ha ……");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
字符缓冲流(字符缓冲区):本身没有读写的能力,可以提高读写的效率,如果要想进行读写,必须借助于字符。.
可以将缓冲流比作:高速的小车或者催化剂
字符缓冲流分类:
字符缓冲读入流:BufferedReader---提高读的能力
字符缓冲写出流:BufferedWriter---提高写的能力
字符缓冲读入流——BufferedReader 演示
public class Demo {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("temp3.txt"));
bw.write("ha ha ha ……");
bw.newLine();
bw.newLine();
//比\r\n好,可以跨平台
bw.write("ou hou hou hou ……");
bw.close();
}
}
字符缓冲写出流——BufferedWriter 演示
/*
readLine()---一次读一行---返回值-String(代表读到的内容)
原理:一个字符一个字符的读,一直读到换行符,然后将读到的所有字符放入一个字符串,返回.
注意点:a.不会将换行符返回 b.返回值就是读到的内容,当所有内容读完时,返回null
*/
public class Demo {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("E:\\Administrator\\代码\\Java\\BigData1716N21\\src\\com\\qianfeng\\test\\Demo1.java"));
String data = null;
while((data=br.readLine())!=null) {
System.out.println(data);
System.out.println();
}
br.close();
}
}
小练习
/*
使用字符缓冲流完成文件的复制
*/
public class Demo {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("E:\\Administrator\\代码\\Java\\BigData1716N21\\src\\com\\qianfeng\\test\\Demo1.java"));
BufferedWriter bw = new BufferedWriter(new FileWriter("temp4.txt"));
String data = null;
while((data=br.readLine())!=null) {
bw.write(data);
bw.newLine();
}
br.close();
bw.close();
}
}
LineNumberReader:是缓冲流,父类是BufferedReader,特有功能:设置行号,获取行号
public class Demo {
public static void main(String[] args) throws IOException {
LineNumberReader lnr = new LineNumberReader(new FileReader("E:\\Administrator\\代码\\Java\\BigData1716N21\\src\\com\\qianfeng\\test\\Demo1.java"));
lnr.setLineNumber(5);
//设置行号:默认行号是从0开始设置,从1开始计数
//我们可以根据具体情况指定行号
String data = null;
while((data=lnr.readLine())!=null) {
System.out.print(lnr.getLineNumber());
System.out.print(data);
System.out.println();
}
lnr.close();;
}
}