一、JAVA IO

  • java io 可以让我们用标准的读写操作来完成对不同设备的读写数据工作。
  • java将io按照方向划分为输入与输出,参照点是我们写的程序。
  • 输入:用来读取数据的,是从外界到程序的方向,用于获取数据。
  • 输出:用来写出数据的,是从程序到外界的方向,用于发送数据。

java将IO比喻为“流”,即:stream,就像生活中的"电流","水流"一样,它是以同一个方向顺序移动的过程。只不过这里流动的是字节(2进制数据)。所以在IO中有输入流和输出流之分,我们理解他们是连接程序与另一端的“管道”,用于获取或发送数据到另一端

1、JAVA定义了了两个超类(抽象类):

  • java.io.InputStream:所有字节输入流的超类,其中定义了读取数据的方法,因此将来不管读取的是什么设备(连接该设备的流)都有这些读取的方法,因此我们可以用相同的方法读取不同设备中的数据。
  • java.io.OutputStream:所有字节输出流的超类,其中定义了写出数据的方法。

2、JAVA将流分为两类:节点流与处理流

  • 节点流:也称为低级流。节点流的另一端是明确的,是实际读写数据的流,读写一定是建立在节点流的基础上进行的
  • 处理流:也成高级流。处理流不能独立存在,必须连接在其他流上,目的是当数据流经当前流时对数据进行加工处理来简化我们对该数据的操作

实际应用中,我们可以铜锅串联一组高级流到某个低级流上以流水线式的加工处理对某设备的数据进行读写,这个过程也称为流的连接,这也是IO的精髓所在。

二、文件流

文件流是一对低级流,用于读写文件数据的流,用于连接程序与文件(硬盘)的“管道”,负责读写文件数据。

1、文件输出流:java.io.FileOutputStream

package io;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class FOSDemo {public static void main(String[] args) throws IOException {//需求:向当前目录的文件fos.dat中写入数据/*在创建文件输出流时,文件输出流常见的构造器:FileOutputStream(String filename)FileOutputStream(File file)上述两种构造器都会在创建时将该文件创建出来(如果该文件不存在才会这样做),自动创建该文件的前提是该文件所在的目录必须存在,否则会抛出异常。*///        File file = new File("./fos.dat");//        FileOutputStream fos = new FileOutputStream(file);/*一个小技巧:在指定相对路径时,如果是从"当前目录"(./)开始的,那么"./"是可以忽略不写的因为在相对路径中,默认就是从"./"开始*/
//        FileOutputStream fos = new FileOutputStream("./fos.dat");FileOutputStream fos = new FileOutputStream("fos.dat");//与上面一句位置相同/*OutputStream(所有字节输出流的超类)中定义了写出字节的方法:write(int d)write(byte[] data)write(byte[] data,int offset,int len)其中:void write(int d)写出一个字节,将给定的参数int值对应的2进制的"低八位"写出。文件输出流继承OutputStream后就重写了该方法,作用是将该字节写入到文件中。*//*向文件中写入1个字节fow.write(1)将int值的1对应的2进制的"低八位"写如到文件第一个字节位置上1个int值占4个字节,每个字节是一个8为2进制int 1的2进制样子:00000000 00000000 00000000 00000001^^^^^^^^写出的字节write方法调用后,fos.dat文件中就有了1个字节,内容为:00000001再次调用:fos.write(2)int 2的2进制样子:00000000 00000000 00000000 00000010^^^^^^^^写出的字节write方法调用后,fos.dat文件中就有了2个字节,内容为:00000001 00000010上次写的   本次写的*/fos.write(1);fos.write(2);System.out.println("写出完毕!");//注意!流使用完毕后要关闭,来释放底层资源fos.close();}
}

2、文件输入流

package io;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;/*** 使用文件输入流读取文件中的数据*/
public class FISDemo {public static void main(String[] args) throws IOException {//将fos.dat文件中的字节读取回来/*fos.dat文件中的数据:00000001 00000010*/FileInputStream fis = new FileInputStream("fos.dat");/*java.io.InputStream(所有字节输入流的超类)定义着读取字节的相关方法int read()读取1个字节并以int型整数返回读取到的字节内容,返回的int值中对应的2进制的"低八位"就是读取到的数据。如果返回的int值为整数-1(这是一个特殊值,32位2进制全都是1)表达的是流读取到了末尾了。int read(byte[] data)文件输入流重写了上述两个方法用来从文件中读取对应的字节。*//*fos.dat文件中的数据:00000001 00000010^^^^^^^^第一次读取的字节当我们第一次调用:int d = fis.read();//读取的是文件中第一个字节该int值d对应的2进制:00000000 00000000 00000000 00000001|------自动补充24个0-------| ^^^^^^^^读取到的数据而该2进制对应的整数就是1.*/int d = fis.read();//读取到的就是整数1System.out.println(d);/*fos.dat文件中的数据:00000001 00000010^^^^^^^^第二次读取的字节当我们第二次调用:d = fis.read();//读取的是文件中第二个字节该int值d对应的2进制:00000000 00000000 00000000 00000010|------自动补充24个0-------| ^^^^^^^^读取到的数据而该2进制对应的整数就是2.*/d = fis.read();//2System.out.println(d);/*fos.dat文件中的数据:00000001 00000010 文件末尾^^^^^^^^没有第三个字节当我们第三次调用:d = fis.read();//读取到文件末尾了!该int值d对应的2进制:11111111 11111111 11111111 11111111该数字是正常读取1个字节永远表达不了的值。并且-1的2进制格式好记。因此用它表达读取到了末尾。*/d = fis.read();//-1System.out.println(d);fis.close();}
}

三、文件复制

package io;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*** 利用文件输入流与输出流实现文件的复制操作*/
public class CopyDemo {public static void main(String[] args) throws IOException {//用文件输入流读取待复制的文件
//        FileInputStream fis = new FileInputStream("image.jpg");FileInputStream fis = new FileInputStream("01.rmvb");//用文件输出流向复制文件中写入复制的数据
//        FileOutputStream fos = new FileOutputStream("image_cp.jpg");FileOutputStream fos = new FileOutputStream("01_cp.rmvb");/*原文件image.jpg中的数据10100011 00111100 00001111 11110000....^^^^^^^^读取该字节第一次调用:int d = fis.read();d的2进制:00000000 00000000 00000000 10100011读到的字节fos向复制的文件image_cp.jpg中写入字节第一次调用:fos.write(d);作用:将给定的int值d的2进制的"低八位"写入到文件中d的2进制:00000000 00000000 00000000 10100011写出字节调用后image_cp.jpg文件数据:10100011*//*循环条件是只要文件没有读到末尾就应该复制如何直到读取到末尾了呢?前提是:要先尝试读取一个字节,如果返回值是-1就说明读到末尾了如果返回值不是-1,则说明读取到的是一个字节的内容,就要将他写入到复制文件中*/int d;//先定义一个变量,用于记录每次读取到的数据long start = System.currentTimeMillis();//获取当前系统时间while ((d = fis.read()) != -1) {fos.write(d);}long end = System.currentTimeMillis();System.out.println("复制完毕!耗时:" + (end - start) + "ms");fis.close();fos.close();}
}

四、快读写的文件复制操作

int read(byte[] data)一次性从文件中读取给定的字节数组总长度的字节量,并存入到该数组中。

返回值为实际读取到的字节量。若返回值为-1则表示读取到了文件末尾。

块写操作void write(byte[] data)一次性将给定的字节数组所有字节写入到文件中

void write (byte[] data,int offset,int len)一次性将给定的字节数组从下标offset处开始的连续len个字节写入文件

package io;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*** 通过提高每次读写的数据,减少读写次数可以提高读写效率。*/
public class CopyDemo2 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("01.rmvb");FileOutputStream fos = new FileOutputStream("01_cp.rmvb");/*块读:一次性读取一组字节块写:一次性将写出一组字节java.io.InputStream上定义了块读字节的方法:int read(byte[] data)一次性读取给定字节数组length个字节并从头开始装入到数组中。返回值为实际读取到的字节量如果返回值为-1则表示流读取到了末尾。文件流重写了该方法,作用是块读文件里的数据。java.io.OutputStream上定义了块写字节的方法:void write(byte[] data)一次性将给定的字节数组中所有的字节写出。void write(byte[] data,int offset,int len)一次性将给定的字节数组data中从下标offset处开始的连续len个字节写出。原文件数据(假设文件共6个字节):11110000 00001111 01010101 11111111 00000000 10101010byte[] buf = new byte[4];//创建一个长度为4的字节数组buf默认的样子(每个元素若以2进制表现):{00000000,00000000,00000000,00000000}int len;//记录每次实际读取的字节数当第一次调用:len = fis.read(buf);由于字节数组buf的长度为4.因此可以一次性最多从文件中读取4个字节并装入到buf数组中返回值len表示的整数是这次实际读取到了几个字节。原文件数据(假设文件共6个字节):11110000 00001111 01010101 11111111 00000000 10101010^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^第一次读取的4个字节buf:{11110000,00001111,01010101,11111111}len:4 表示本次读取到了4个字节第二次调用:len = fis.read(buf);原文件数据(假设文件共6个字节):11110000 00001111 01010101 11111111 00000000 10101010 文件末尾了^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^本次实际只能读取到2个字节buf:{00000000,10101010,01010101,11111111}|本次新读的2字节数据| |---上次的旧数据---|len:2表示本次实际只读取到了2个字节。它的意义就是告诉你buf数组中前几个字节是本次真实读取到的数据第三次调用:len = fis.read(buf);原文件数据(假设文件共6个字节):11110000 00001111 01010101 11111111 00000000 10101010 文件末尾了^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^buf:{00000000,10101010,01010101,11111111} 没有任何变化!len:-1 表示本次读取时已经是文件末尾了!!*//*00000000 8位2进制 1byte  1字节1024byte = 1kb1024kb = 1mb1024mb = 1gb1024gb = 1tb*//*编译完该句代码:byte[] buf = new byte[10240];在实际开发中,有时候用一个计算表达式更能表现这个值的含义时,我们不妨使用计算表达式long t = 864000000;long t = 60 * 60 * 24 * 1000;*/byte[] buf = new byte[1024 * 10];//10kbint len;//记录每次实际读取到的字节数long start = System.currentTimeMillis();while ((len = fis.read(buf)) != -1) {fos.write(buf, 0, len);}long end = System.currentTimeMillis();System.out.println("复制完毕,耗时:" + (end - start) + "ms");fis.close();fos.close();}
}

五、写文本数据

String提供方法:byte[] getBytes(String charsetName)将当前字符串转换为一组字节

参数为字符集的名字,常用的是UTF-8。其中中文3字节表示1个,英文1字节表示1个

package io;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;/*** 使用文件输出流向文件中写入文本数据*/
public class WriteStringDemo {public static void main(String[] args) throws IOException {/*1:创建一个文件输出流2:将写出的文字先转换为2进制(一组字节)3:关闭流文件流有两种创建方式:1:覆盖模式,对应的构造器:FileOutputStream(String filename)FileOutputStream(File file)所谓覆盖模式:文件流在创建是若发现该文件已存在,则会将该文件原内容全部删除。然后在陆续将通过该流写出的内容保存到文件中。        */FileOutputStream fos = new FileOutputStream("fos.txt",true);String line = "让我再看你一遍,从南到北。";/*String提供了将内容转换为一组字节的方法:getBytes()java.nio.charset.StandardCharsets*/byte[] data = line.getBytes(StandardCharsets.UTF_8);fos.write(data);line = "像是北五环路蒙住的双眼。";data = line.getBytes(StandardCharsets.UTF_8);fos.write(data);       System.out.println("写出完毕!");fos.close();}
}

六、文件输出流-追加模式

重载的构造方法可以将文件输出流创建为追加模式

  • FileOutputStream(String path,boolean append)

  • FileOutputStream(File file,boolean append)

当第二个参数传入true时,文件流为追加模式,即:指定的文件若存在,则原有数据保留,新写入的数据会被顺序的追加到文件中

package io;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;/*** 使用文件输出流向文件中写入文本数据*/
public class WriteStringDemo {public static void main(String[] args) throws IOException {/*1:创建一个文件输出流2:将写出的文字先转换为2进制(一组字节)3:关闭流文件流有两种创建方式:1:覆盖模式,对应的构造器:FileOutputStream(String filename)FileOutputStream(File file)所谓覆盖模式:文件流在创建是若发现该文件已存在,则会将该文件原内容全部删除。然后在陆续将通过该流写出的内容保存到文件中。2:追加模式,对应的构造器FileOutputStream(String filename,boolean append)FileOutputStream(File file,boolean append)当第二个参数为true时,那么就是追加模式。所谓追加模式:文件流在创建时若发现该文件已存在,则原内容都保留。通过当前流陆续写出的内容都会被陆续追加到文件末尾。*/FileOutputStream fos = new FileOutputStream("fos.txt",true);String line = "斯国一!";byte[] data = line.getBytes(StandardCharsets.UTF_8);fos.write(data);line = "奥里给!";data = line.getBytes(StandardCharsets.UTF_8);fos.write(data);System.out.println("写出完毕!");fos.close();}
}

七、读取文本数据

package io;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;/*** 从文件中读取文本数据*/
public class ReadStringDemo {public static void main(String[] args) throws IOException {/*1:创建一个文件输入流2:从文件中将字节都读取回来3:将读取到的字节转换回字符串*/FileInputStream fis = new FileInputStream("fos.txt");byte[] data = new byte[1024];//1kbint len = fis.read(data);//块读操作,返回值表达实际读取到了多少字节System.out.println("实际读取了:"+len+"个字节");/*String提供了构造方法可以将一个字节数组还原为字符串String(byte[] data,Charset charset)将给定的字节数组data中所有字节按照给定的字符集转换为字符串。String(byte[] data,int offset,int len,Charset charset)将给定的字节数组data从下标offset处开始的连续len个字节按照指定的字符集转换为字符串*/String line = new String(data,0,len,StandardCharsets.UTF_8);System.out.println(line.length());//输出字符串长度System.out.println(line);fis.close();}
}

JAVA基础学习(二)相关推荐

  1. Java基础学习(二十七)之IO流

    1. File 1.1 File类概述和构造方法(myFile中的com.itheima_01中的FileDemo01) File:它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对 ...

  2. Java基础学习(二十一)之接口

    1. 接口 1.1 接口概述 五孔插线面板,不同品牌都能使用,因为它们遵循同样的规范来生产的.所以说接口其实就是一种公共的规范,只要符合规范,大家都可以使用. 笔记本,USB口,鼠标,键盘,U盘 接口 ...

  3. java基础学习总结(二)——开篇(转载于孤傲苍狼博主的心得体会)

    由于孤傲苍狼博主16年后,就没有更新博客了.其中有些文章看不了,挺可惜的.为了避免后续文章也会有类似情况,因此,他的博文基本都会转载过来,也会标注转载,做一个备份.不过文章太多,不会每篇文章都有转载于 ...

  4. mysql用创建的用户登陆并修改表格_MySQL 基础学习二:创建一个用户表,并增删改查...

    MySQL 基础学习二:创建一个用户表,并 增删改查 提示:MySQL 命令建议都用大写,因为小写运行时,还是翻译成大写的. 第一步,创建一个用户表 1,打开控制台,进入数据库 C:\Users\Ad ...

  5. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  6. Java基础学习:尚硅谷项目三 开发团队调度软件

    Java基础学习:尚硅谷项目三 开发团队调度软件 一.软件功能与结构设计 1. 软件功能 该软件实现以下功能: 软件启动时,根据给定的数据创建公司部分成员列表(数组) 根据菜单提示,基于现有的公司成员 ...

  7. Java基础学习——第十四章 网络编程

    Java基础学习--第十四章 网络编程 一.网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信 ...

  8. Java基础学习(9)

    Java基础学习 一.常用方法(API) 1.1 Math 1.2 System 1.3 Runtime 1. 4 .object 1.5 Objects 1.6 BigInteger BigInte ...

  9. Java基础学习Day09--字符串

    Java基础学习Day09--字符串 一.简介: 二.String类字符串 三.String字符串的存储原理 四.字符串常用方法 1.equals()方法 2.字符串的搜索 3.截取子字符串 4.去除 ...

  10. Java 基础学习-Java语言概述

    Java 基础学习 第一章 Java语言概述 回顾java基础知识,进行整理记录. 文章目录 Java 基础学习 前言 一. Java语言发展史(了解) 二.Java语言跨平台原理(理解) 三.JRE ...

最新文章

  1. VMRC控制台的连接已断开..正在尝试重新连接
  2. 成员函数和成员变量分开存储
  3. Curl操作es实践
  4. spring配置xml遇到的一些错误,最后修改的版本
  5. ed是什么梗_花泽香菜不笑了什么梗怎么回事?花泽香菜为什么是宅男女神?
  6. HALCON示例程序check_blister_mixed.hedv药品胶囊缺陷检测
  7. Kafka学习(一)-------- Quickstart
  8. 建立丰富多彩的toast的简单实例
  9. 欧几里得算法和扩展欧几里得算法详解
  10. 面试官问我:解释一下Dubbo服务暴露
  11. 网络爬虫之java基础篇QueryRunner(Ⅲ)
  12. linux中文乱码解决方案
  13. LINUX 内核调试基础+编程基础
  14. 2021年6月10日08点53分 SQL注入
  15. 编译器之词法分析器(Lexical Analyzer)
  16. IMDB排名前100名经典电影
  17. android模拟器 adb 命令,安卓模拟器下 使用ADB命令
  18. 比特鹏哥网课笔记(结构体,枚举,联合体,通讯录项目)
  19. mysql中根据出生年月日计算年龄。
  20. HBuilder软件下载及安装教程

热门文章

  1. java jframe 切换_java – 在JFrame中切换面板
  2. 剪切板的使用: 复制 粘贴
  3. RC滤波分析计算——信号与系统
  4. ijkplayer点播和直播视频 问题 解决及优化,视频播放中可能有的bug
  5. 源代码管理工具——VSS详解
  6. 基于python的购物比价_python比价
  7. Vue3中watch和watchEffect监听的用法
  8. 小程序项目:基于微信小程序社区疫情防控系统——计算机毕业设计
  9. Unity3D制作触屏手机滑动动效果
  10. Campus Talking 小记(3)