一、输入输出IO流
1、数据源及流的概念
/**
* 使用try-catch-finally经典语法结构,测试流的使用
*/
public class Test02 {
public static void main(String[] args) {
readFile();
writeFile();
}
public static void readFile(){
FileInputStream fis=null;
try {
fis=new FileInputStream("d:/b.txt");
int s1=fis.read();
int s2=fis.read();
int s3=fis.read();
int s4=fis.read();
int s5=fis.read();
System.out.println((char)s1);
System.out.println((char)s2);
System.out.println((char)s3);
System.out.println((char)s4);
System.out.println(s5); //由于文件内容已经读取完毕,返回-1
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//流对象用完后必须关闭,否则总是占用系统资源
try {
if(fis!=null){
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void writeFile(){
FileOutputStream fos=null;
try {
fos=new FileOutputStream("d:/c.txt");
fos.write('x');
fos.write('r');
fos.write('m');
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(fos!=null){
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 使用try-with-resource新语法结构,使用流对象
*/
public class Test03 {
public static void main(String[] args) {
readFile();
writeFile();
}
public static void readFile(){
try(FileInputStream fis=new FileInputStream("d:/b.txt");) {
int s1=fis.read();
int s2=fis.read();
int s3=fis.read();
int s4=fis.read();
int s5=fis.read();
System.out.println((char)s1);
System.out.println((char)s2);
System.out.println((char)s3);
System.out.println((char)s4);
System.out.println(s5); //由于文件内容已经读取完毕,返回-1
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void writeFile(){
try(FileOutputStream fos=new FileOutputStream("d:/c.txt");) {
fos.write('x');
fos.write('r');
fos.write('m');
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、Java中流的概念细分
/**
* 流的使用,经典代码
*/
public class Test04 {
public static void main(String[] args) {
writeFile();
readFile();
// copyFile("d:/主图2021年.jpg","d:/主图2021年_copy.jpg");
copyFileBuffer("d:/主图2021年.jpg","d:/主图2021年_copy2.jpg");
}
public static void readFile(){
try(FileInputStream fis=new FileInputStream("d:/c.txt")){
StringBuilder sb=new StringBuilder();
int tmp=0;
while((tmp=fis.read())!=-1){
sb.append((char)tmp);
}
System.out.println(sb);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void writeFile(){
try(FileOutputStream fos=new FileOutputStream("d:/c.txt")){
fos.write("abcde".getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//读一个字节,写一个字节,效率最低的原始版本
public static void copyFile(String srcPath,String desPath){
try(FileInputStream fis=new FileInputStream(srcPath);
FileOutputStream fos =new FileOutputStream(desPath)){
int tmp=0;
while((tmp=fis.read())!=-1){
fos.write(tmp);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//使用缓存,提高读取效率
public static void copyFileBuffer(String srcPath,String desPath){
try(FileInputStream fis=new FileInputStream(srcPath);
FileOutputStream fos =new FileOutputStream(desPath)){
byte[] buffer=new byte[1024];
while((fis.read(buffer))!=-1){
fos.write(buffer);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、IO流体系介绍
1、文件字符流
/**
* 关于文件字符流的测试操作,实现了文本文件的拷贝
*/
public class TestFileReaderWriter {
public static void main(String[] args) {
try(FileReader fr=new FileReader("d:/a.txt");
FileWriter fw=new FileWriter("d:/a_copy.txt");){
int tmp=0;
while((tmp=fr.read())!=-1){
fw.write(tmp);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、缓冲字节流
/**
* 测试缓冲字节流
*/
public class TestBufferInputOutputStream {
public static void main(String[] args) {
try(FileInputStream fis=new FileInputStream("d:/反诈视频3.mp4");
FileOutputStream fos=new FileOutputStream("d:/反诈视频3_copy.mp4");
BufferedInputStream bis=new BufferedInputStream(fis);
BufferedOutputStream bos=new BufferedOutputStream(fos);){
int tmp=0;
while((tmp=fis.read())!=-1){
bos.write(tmp);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、缓冲字符流
/**
* 使用缓冲字符流
*/
public class TestBufferReaderWriter {
public static void main(String[] args) {
try(BufferedReader br=new BufferedReader(new FileReader("d:/a.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("d:/a2.txt"));){
String tmpString="";
while((tmpString=br.readLine())!=null){
bw.write(tmpString);
bw.newLine();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4、字节数组流
/**
* 使用字节数组流
*/
public class TestByteInputOutputStream {
public static void main(String[] args) {
test01("abcdefg".getBytes());
}
public static void test01(byte[] bytes){
int tmp=0;
int num=0; //用于表示读取的字节数
try(ByteArrayInputStream bis=new ByteArrayInputStream(bytes);){
while((tmp=bis.read())!=-1){
System.out.println((char)tmp);
num++;
}
System.out.println("读取的字节数是:"+num);
} catch (IOException e) {
e.printStackTrace();
}
}
}
5、数据流
/**
* 使用数据流
*/
public class TestDataInputOutputStream {
public static void main(String[] args) {
// writeData();
readData();
}
public static void writeData(){
try(DataOutputStream dos=new DataOutputStream(new FileOutputStream("d:/data.txt"));){
dos.writeChar('a');
dos.writeInt(10);
dos.writeDouble(Math.random());
dos.writeBoolean(true);
dos.writeUTF("你好java!");
//手动刷新缓冲区,将流中的数据写入到文件
dos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void readData(){
try(DataInputStream dis=new DataInputStream(new FileInputStream("d:/data.txt"))){
//读取数据时,需要和写入的顺序保持一致!否则不能正确的读取数据
System.out.println(dis.readChar());
System.out.println(dis.readInt());
System.out.println(dis.readDouble());
System.out.println(dis.readBoolean());
System.out.println(dis.readUTF());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
6、对象流
public class Users implements java.io.Serializable{
private int id;
private String uname;
transient private String pwd;
public Users() {
}
public Users(int id, String uname, String pwd) {
this.id = id;
this.uname = uname;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
public class TestObjectInputOutputStream {
public static void main(String[] args) {
writeObject();
readObject();
}
public static void writeObject(){
try(ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("d:/object_data.txt"))){
ArrayList<Users> list=new ArrayList<>();
list.add(new Users(1001,"张三","123456"));
list.add(new Users(1002,"李四","123456"));
list.add(new Users(1003,"王五","123456"));
oos.writeObject(list);
oos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void readObject(){
try(ObjectInputStream ois=new ObjectInputStream(new FileInputStream("d:/object_data.txt"))){
ArrayList<Users> list=(ArrayList) ois.readObject();
for(Users u:list){
System.out.println(u.getId()+","+u.getUname()+","+u.getPwd());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
7、转换流
/**
* 测试转换流
*/
public class TestInputStreamReader {
public static void main(String[] args) {
try(BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out))){
String str=br.readLine();
while(!"exit".equals(str)){
bw.write("键盘输入:"+str);
bw.newLine();
bw.flush();
str=br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
8、任意访问文件流
/**
* 测试任意访问文件流
*/
public class TestRandomAccessFile {
public static void main(String[] args) {
try(RandomAccessFile raf=new RandomAccessFile("d:/data2.txt","rw")){
int[] data={10,20,30,40,50,60,70,80,90,100};
for(int i=0;i<data.length;i++){
raf.writeInt(data[i]);
}
//直接从data2.txt中读取数据,位置从第4字节开始
raf.seek(4);
System.out.println(raf.readInt());
//在第8个字节处,插入一个新数据45,替换以前的数据30
raf.seek(8);
raf.writeInt(45);
for(int i=0;i<10;i++){
raf.seek(i*4);
System.out.print(raf.readInt()+"\t");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、Apache IO 包的使用
/**
* 测试Apache Commons组件下的IO工具库
*/
public class TestApacheFileUtils {
public static void main(String[] args) {
writeFile();
readFile();
readURL();
fileCopy();
directoryCopy();
}
public static void writeFile(){
StringBuilder sb=new StringBuilder();
for(int i=0;i<1000;i++){
sb.append(Math.random()+"\n");
}
try {
FileUtils.write(new File("d:/apache-test.txt"),sb.toString(),"gbk");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void readFile(){
try {
List<String> content=FileUtils.readLines(new File("d:/apache-test.txt"),"gbk");
for(String temp:content){
System.out.println(temp);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void readURL(){
try {
URL url=new URL("http://www.baidu.com");
InputStream is=url.openStream();
String content=IOUtils.toString(is,"UTF-8");
System.out.println(content);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void fileCopy(){
File srcFile=new File("d:/a.txt");
File desFile=new File("d:/aa.txt");
try {
FileUtils.copyFile(srcFile,desFile);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void directoryCopy(){
File dir1=new File("d:/tmp");
File dir2=new File("d:/tmp2");
try {
FileUtils.copyDirectory(dir1, dir2, new FileFilter() {
@Override
public boolean accept(File pathname) {
if(pathname.isDirectory()||pathname.getName().endsWith("jpg")){
return true;
}else{
return false;
}
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}