文章目录

  • File类
    • File类常见的构造器
      • java默认的相对路径
      • 路径分割符
    • File常用方法
      • File类的判断方法
      • File类的创建功能
  • JAVA的IO
    • 流的分类
      • **按操作数据单位不同分为**
      • **按数据流的流向不同分为**
      • **按流的角色的不同分为**
    • 操作步骤
    • InputStream
      • 常用方法
      • 示例
    • Reader
      • 常用的方法
    • OutputStream
      • 常用方法
      • 图片的复制示例
    • Writer
      • 示例
    • 缓冲流
      • 示例
    • 转换流
      • InputStreamReader
        • 构造函数
        • 示例
      • OutputStreamWriter
        • 构造函数
        • 示例
    • 字符编码
      • GBK的问题解决
      • Unicode的问题和解决
  • 其他流
    • 标准输入输出流

File类

java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关

File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。 如果需要访问文件内容本身,则需要使用输入/输出流。

想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对 象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。

File可以表示文件,目录。但是不能读取和写入文件。读取和写入属于IO操作

File类常见的构造器

构造函数 描述
public File(String pathname) 以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果 pathname是相对路径,则默认的当前java文件相对。 绝对路径:是一个固定的路径,从盘符开始 。 相对路径:是相对于某个位置开始
public File(String parent,String child) 以parent为父路径,child为子路径创建File对象。
public File(File parent,String child) 根据一个父File对象和子文件路径创建File对
public class FileTest {public static void main(String[] args) {//        第一种构造器File file1 = new File("D:\\myeclipse");System.out.println("文件的名字"+file1.getName());//        第二种构造器File file2 = new File("D:\\myeclipse","binary");System.out.println("是否是目录"+file2.isDirectory());//        第三种File file3 = new File(file1,"notice.html");System.out.println("file3文件的大小"+file3.length());}
}

上面说相对路径

java默认的相对路径

指的就是该项目存放的位置

public class FileTest {public static void main(String[] args) {//        java的默认相对位置就是当前项目存放的位置File file4 = new File("pom.xml");System.out.println(file4.length());}
}

路径分割符

路径中的每级目录之间用一个路径分隔符隔开。

路径分隔符和系统有关:

windows和DOS系统默认使用“\”来表示

UNIX和URL使用“/”来表示

Java程序支持跨平台运行,因此路径分隔符要慎用。

public static final String separator。根据操作系统,动态的提供分隔符。

File file2 = new File("d:" + File.separator + "atguigu" + File.separator + "info.txt");

File常用方法

方法 描述
public String getAbsolutePath() 获取绝对路径
public String getPath() 获取路径
public String getName() 获取名称
public String getParent() 获取上层文件目录路径。若无,返回null
public long length() 获取文件长度(即:字节数)。不能获取目录的长度。
public long lastModified() 获取最后一次的修改时间,毫秒值
public String[] list() 获取指定目录下的所有文件或者文件目录的名称数组
public File[] listFiles() 获取指定目录下的所有文件或者文件目录的File数组

File类的判断方法

方法 描述
public boolean isDirectory() 判断是否是文件目录
public boolean isFile() 判断是否是文件
public boolean exists() 判断是否存在
public boolean canRead() 判断是否可读

File类的创建功能

方法 描述
public boolean createNewFile() 创建文件。若文件存在,则不创建,返回false
public boolean mkdir() 创建文件目录。如果此文件目录存在,就不创建了。 如果此文件目录的上层目录不存在,也不创建。
public boolean mkdirs() 创建文件目录。如果上层文件目录不存在,一并创建 注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目 路径下。
public boolean delete() 删除文件或者文件夹

删除注意事项:

Java中的删除不走回收站。 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录

JAVA的IO

每年的谷歌都有IO大会(开放中创新),了解一下 。

java中的IO:

I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于 处理设备之间的数据传输。如读/写文件,网络通讯等。

Java程序中,对于数据的输入/输出操作以“流(stream)” 的 方式进行。

java.io包下提供了各种“流”类和接口,用以获取不同种类的 数据,并通过标准的方法输入或输出数据。

流的分类

按操作数据单位不同分为

字节流(8 bit),字符流(16 bit)

**字节流:**一般用于处理图片,视频等

**字符流:**处理文件。

按数据流的流向不同分为

输入流,输出流

**输入流input:**读取外部数据(磁 盘、光盘等存储设备的数据)到 程序(内存)中。

**输出output:**将程序(内存) 数据输出到磁盘、光盘等存储设 备中。

按流的角色的不同分为

节点流,处理流

**节点流:**表示其他设备直接向内存中进行操作

**处理流:**表示在节点流之上在做一层处理的操作。可以使流的效率提高

Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个 抽象基类派生的。

由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

下面主要介绍这些实现类

操作步骤

File类的实例化:先找到指定的文件

流实现类的加载文件

读写操作

资源的关闭。确保资源的使用,用完就关闭

InputStream

常用方法

方法 描述
int read() 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因 为已经到达流末尾而没有可用的字节,则返回值 -1。
int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。如果因为已 经到达流末尾而没有可用的字节,则返回值 -1。否则以整数形式返回实际读取 的字节数。
int read(byte[] b, int off,int len) 将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取 的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于 文件末尾而没有可用的字节,则返回值 -1。
public void close() throws IOException 关闭此输入流并释放与该流关联的所有系统资源。

示例

这个示例中展示了输入流

讲文件内容输入到内存中,从而在内存中进行打印

public class FileTest {public static void main(String[] args) {//        java的默认相对位置就是当前项目存放的位置File file4 = new File("C:\\Users\\HP\\Desktop\\ByteTest.txt");//        可以看到checked异常处理try {InputStream inputStream = new FileInputStream(file4);System.out.println("开始字节文件输出");int read = inputStream.read();while (read != -1) {System.out.print((char) read);read = inputStream.read();}inputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}try {FileReader fileReader = new FileReader(file4);System.out.println("开始字符流输出");int read = fileReader.read();while (read != -1) {System.out.print((char) read);read = fileReader.read();}fileReader.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

上面我们同时使用了字节流和字符流对全是英文的内容做处理

接下来我们换成中文试一试。

发现结果变为,字节流产生乱码,字符流可以进行完整打印

Reader

常用的方法

方法 描述
int read() 读取单个字符。作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff)(2个 字节的Unicode码),如果已到达流的末尾,则返回 -1
int read(char[] cbuf) 将字符读入数组。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。
int read(char[] cbuf,int off,int len) 将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读len个字 符。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。
public void close() throws IOException 关闭此输入流并释放与该流关联的所有系统资源。

合理的使用上面的方法,即可完成对应的操作

OutputStream

常用方法

方法 描述
void write(int b) 将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写 入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 即写入0~255范围的。
void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。write(b) 的常规协定是:应该 与调用 write(b, 0, b.length) 的效果完全相同。
void write(byte[] b,int off,int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
public void flush()throws IOException 刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立 即写入它们预期的目标。
public void close() throws IOException 关闭此输出流并释放与该流关联的所有系统资源。

图片的复制示例

package FileTest;import java.io.*;public class pictureCope {public static void main(String[] args) {//        创建以file表示指定的图片File file = new File("C:\\Users\\HP\\Desktop\\mr.jpg");//        再次创建file,此时指定的文件不存在。
//        默认当指定不存在的文件会进行创建File file01 = new File("C:\\Users\\HP\\Desktop\\mr01.jpg");//        因为是图片等需要使用字节流try {//            字节流的输入流FileInputStream fileInputStream = new FileInputStream(file);FileOutputStream fileOutputStream = new FileOutputStream(file01);//            先去进行一点一点的读取,读取的时候进行传入int read = fileInputStream.read();while (read !=-1){fileOutputStream.write(read);read = fileInputStream.read();}fileInputStream.close();fileOutputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e){e.getMessage();}}
}

Writer

方法 描述
void write(int c) 写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。 即 写入0 到 65535 之间的Unicode码。
void write(char[] cbuf) 写入字符数组。
void write(char[] cbuf,int off,int len) 写入字符数组的某一部分。从off开始,写入len个字符
void write(String str) 写入字符串。
void write(String str,int off,int len) 写入字符串的某一部分。
void flush() 刷新该流的缓冲,则立即将它们写入预期目标。
public void close() throws IOException 关闭此输出流并释放与该流关联的所有系统资源。

示例

public class ReadTest {public static void main(String[] args) {File file = new File("C:\\Users\\HP\\Desktop\\ByteTest.txt");try {FileWriter fileWriter = new FileWriter(file);System.out.println("指定写入的内容:");fileWriter.write("加油华为,5G领导者");fileWriter.close();} catch (IOException e) {e.printStackTrace();}}
}

根据结果发现,确实写入了

但是内容被覆盖了。想要不覆盖。在构造函数中设置参数

FileWriter fileWriter = new FileWriter(file,true);

缓冲流

为了提高数据读写的速度,Java API提供了带缓冲功能的流类,

在使用这些流类 时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区。

缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:

字节流对应的:BufferedInputStream 和 BufferedOutputStream

字符流对应的:BufferedReader 和 BufferedWriter

示例

在图片复制基础上进行添加代码

package FileTest;import java.io.*;public class pictureCope {public static void main(String[] args) {//        创建以file表示指定的图片File file = new File("C:\\Users\\HP\\Desktop\\mr.jpg");//        再次创建file,此时指定的文件不存在。
//        默认当指定不存在的文件会进行创建File file01 = new File("C:\\Users\\HP\\Desktop\\mr02.jpg");//        因为是图片等需要使用字节流try {
//            字节流的输入流FileInputStream fileInputStream = new FileInputStream(file);
//             字节的输出流FileOutputStream fileOutputStream = new FileOutputStream(file01);//            添加缓冲流
//            输入流的缓冲,讲输入流带入BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);//            先去进行一点一点的读取,读取的时候进行传入int read = bufferedInputStream.read();while (read !=-1){bufferedOutputStream.write(read);read = bufferedInputStream.read();}//            先关闭最外层的缓冲流,在关闭内部的节点流bufferedInputStream.close();bufferedOutputStream.close();fileInputStream.close();fileOutputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e){e.getMessage();}}
}

根据结果确实实现功能。缓冲流可以提高效率

注意

关闭流的顺序和打开流的顺序相反。只要关闭最外层流即可,关闭最外层流也 会相应关闭内层节点流

如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷 新缓冲区,关闭后不能再写出

转换流

转换流提供了在字节流和字符流之间的转换

Java API提供了两个转换流:

  1. InputStreamReader:将InputStream转换为Reader
  2. OutputStreamWriter:将Writer转换为OutputStream

字节流中的数据都是字符时,转成字符流操作更高效。

InputStreamReader

实现将字节的输入流按指定字符集转换为字符的输入流。

构造函数

public InputStreamReader(InputStream in)

public InputSreamReader(InputStream in,String charsetName)

第二种指定类转换的字符编码

示例

//            讲字节流的输入流转换为字符流的输入流InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);

OutputStreamWriter

实现将字符的输出流按指定字符集转换为字节的输出流。

构造函数

public OutputStreamWriter(OutputStream out)

public OutputSreamWriter(OutputStream out,String charsetName)

示例

//            讲字节流的输出流转换为字符流的输出流OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);

字符编码

编码表的由来

计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识 别各个国家的文字。就将各个国家的文字用数字来表示,并一一对应,形成一张表。 这就是编码表。

常见的编码表

ASCII:美国标准信息交换码。 用一个字节的7位可以表示。

ISO8859-1:拉丁码表。欧洲码表 用一个字节的8位表示。

GB2312:中国的中文编码表。最多两个字节编码所有字符

GBK:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码

Unicode:国际标准码,融合了目前人类使用的所有字符。为每个字符分配唯一的 字符码。所有的文字都用两个字节来表示。

UTF-8:变长的编码方式,可用1-4个字节来表示一个字符。

GBK的问题解决

因为GBK表示中文的字符编码,一个字符最多使用两个字节。

但是当计算机中存在两个字节的时候。

如何判断它算是一个字符还是两个字符

通过第一个字节上面的其实数组是0或1。0表示一个字符1表示1两个字符

Unicode的问题和解决

这一段可以去看一看硅谷的课程,讲的特别生动。

其他流

流的分布存在很多,感兴趣可以多了解亿点点

标准输入输出流

System.in和System.out分别代表了系统标准的输入和输出设备

默认输入设备是:键盘,输出设备是:显示器

System.in的类型是InputStream

System.out的类型是PrintStream,其是OutputStream的子类 FilterOutputStream 的子类

在最开始我们经常使用的输入输出

  Scanner sc = new Scanner(System.in);System.out.println("请输入信息");

1.8(java高级特性)file文件与IO相关推荐

  1. java练气期(2)----java高级(File类与IO流)

    什么是File类 即Java文件类以抽象的方式代表文件名和目录路径名.该类主要用于文件和目录的创建.文件的查找和文件的删除等. File类常用方法 delete()删除此抽象路径名表示的文件和目录. ...

  2. JAVA高级特性(六)——IO流(第一讲)

    一.File 类概述和构造方法 File:它是文件和目录路径名的抽象表示 **文件和目录时可以通过File封装成对象: ** 对于File而言,其封装的并不是一个真正的存在的文件,仅仅是一个路径名而已 ...

  3. JAVA高级特性(六)——IO流(第二讲)

    四.字符流 4.1  出现字符流的原因 由于字符流操作操作汉字的读写不是很方便,所以引用了字符流.汉字在不同编码中所占的字节数不同,常用有GBK(占两个字节).UIT-8(占三个字节),特别注意汉字不 ...

  4. Java 高级特性 --- 反射

    From:Java 高级特性 --- 反射:https://www.jianshu.com/p/9be58ee20dee From:Java 基础之 --- 反射(非常重要):https://blog ...

  5. Educoder–Java高级特性(第一章)- IO流【笔记+参考代码】

    Educoder–Java高级特性(第一章)- IO流[笔记+参考代码] 第一关 1.下列关于字节和字符的说法正确的是(BC) A.字节 = 字符 + 编码 B.字符 = 字节 + 编码 C.字节 = ...

  6. Java学习之java高级特性

    From:https://blog.csdn.net/w252064/article/details/79923999 [Java高级特性详解]:https://blog.csdn.net/qq_37 ...

  7. (小白学JAVA之)Java高级特性知识点梳理

    Java高级特性知识点梳理 集合框架和泛型 List接口 ArrayList ArrayList类的常用方法 具体实现步骤 LinkedList LinkedList类的常用方法 具体实现步骤 Set ...

  8. Educoder -Java高级特性 - IO流 4关

    Educoder -Java高级特性 - IO流 第一关 第二关:本关任务:使用输入输出流读写文件. 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下: ...

  9. Java高级特性增强-多线程

    请戳GitHub原文: https://github.com/wangzhiwub... 大数据成神之路系列: 请戳GitHub原文: https://github.com/wangzhiwub... ...

  10. 头歌Educoder——Java高级特性 - JDBC(上)

    第1关:JDBC连接数据库 任务描述 本关任务:使用jdbc连接数据库并完成创建数据库和创建表的操作. 相关知识 JDBC API提供以下接口和类: DriverManager:此类管理数据库驱动程序 ...

最新文章

  1. java new关键字
  2. AKI-H8串口通信
  3. C#位运算讲解与示例
  4. “6亿元入股锤子”项目涉嫌国资流失被调查?官方回应来了
  5. 【kafka】利用 InfoSphere Data Replication CDC for Kafka 实现高效数据复制
  6. spring学习--jdbcTemplate - 增删改
  7. Design System 中的 Design Token
  8. catia v5法矢数据软件_CATIA V5 Start Model车身建模
  9. 廖湖声c语言第二版电子版PDF,写给大家看的c语言书(第2版)
  10. 期货市场十赌九输,钱都去哪里了?
  11. java关于文件上传和下载,保存到后台并修改名字。
  12. 音频合并的步骤有哪些
  13. 汽修第5天 升降玻璃的维修
  14. 微信公众号自定义分享注意事项
  15. 2020 年百度之星·程序设计大赛 - 初赛一题解
  16. 什么是非拜占庭错误?什么是拜占庭错误?
  17. 并列句(2021-07-25)
  18. tcpdump manual 中文翻译
  19. python实现共轭梯度法
  20. 盒子阴影 – box-shadow

热门文章

  1. 开一家300平方米的亲子乐园需要多少钱?看完你就懂了!
  2. 【UE4-B站殷雷老师视频】16.5期优化
  3. Android 设备接入扫码枪
  4. vue 实现类似淘宝的商品详情页的商品展示
  5. 【微信交流分享群】百度集卡支付宝敬业福百度互助群/春晚红包/集卡换卡组队互助花花卡...
  6. 天猫上不靠谱的商品价格
  7. linux 桌面时钟
  8. php eol 没有换行,php_eol没有换行怎么办
  9. 前端工具:好用的配色网站推荐
  10. sql 排序时如何加条件进行排序