大数据必学Java基础(七十):不要用字符流去操作非文本文件
【摘要】 不要用字符流去操作非文本文件文本文件:.txt .java .c .cpp -- 建议使用字符流操作非文本文件:.jpg、 .mp3 、 .mp4、.doc 、.ppt -- 建议使用字节流操作利用try-catch-finally处理异常方式package com.lanson.io01;import java.io.*;/** * @author : Lansonli */public ...
不要用字符流去操作非文本文件
文本文件:
.txt .java .c .cpp -- 建议使用字符流操作
非文本文件:
.jpg、 .mp3 、 .mp4、.doc 、.ppt -- 建议使用字节流操作
利用try-catch-finally处理异常方式
package com.lanson.io01;
import java.io.*;
/**
* @author : Lansonli
*/
public class Test04 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//1.有一个源文件
File f1 = new File("d:\\Test.txt");
//2.有一个目标文件:
File f2 = new File("d:\\Demo.txt");
//3.搞一个输入的管 怼到源文件上:
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader(f1);
//4.搞一个输出的管,怼到目标文件上:
fw = new FileWriter(f2);
//5.开始动作:
char[] ch = new char[5];
int len = fr.read(ch);
while(len!=-1){
String s = new String(ch,0,len);
fw.write(s);
len = fr.read(ch);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//6.关闭流:(关闭流的时候,倒着关闭,后用先关)
try {
if(fw!=null){//防止空指针异常
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(fr!=null){
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
一、FileInputStream读取文件中内容
1、读取文本文件
package com.lanson.io02;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* @author : Lansonli
*/
public class Test01 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) throws IOException {
//功能:利用字节流将文件中内容读到程序中来:
//1.有一个源文件:
File f = new File("D:\\Test.txt");
//2.将一个字节流这个管 怼 到 源文件上:
FileInputStream fis = new FileInputStream(f);
//3.开始读取动作
/*
细节1:
文件是utf-8进行存储的,所以英文字符 底层实际占用1个字节
但是中文字符,底层实际占用3个字节。
细节2:
如果文件是文本文件,那么就不要使用字节流读取了,建议使用字符流。
细节3:
read()读取一个字节,但是你有没有发现返回值是 int类型,而不是byte类型?
read方法底层做了处理,让返回的数据都是“正数”
就是为了避免如果字节返回的是-1的话,那到底是读入的字节,还是到文件结尾呢。
*/
int n = fis.read();
while(n!=-1){
System.out.println(n);
n = fis.read();
}
//4.关闭流:
fis.close();
}
}
2、利用字节流读取非文本文件(一个字节一个字节的读取)
package com.lanson.io02;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author : Lansonli
*/
public class Test02 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) throws IOException {
//功能:利用字节流将文件中内容读到程序中来:
//1.有一个源文件:
File f = new File("D:\\LOL.jpg");
//2.将一个字节流这个管 怼 到 源文件上:
FileInputStream fis = new FileInputStream(f);
//3.开始读取动作
int count = 0;//定义一个计数器,用来计读入的字节的个数
int n = fis.read();
while(n!=-1){
count++;
System.out.println(n);
n = fis.read();
}
System.out.println("count="+count);
//4.关闭流:
fis.close();
}
}
3、利用字节类型的缓冲数组
package com.lanson.io02;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author : Lansonli
*/
public class Test03 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) throws IOException {
//功能:利用字节流将文件中内容读到程序中来:
//1.有一个源文件:
File f = new File("D:\\LOL.jpg");
//2.将一个字节流这个管 怼 到 源文件上:
FileInputStream fis = new FileInputStream(f);
//3.开始读取动作
//利用缓冲数组:(快递员的小车)
byte[] b = new byte[1024*6];
int len = fis.read(b);//len指的就是读取的数组中的有效长度
while(len!=-1){
//System.out.println(len);
for(int i = 0;i<len;i++){
System.out.println(b[i]);
}
len = fis.read(b);
}
//4.关闭流:
fis.close();
}
}
二、FileInputStream、FileOutputStream完成非文本文件的复制
1、读入一个字节,写出一个字节
package com.lanson.io02;
import java.io.*;
/**
* @author : Lansonli
*/
public class Test04 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) throws IOException {
//功能:完成图片的复制:
//1.有一个源图片
File f1 = new File("d:\\LOL.jpg");
//2.有一个目标图片:
File f2 = new File("d:\\LOL2.jpg");
//3.有一个输入的管道 怼 到 源文件:
FileInputStream fis = new FileInputStream(f1);
//4.有一个输出的管道 怼到 目标文件上:
FileOutputStream fos = new FileOutputStream(f2);
//5.开始复制:(边读边写)
int n = fis.read();
while(n!=-1){
fos.write(n);
n = fis.read();
}
//6.关闭流:(倒着关闭流,先用后关)
fos.close();
fis.close();
}
}
2、利用缓冲字节数组
package com.lanson.io02;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author : Lansonli
*/
public class Test05 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) throws IOException {
//功能:完成图片的复制:
//1.有一个源图片
File f1 = new File("d:\\LOL.jpg");
//2.有一个目标图片:
File f2 = new File("d:\\LOL2.jpg");
//3.有一个输入的管道 怼 到 源文件:
FileInputStream fis = new FileInputStream(f1);
//4.有一个输出的管道 怼到 目标文件上:
FileOutputStream fos = new FileOutputStream(f2);
//5.开始复制:(边读边写)
//利用缓冲数组:
byte[] b = new byte[1024*8];
int len = fis.read(b);
while(len!=-1){
fos.write(b,0,len);
len = fis.read(b);
}
//6.关闭流:(倒着关闭流,先用后关)
fos.close();
fis.close();
}
}
三、缓冲字节流(处理流) -- BufferedInputStream ,BufferedOutputStream
1、读入一个字节,写出一个字节
2、 利用缓冲字节数组
3、利用缓冲区
想要完成上面的效果,单纯的靠FileInputStream、FileOutputStream是不可以完成的,这个时候就需要功能的加强。 这个加强就需要引入新的流(在FileInputStream、FileOutputStream外面再套一层流):BufferedInputStream ,BufferedOutputStream -- 处理流
4、代码
package com.lanson.io02;
import java.io.*;
/**
* @author : Lansonli
*/
public class Test06 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) throws IOException {
//1.有一个源图片
File f1 = new File("d:\\LOL.jpg");
//2.有一个目标图片:
File f2 = new File("d:\\LOL2.jpg");
//3.有一个输入的管道 怼 到 源文件:
FileInputStream fis = new FileInputStream(f1);
//4.有一个输出的管道 怼到 目标文件上:
FileOutputStream fos = new FileOutputStream(f2);
//5.功能加强,在FileInputStream外面套一个管:BufferedInputStream:
BufferedInputStream bis = new BufferedInputStream(fis);
//6.功能加强,在FileOutputStream外面套一个管:BufferedOutputStream:
BufferedOutputStream bos = new BufferedOutputStream(fos);
//7.开始动作 :
byte[] b = new byte[1024*6];
int len = bis.read(b);
while(len!=-1){
bos.write(b,0,len);
/* bos.flush(); 底层已经帮我们做了刷新缓冲区的操作,不用我们手动完成:底层调用flushBuffer()*/
len = bis.read(b);
}
//8.关闭流:
//倒着关:
//如果处理流包裹着节点流的话,那么其实只要关闭高级流(处理流),那么里面的字节流也会随之被关闭。
bos.close();
bis.close();
/*fos.close();
fis.close();*/
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)