1、IO流
1.1、IO概述
- 列IO流用来处理设备之间的数据传输
- 列Java对数据的操作是通过流的方式
- 列Java用于操作流的对象都在IO包中
- 列流按操作对象分为两种:字节流与字符流,字节流可以操作任何数据,字符流只能操作纯字符数据比较方便。
- 列流按流向分为:输入流,输出流。
1.2、IO流结构图
image.png
1.3、字节流
image.png
以上我常用的就是FileInputStream以及FileOutputStream。我比较喜欢直接上干货,所以直接用代码通过几个例子来讲解字节流的实现过程。
package com.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
/**
* 从程序把数据写出到磁盘
* @author Administrator
*
*/
public class Demo1 {
public static void main(String[] args) {
try {
//1.使用File类找到一个文件对象,得到IO操作的源或目标
File file = new File("F:/test.txt");
//2.通过字节流或字符流的子类创建对象,(得到IO操作的通道)
//OutputStream os = new FileOutputStream(file);
OutputStream os = new FileOutputStream(file, true);
//3.进行读或写的操作,(IO操作)
byte[] b = "hello word!".getBytes();
os.write(b);
//os.write("hello word!".getBytes());
//4.关闭输入/输出,(打完收工,注意节约资源,关掉)
os.close();
System.out.println("操作完成!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("文件找不到!");
}
}
}
package com.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
/**
* 从磁盘把数据文件读出到程序
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) {
try {
//1.使用File类找到一个文件对象,得到IO操作的源或目标
File file = new File("F:\\test.txt");
//2.通过字节流或字符流的子类创建对象,(得到IO操作的通道)
InputStream is = new FileInputStream(file);
//3.进行读或写的操作,(IO操作)
byte[] b = new byte[512];
while(is.read(b) != -1){
String str = new String(b);
System.out.println(str);
}
//4.关闭输入/输出,(打完收工,注意节约资源,关掉)
is.close();
System.out.println("操作完成!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("文件找不到!");
}
}
}
1.4字符流
image.png
我常用的是FileReader以及WriterReader。上干货
package com.io;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
/**
* 通过字符流把数据写到磁盘文件
* @author Administrator
*
*/
public class Demo3 {
public static void main(String[] args) {
try {
//1.使用File类找到一个文件对象,得到IO操作的源或目标
File file = new File("F:/test.txt");
//2.通过字节流或字符流的子类创建对象,(得到IO操作的通道)
Writer writer = new FileWriter(file);
//3.进行读或写的操作,(IO操作)
writer.write("你好,张文!");
//4.关闭输入/输出,(打完收工,注意节约资源,关掉)
writer.close();
System.out.println("操作完成!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.io;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
/**
* 通过字符流把文件内容读到程序中
* @author Administrator
*
*/
public class Demo4 {
public static void main(String[] args) {
try {
//1.使用File类找到一个文件对象,得到IO操作的源或目标
File file = new File("F:/test.txt");
//2.通过字节流或字符流的子类创建对象,(得到IO操作的通道)
Reader reader = new FileReader(file);
//3.进行读或写的操作,(IO操作)
char[] b = new char[512];
int num = 0;
while((num = reader.read(b)) != -1){
String str = new String(b, 0, num);
System.out.println(str);
}
//4.关闭输入/输出,(打完收工,注意节约资源,关掉)
reader.close();
System.out.println("操作完成!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
接下来写一个copy的程序,把某个文件复制到另外的地方:
package com.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 复制文件到某个目录
* @author Administrator
*
*/
public class Demo5 {
public static void main(String[] args) {
File f1 = new File("D:\\IMG_9214s.jpg");
File f2 = new File("E:\\zhangwen.jpg");
copy(f1, f2);
}
/**
*
* @param f1源文件
* @param f2复制文件
*/
public static void copy(File f1, File f2){
try {
//1、分别创建输入流和输出流,通过字节流或字符流的子类创建对象,(得到IO操作的通道)
InputStream is = new FileInputStream(f1);
OutputStream os = new FileOutputStream(f2);
//2、读写操作(边读边写)先读再写
byte[] b = new byte[512];
//先读取
int num = is.read(b);
while(num != -1){
//开始写
os.write(b);
num = is.read(b);
}
//3.关闭输入/输出,(打完收工,注意节约资源,关掉)
is.close();
os.close();
System.out.println("操作成功!");
} catch (Exception e) {
System.out.println("文件找不到!");
}
}
}
1.5缓冲流
IO的缓冲区的存在就是为了提高效率,把要操作的数据放进缓冲区,然后一次性把缓冲区的内容写到目的地,而不是写一次就往目的地写一次。
package com.io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**
* 字符输入缓冲流
* @author Administrator
*
*/
public class Demo6 {
public static void main(String[] args) throws IOException {
//1、创建文件对象
File file = new File("H:/软考真题/20170323_IO流/20170323_IO流/笔记/IO和XML.txt");
//2、创建流对象
BufferedReader bf = new BufferedReader(new FileReader(file));
//3、读操作
String str = null;
while((str = bf.readLine()) != null){
System.out.println(str);
}
//4、关闭流释放资源
bf.close();
}
}
package com.io;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
* 字符输出缓冲流
* @author Administrator
*
*/
public class Demo7 {
public static void main(String[] args) throws IOException {
//1、创建文件对象
File file = new File("H:/test.txt");
//2、创建流对象
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
//3、输出操作
bw.write("你好JAVA!");
//4、关闭流
bw.close();
}
}
1.6转换流
打印流:该流提供了打印方法,可以将各种数据类型的数据都原样打印。
package com.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
/**
* 转换输出流
* @author Administrator
*
*/
public class Demo8 {
public static void main(String[] args) throws IOException {
//1、创建文件对象
File file = new File("H:/test.txt");
//2、创建转换流,字节流转换为字符流
Writer writer = new OutputStreamWriter(new FileOutputStream(file));
//3、输出操作
writer.write("转换输出流!");
//4、关闭流
writer.close();
}
}
1.7打印流
打印流:该流提供了打印方法,可以将各种数据类型的数据都原样打印。
package com.io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
/**
* 字符打印输出流
* @author Administrator
*
*/
public class Demo9 {
public static void main(String[] args) throws FileNotFoundException {
//1、创建文件对象
File file = new File("H:/test.txt");
//2、创建打印流
PrintWriter printWriter = new PrintWriter(file);
//3、输出操作
printWriter.write("你好打印流!");
//4、关闭流
printWriter.close();
printWriter.flush();
}
}