Java中的IO流
创始人
2024-01-26 07:15:10
0

Java中的IO流

image-20221110153850629

image-20221110153902226

image-20221110153934293

image-20221110154606692

Java中的4大IO抽象类

image-20221110154710555

InputStream/OutputStream 为字节输入输出流

Reader/Writer 为字符输入输出流

InputStream

image-20221110154939666

OutputStream

image-20221110155134332

Reader

image-20221110155143360

Writer

image-20221110155255762

Java中流的概念细分

image-20221110155436935

image-20221110155503244

二进制文件(图片、影音)用字节流

文本信息用字符流

image-20221110155727756

image-20221110155747580

image-20221110155844830

IO流的体系

image-20221110160005253

image-20221110160358045

image-20221110160621062

练手案例

public class FirstDemo {public static void main(String[] args) throws IOException {// 创建字节输入流对象InputStream fileInputStream = new FileInputStream("D:\\桌面\\新建文本文档.txt");int s1;while ((s1 = fileInputStream.read())!=-1){System.out.println(s1);System.out.println((char)s1);}fileInputStream.close();}
}

File类

image-20221110165608105

针对文件操作的方法

image-20221110165645626

image-20221112203454845

针对目录的方法

image-20221110165850740

常用流对象

文件字节流

实现文件拷贝

public class Test {public static void main(String[] args) throws IOException {InputStream stream = new FileInputStream("D:\\桌面\\a.png");OutputStream outputStream = new FileOutputStream("D:\\桌面\\aa.jpg");int tem = 0;while((tem = stream.read()) != -1){System.out.println(tem);outputStream.write(tem);}outputStream.flush();stream.close();outputStream.close();}
}

通过缓冲区提高读写效率

方式一:

image-20221112213859286

public class Test {public static void main(String[] args) throws IOException {InputStream stream = new FileInputStream("D:\\桌面\\a.png");OutputStream outputStream = new FileOutputStream("D:\\桌面\\aa.jpg");int tem = 0;byte[] buffer = new byte[1024];while((tem = stream.read(buffer)) != -1){  // 数组装满返回长度,装不满返回-1outputStream.write(buffer,0,tem);// 将buffer中0到tem的数据写入}outputStream.flush();stream.close();outputStream.close();}
}

方式二:

image-20221112213922859

public class Test {public static void main(String[] args) throws IOException {InputStream stream = new FileInputStream("D:\\桌面\\a.png");OutputStream outputStream = new FileOutputStream("D:\\桌面\\aa.png");int tem = 0;byte[] buffer = new byte[stream.available()]; //  stream.available()是该文件的预估大小stream.read(buffer);outputStream.write(buffer);outputStream.flush(); // 将内存转入磁盘stream.close();outputStream.close();}
}

通过字节缓冲流提高效率

缓冲流为处理流

image-20221112215208687

缓冲区中,默认有一个数组,默认为8192

public class Test {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("D:\\桌面\\a.png");FileOutputStream fos = new FileOutputStream("D:\\桌面\\aa.png");BufferedInputStream bis  = new BufferedInputStream(fis);BufferedOutputStream bos = new BufferedOutputStream(fos);int tem = 0;while ((tem = bis.read()) != -1){bos.write(tem);}bos.flush();bos.close();bis.close();fis.close();fos.close();}
}

定义文件拷贝工具类

public static void copyFile(String src,String des) throws IOException {FileInputStream fis = new FileInputStream(src);FileOutputStream fos = new FileOutputStream(des);BufferedInputStream bis = new BufferedInputStream(fis);BufferedOutputStream bos = new BufferedOutputStream(fos);int temp = 0;while ((temp = bis.read()) != -1){bos.write(temp);}bos.flush();bis.close();bos.close();fis.close();fos.close();
}

文件字符流

文件字节流可以处理所有的文件,但是处理文本文件时,我们也可以使用文件字符流,他以字符为单位进行操作。

实现文件拷贝

public class readerwriter {public static void main(String[] args) throws IOException {FileReader fileReader = new FileReader("D:\\桌面\\a.txt");FileWriter fileWriter = new FileWriter("D:\\桌面\\aa.txt");int temp = 0;while ((temp = fileReader.read()) != -1){fileWriter.write(temp);}fileWriter.write("\r\n");// 回车换行fileWriter.write("hhhhhhhhhhhhhhhh");fileWriter.flush();FileWriter fileWriter2 = new FileWriter("D:\\桌面\\aa.txt",true); // 不加true默认覆盖,加了true为在尾部添加fileWriter2.write("houyiming");fileWriter2.flush();fileReader.close();fileWriter.close();fileWriter2.close();}
}

缓冲区提高效率

public class readerwriter {public static void main(String[] args) throws IOException {FileReader fileReader = new FileReader("D:\\桌面\\a.txt");FileWriter fileWriter = new FileWriter("D:\\桌面\\aa.txt");int temp = 0;char[] buffer = new char[1024];while ((temp = fileReader.read(buffer)) != -1){fileWriter.write(buffer,0,1024);}fileWriter.flush();fileReader.close();fileWriter.close();}
}

字符缓冲流

image-20221113192247909

image-20221113192631565

实现文件拷贝:

public class readerwriter {public static void main(String[] args) throws IOException {FileReader fileReader = new FileReader("D:\\桌面\\a.txt");FileWriter fileWriter = new FileWriter("D:\\桌面\\aa.txt");BufferedReader bufferedReader = new BufferedReader(fileReader);BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);String temp = "";while ((temp = bufferedReader.readLine()) != null){bufferedWriter.write(temp);bufferedWriter.newLine();}bufferedWriter.flush();bufferedReader.close();bufferedWriter.close();fileReader.close();fileWriter.close();}
}

转换流

image-20221115193320563

public class ConvertStream {public static void main(String[] args) throws IOException {BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));String s = bufferedReader.readLine();BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));bufferedWriter.write(s);bufferedWriter.flush();bufferedReader.close();bufferedWriter.close();}
}

字节流读取文件并添加行号

public class ConvertStream {public static void main(String[] args) throws IOException {BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\桌面\\a.txt")));BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\桌面\\aa.txt")));String s = "";int i = 1;while ((s = bufferedReader.readLine()) != null){bufferedWriter.write(i+++": "+s);bufferedWriter.newLine();}bufferedWriter.flush();bufferedWriter.close();bufferedWriter.close();}
}

字符输出流

节点流。

image-20221115201524367

加行号:

public class ConvertStream {public static void main(String[] args) throws IOException {BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\桌面\\a.txt")));PrintWriter printWriter = new PrintWriter("D:\\桌面\\aa.txt");String s = "";int i = 1;while ((s = bufferedReader.readLine()) != null){printWriter.println(i+++": "+s);}printWriter.close();bufferedReader.close();}
}

字节数组流

image-20221115203535081

public static void main(String[] args) throws IOException {byte[] bytes = "abcdefg".getBytes();ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);StringBuilder stringBuilder = new StringBuilder();//stringBuilder可以使用append的方法不断地添加元素创建字符串int temp = 0;while ((temp = byteArrayInputStream.read()) != -1){stringBuilder.append((char)temp);}System.out.println(stringBuilder.toString());
}

image-20221115204702047

public static void main(String[] args) throws IOException {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byteArrayOutputStream.write('a');byteArrayOutputStream.write('b');byteArrayOutputStream.write('c');byte[] arr = byteArrayOutputStream.toByteArray();for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}
}

数据流

image-20221115210439566

image-20221115210446615

public static void main(String[] args) throws IOException {DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\桌面\\a1.txt")));dos.writeInt(1);dos.writeChar('a');dos.writeDouble(9.99);dos.writeUTF("houyiming");dos.flush();dos.close();DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("D:\\桌面\\a1.txt")));// 注意:读取的顺序要与写入的顺序一致。System.out.println(dis.readInt());System.out.println(dis.readChar());System.out.println(dis.readDouble());System.out.println(dis.readUTF());
}

对象流

image-20221116185152801

对象的序列化和反序列化

image-20221116185241793

序列化:将java对象转化为字节序列

反序列化:将字节序列还原为java对象

image-20221116185556346

image-20221116185705305

操作基本数据类型

之前学的数据流只能对基本数据类型进行操作,但是对象流不仅可以操作基本数据类型,还可以操作Java对象。

public static void main(String[] args) throws IOException {ObjectOutputStream objectOutputStream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\桌面\\a1.txt")));objectOutputStream.writeInt(1);objectOutputStream.writeBoolean(true);objectOutputStream.writeChar('a');objectOutputStream.writeUTF("aaaaaaaaaaa");objectOutputStream.flush();ObjectInputStream objectInputStream = new ObjectInputStream(new BufferedInputStream(new FileInputStream("D:\\桌面\\a1.txt")));// 读出的顺序要与写入的顺序一致System.out.println(objectInputStream.readInt());System.out.println(objectInputStream.readBoolean());System.out.println(objectInputStream.readChar());System.out.println(objectInputStream.readUTF());objectInputStream.close();objectOutputStream.close();
}

操作对象

public static void main(String[] args) throws IOException, ClassNotFoundException {ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\桌面\\a2.txt"));Users users = new Users(1,"hym","22");objectOutputStream.writeObject(users); // 序列化到外部objectOutputStream.flush();ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\桌面\\a2.txt"));// 反序列化Users users1 = (Users) objectInputStream.readObject();System.out.println(users1.toString());objectInputStream.close();objectOutputStream.close(); 
}

随机访问流

image-20221116201017668

3个核心的方法:

image-20221116202221096

public static void main(String[] args) throws IOException, ClassNotFoundException {RandomAccessFile randomAccessFile = new RandomAccessFile("D:\\桌面\\aa.txt","rw");// 将数据写入文件int[] ints = new int[]{1,2,3,4,5,6,7,8,9,10};for (int i = 0; i < ints.length; i++) {randomAccessFile.writeInt(ints[i]);}randomAccessFile.seek(4);//整数占4个字节,将指针移动到4,为2的第一个字节。System.out.println(randomAccessFile.readInt());// 在第八个字节位置替换randomAccessFile.seek(8);randomAccessFile.writeInt(33);randomAccessFile.close();
}

ApacheIO包

下载与添加commons-IO包

下载地址:Commons IO – Download Apache Commons IO

image-20221116204813754

选择commons-io-2.11.0.jar加入即可

这个地方显示即为成功

image-20221116205148136

FileUtils的使用

image-20221116205336679

image-20221116205403537

image-20221116205519925

读取txt文件并以字符串形式输出:

public static void main(String[] args) throws IOException {String s = FileUtils.readFileToString(new File("D:\\桌面\\a.txt"),"utf-8");System.out.println(s);
}

IOUtils的使用

image-20221116211000999

image-20221116211043442

image-20221116211135493toString方法的使用:

public static void main(String[] args) throws IOException {String s = IOUtils.toString(new FileInputStream("d:\\桌面\\a.txt"),"utf-8");System.out.println(s);
}

总结

image-20221116211621290

image-20221116211640282

image-20221116211654354

image-20221116211749378

image-20221116211847790

相关内容

热门资讯

适合小本创业项目 适合小本创业... 小本创业者最好选择无店铺经营项目,从小事开始干起,才能成就大事业,无店铺经营项目可以为创业前期节约大...
2018创业者最值得选择的小本... 3、内容创业在微博计划投入1.5亿扶持自媒体时,今日头条也推出了“千人万元计划”,为创作者提供万元“...
南宁创业 南宁创业 南宁创业扶...   南宁创业好项目1:早餐早点式样设计提示:1主食:面包、包子、馒头或其他糕点;2副食:咸菜或其他特...
上个月,在南宁的创业圈发生了一... GAME—BIKE我们首先带来的是“GAME—BIKE”。懂英语的一看就知道,这是个跟游戏跟自行车有...
为何95后都选择了创业小项目 ... 文|懂懂笔记“我还是选择和朋友一起创业,毕竟自由一些,也能够发挥专长。”今年春节后,计算机专业毕业的...
京喜无货源 2个月做到单店80... 大家好,我是大喵!直接步入正题,说白了大多数人创业的初衷就是赚钱,官方一点的说话就是实现经济独立和人...
【推荐】早餐店创业计划书 【推... 【推荐】早餐店创业计划书-word范文本文部分内容来自网络,本司不为其真实性负责,如有异议或侵权请及...
响水县小尖全民创业园项目 响水... 加强社会面控制能力,构建侦查网络化管理;积极组织民警进社区、进企业,开展矛盾化解调处工作;结对帮扶,...
响水县人民政府 镇区动态 小尖... 到5月底,小尖镇全民创业园二期工程已基本告竣,这是该镇精心打造全民创业高地的重要举措。该创业园已成为...
县城创业小项县城创业小项目搜索... 从一个创业者的角度我们看当前的经济形势,并没有发现当下的创业环境有什么根本性的改观。所以说,对待20...