博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IO常用案例整理(File类、字节流、字符流)
阅读量:3949 次
发布时间:2019-05-24

本文共 8020 字,大约阅读时间需要 26 分钟。

  本篇文章主要是通过案例实现一些常见的需求来对IO知识进行整理:

文件流概览

在这里插入图片描述

  这里不再介绍的概念,直接上菜
字节流和字符流的区别:

  1. 字节流操作的基本单元是字节,而字符流操作的基本单元是Unicode码元。
  2. 字节流操作的是文件本身,没有使用到缓冲区(可以简单理解为一段内存区域)。而字符流使用到了缓冲区,通过缓冲区操作文件(这个后面可以写个案列进行说明)
  3. 字节流通常用于处理二进制数据,实际上可以处理任意类型的数据。但是它不支持直接读写Unicode码元。字符流通常用于处理文本数据。

用字节流好还是字符流好?

  两者相比较而言,字节流更加的通用,硬盘上的文件都是以字节的形式进行存储和传输,而字符只会在内存中才会形成,字符数组、字符串。在开发中,字节流的应用更加广泛。

需求案例

需求1:创建一个新的文件

/**	 * 新建文件	 */	@Test	void test1() {
//直接在D盘下新建文件 String fileName = "D:" + File.separator + "Hello.txt"; //如果需要在指定的文件夹 upload 中创建文件 //String fileName = "D:" + File.separator +upload+File.separator+ "Hello.txt"; System.out.println(fileName); File file = new File(fileName); try {
file.createNewFile(); System.out.println("已创建了新文件"); } catch (IOException e) {
e.printStackTrace(); } }

需求2:删除文件

/**	 * 删除文件	 */	@Test	void test2() {
String fileName = "D:" + File.separator + "Hello.txt"; File file = new File(fileName); if (file.exists()) {
file.delete(); System.out.println("删除了该文件"); } else {
System.out.println("该文件不存在"); } }

需求3:创建一个新的文件夹

/**	 * 创建一个文件夹	 */	@Test	void test3() {
String fileName = "D:" + File.separator + "Java"; File file = new File(fileName); if (!file.exists()) {
file.mkdirs(); System.out.println("创建了文件夹"); } else {
System.out.println("已经存在该文件夹"); } }

需求4:删除文件夹

/**	 * 删除一个文件夹	 */	@Test	void test4() {
String fileName = "D:" + File.separator + "Java"; File file = new File(fileName); if (file.exists()) {
file.delete(); System.out.println("删除了文件夹"); } else {
System.out.println("该文件夹不存在"); } }

需求5:字节流-----向文件中写入字符串

/**	 * 向文件中写入字符串	 */		@Test	void test5() throws IOException {
File file = new File("E:" + File.separator + "Hello.txt"); if (file.exists()) {
//如果文件存在,则向该文件中写入内容(直接覆盖文件中以前的内容) FileOutputStream fileOutputStream = new FileOutputStream(file); //如果希望是向文件中追加内容// FileOutputStream fileOutputStream1 = new FileOutputStream(file, true); String str = "这里是向文件中写入的内容"; byte[] bytes = str.getBytes(); fileOutputStream.write(bytes); fileOutputStream.close(); System.out.println("写入内容成功"); } else {
System.out.println("不存在该文件"); } }

需求6:字节流-----读取文件内容

  使用字节流读取内容的时候,这里记录了两种方式,最主要的区别就是方式一中,我们预先申请了一个指定大小的内存空间,但是这个空间在实际使用的过程中,可能会存在偏大或者偏小的情况,所以提倡使用方式二。这样就可以精确大小了。

/**  *	读取文件内容  */	@Test	void test6() throws IOException {
File file = new File("E:" + File.separator + "Hello.txt"); if(file.exists()){
FileInputStream inputStream = new FileInputStream(file); //方式一: /*byte[] bytes = new byte[1024]; inputStream.read(bytes); System.out.println(new String(bytes));*/ //方式二: byte[] bytes = new byte[(int) file.length()]; inputStream.read(bytes); System.out.println(new String(bytes,0,(int)file.length())); }else{
System.out.println("指定路径不存在此文件"); } }

需求7:字符流-----向文件写入字符串

/**  *	字符流---向文件写入字符串  */@Test	void test7() throws IOException {
String name = "D:" + File.separator + "Hello.txt"; File file = new File(name); FileWriter fileWriter = new FileWriter(file, true); fileWriter.write("中国"); fileWriter.close(); System.out.println("写入文件成功"); }

需求8:字符流-----读取文件内容

/**	 * 字符流	 * 

* 读取文件 */ @Test void test8() throws IOException {

String name = "D:" + File.separator + "Hello.txt"; File file = new File(name); FileReader fileReader = new FileReader(file); char[] chars = new char[(int) file.length()]; int read = fileReader.read(chars); fileReader.close(); System.out.println(new String(chars,0,read)); }

  文章开头部分在介绍字节流和字符流的时候,提到了两者对于缓冲区的使用情况,这里可以分别在使用字节流和字符流向文件写入字符串的时候,将.close关闭流的方法注释掉,然后再区分别读取两种方式的写入情况然后会发现:使用字节流的方式是成功将内容写入了,但是使用字符流的方式的时候,内容就没有写入成功,这就是因为字节流直接操作了文件本身,但是字符流是操作的缓冲区

需求9:合并文件内容

/**	 * 合并文件内容	 * 

* 将MyWorld.txt和Hello.txt中的内容合并到 merge.txt文件中 */ @Test void test9() throws IOException {

String name1 = "D:" + File.separator + "MyWorld.txt"; String name2 = "D:" + File.separator + "Hello.txt"; String name3 = "D:" + File.separator + "Merge.txt"; FileInputStream inputStream1 = new FileInputStream(name1); FileInputStream inputStream2 = new FileInputStream(name2); FileOutputStream fileOutputStream = new FileOutputStream(name3); //合并流 SequenceInputStream sequenceInputStream = new SequenceInputStream(inputStream1, inputStream2); //循环写入,如果读到文件的末尾,返回-1,如果没有返回-1,说明文件没有读完,继续读,然后写入merge.txt文件中 int temp = 0; while ((temp = sequenceInputStream.read()) != -1) {
fileOutputStream.write(temp); } //关闭流 inputStream1.close(); inputStream2.close(); fileOutputStream.close(); sequenceInputStream.close(); }

需求10:压缩文件

/**	 * 压缩文件	 *	 * @throws Exception	 */	@Test	void test10() throws Exception {
File file1 = new File("D:" + File.separator + "Hello.txt"); File file2 = new File("D:" + File.separator + "ZipFile.zip"); FileInputStream inputStream = new FileInputStream(file1); FileOutputStream fileOutputStream = new FileOutputStream(file2); ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream); zipOutputStream.putNextEntry(new ZipEntry(file1.getName())); //设置注释 zipOutputStream.setComment("hello,world!"); int temp; while ((temp = inputStream.read()) != -1) {
zipOutputStream.write(temp); } inputStream.close(); zipOutputStream.close(); }

在这里插入图片描述

需求11:解压缩单个文件

/**	 * 解压缩单个文件	 */	@Test	void test11() throws IOException {
//需要被解压缩得文件路径和文件名 File file = new File("D:" + File.separator + "Hello.zip"); //解压缩之后得文件路径和文件名 File file1 = new File("D:" + File.separator + "java.txt"); ZipFile zipFile = new ZipFile(file); //被压缩得单独文件得名称 ZipEntry entry = zipFile.getEntry("Hello.txt"); InputStream inputStream = zipFile.getInputStream(entry); FileOutputStream fileOutputStream = new FileOutputStream(file1); int temp; while ((temp=inputStream.read())!=-1){
fileOutputStream.write(temp); } inputStream.close(); fileOutputStream.close(); }

需求12:压缩多个文件

/**	 * 压缩多个文件	 */	@Test	void test12() throws IOException {
File files = new File("D:" + File.separator + "tables"); File zipFile = new File("D:" + File.separator + "ZipTables.zip"); InputStream input = null; ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFile)); //这里是设置压缩的备注 zipOutputStream.setComment("hello zip"); if (files.isDirectory()) {
//如果files是一个目录 File[] listFiles = files.listFiles(); for (int i = 0; i < listFiles.length; i++) {
input = new FileInputStream(listFiles[i]); zipOutputStream.putNextEntry(new ZipEntry(files.getName() + File.separator + listFiles[i].getName())); int temp; while ((temp = input.read()) != -1) {
zipOutputStream.write(temp); } input.close(); } } zipOutputStream.close(); }}

需求13:解压缩多个文件

/**	 * 解压缩多个文件	 */	@Test	void test13() throws Exception {
//需要被解压缩得文件 File files = new File("D:" + File.separator + "zipFiles.zip"); File outFile = null; ZipFile zipFile = new ZipFile(files); ZipInputStream zipInput = new ZipInputStream(new FileInputStream(files)); ZipEntry entry = null; InputStream inputStream = null; OutputStream output = null; while ((entry = zipInput.getNextEntry()) != null) {
System.out.println("被解压缩得文件得文件名:" + entry.getName()); outFile = new File("D:" + File.separator + entry.getName()); if (!outFile.getParentFile().exists()) {
outFile.getParentFile().mkdir(); } if (!outFile.exists()) {
outFile.createNewFile(); } inputStream = zipFile.getInputStream(entry); output = new FileOutputStream(outFile); int temp; while ((temp = inputStream.read()) != -1) {
output.write(temp); } inputStream.close(); output.close(); } }

需求14:复制文件

/**	 * 复制一个文件	 */	@Test	void test14() throws IOException {
File file = new File("D:" + File.separator + "java.txt"); File copyFile = new File("D:" + File.separator + "copy_Hello.txt"); FileInputStream inputStream = new FileInputStream(file); FileOutputStream fileOutputStream = new FileOutputStream(copyFile); int temp; while ((temp=inputStream.read())!=-1){
fileOutputStream.write(temp); } inputStream.close(); fileOutputStream.close(); }

  后面碰到其他新的常见需求后再对此文章进行补充。

转载地址:http://tjhwi.baihongyu.com/

你可能感兴趣的文章
QT多线程服务器
查看>>
Ubuntu 18.04.2 ulimit配置
查看>>
Ubuntu Mysql 安装与配置
查看>>
QT5.12 Mysql驱动未能加载问题
查看>>
现场直击|SequoiaDB@SIGMOD 2021:关注数据库的根科技存储技术
查看>>
赋能政企智慧办公,巨杉数据库与致远互联完成产品互认证
查看>>
SequoiaDB湖仓一体架构亮相 ACM SIGMOD 2021
查看>>
信通院发布第十二批大数据产品能力评测结果,巨杉数据库两款产品通过
查看>>
巨杉数据库荣获2020年度河南省科学技术进步奖
查看>>
湖仓一体提升管理效率 培育数据沃土
查看>>
报名启动!巨杉数据库 2021 湖仓一体技术大赛带你进入分布式技术的星辰大海
查看>>
python的collections
查看>>
J2ME程序开发新手入门九大要点
查看>>
双向搜索算法
查看>>
日本GAME製作方式
查看>>
移动行业术语资料
查看>>
3G到来将全面颠覆SP、CP游戏规则
查看>>
射击游戏中跟踪弹及小角度移动的开发
查看>>
播放声音文件的完整源代码
查看>>
J2ME编程最佳实践之灵活的RMS应用
查看>>