IO流的分类与设计案例
场景一、输出纯文本数据
从键盘输入留言,并保存到message.txt文件中
public static void main(String[] args) {
//从键盘输入留言,并保存到message.txt文件中
Scanner scanner = new Scanner(System.in);
//1.选择合适的流 因为是纯文本数据,可以选用效率高的字符输出流
FileWriter writer = null;
File file = new File("D:\\test\\io");
file.mkdirs();
File file1 = new File(file,"message.txt");
try {
writer = new FileWriter(file1);
//2.循环操作
while (true){
System.out.println("请输入留言");
String message = scanner.nextLine();
if("stop".equals(message)){
break;
}
writer.write(message+"\r\n");
writer.flush();
}
//3.关闭流
scanner.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
场景二、读取纯文本数据
读用户留言信息 message.txt的内容
public static void main(String[] args) {
//读用户留言信息 message.txt的内容
File file = new File("D:\\test\\io\\message.txt");
FileReader fileReader = null;
try {
fileReader = new FileReader(file);
char[] chars = new char[1024];
int len = 0;
while ((len = fileReader.read(chars)) != -1){
System.out.println(new String(chars,0,len));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(fileReader != null){
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
场景三、按行读取数据
按行读用户留言信息 message.txt的内容(用包装流)
public static void main(String[] args) {
//按行读用户留言信息 message.txt的内容(用包装流)
File file = new File("D:\\test\\io\\message.txt");
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try {
fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
String str = null;
while ((str = bufferedReader.readLine()) != null){
System.out.println(str);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(fileReader != null){
fileReader.close();
}
if(bufferedReader != null){
bufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
场景三、复制文件基本版
将图片从一个目录复制到另一个目录下
文件IO流,和文件的数据传输:
(1)文件字节输入流:FileInputStream
(2)文件字节输出流:FileOutputStream
(3)文件字符输入流:FileReader,只能按照平台默认的编码方式读取数据
(4)文件字符输出流:FileWriter,只能按照平台默认的编码方式写入数据
注意:
在写入一个文件时,如果目录下有同名文件将被覆盖,除非是追加模式。
在读取文件时,必须保证该文件已存在,否则出异常。
public static void main(String[] args) {
//将图片从一个目录复制到另一个目录下
//1.选取流 字节流(这里操作的是图片,故用二进制操作)
FileInputStream fis = null;
FileOutputStream fop = null;
try {
fis = new FileInputStream(new File("D:\\test\\io\\狼王.jpg"));
fop = new FileOutputStream(new File("D:\\test\\小王.jpg"));
//2.循环操作
byte[] bytes = new byte[1024];
int len = 0;
while ((len = fis.read(bytes)) != -1){
fop.write(bytes,0,len);
fop.flush();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//3.关闭流
try{
if(fis != null){
fis.close();
}
if(fop != null){
fop.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
场景四、复制文件提升效率版
public static void main(String[] args) {
//将图片从一个目录复制到另一个目录下
//1.选取流 字节流(这里操作的是图片,故用二进制操作)
FileInputStream fis = null;
BufferedInputStream bis = null;
FileOutputStream fop = null;
BufferedOutputStream bps = null;
try {
fis = new FileInputStream(new File("D:\\test\\io\\狼王.jpg"));
bis = new BufferedInputStream(fis);
fop = new FileOutputStream(new File("D:\\test\\小王.jpg"));
bps = new BufferedOutputStream(fop);
//2.循环操作
byte[] bytes = new byte[1024];
int len = 0;
while ((len = bis.read(bytes)) != -1){
bps.write(bytes,0,len);
bps.flush();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//3.关闭流
try{
if(fis != null){
fis.close();
}
if (bis != null) {
bis.close();
}
if(fop != null){
fop.close();
}
if(bps != null){
bps.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
场景五、读写纯文本数据的同时进行编码和解码
解码
当要读取指定编码的纯文本数据时,可以使用InputStreamReader进行解码。所谓解码,即把二进制的字节序列按照指定字符编码解码为可以被正确识别的字符内容。
InputStreamReader()默认使用UTF-8编码格式
public static void main(String[] args) {
BufferedReader bw = null;
String message = null;
try{
bw = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\test\\指定编码.txt")));
while ((message = bw.readLine()) != null){
System.out.println(message);
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
编码
将不同编码的文件进行转换
public static void main(String[] args) {
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\test\\指定编码ANSI.txt"),"GBK"));
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\test\\指定编码UTF-8.txt"),"UTF-8"));
String str = null;
while ((str = br.readLine()) != null){
bw.write(str);
bw.flush();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try{
if(br != null){
br.close();
}
if(bw != null){
bw.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
场景六、操作java基本数据类型
public static void main(String[] args) {
saveData();
getData();
}
static void saveData(){
String name = "张三";
int age = 18;
double ge = 7600.00;
long salary = 1000000;
DataOutputStream dos = null;
try {
dos = new DataOutputStream(new FileOutputStream("D:\\test\\data.bat"));
dos.writeUTF(name);
dos.writeInt(18);
dos.writeDouble(ge);
dos.writeLong(salary);
dos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
static void getData(){
DataInputStream dos = null;
try{
dos = new DataInputStream(new FileInputStream("D:\\test\\data.bat"));
System.out.println(dos.readUTF());
System.out.println(dos.readInt());
System.out.println(dos.readDouble());
System.out.println(dos.readLong());
dos.close();
}catch (Exception e){
e.printStackTrace();
}
}