JAVAIO流讲解(创建,读取,写入)

目录

概念:

io流对应的方法:

一:File方法(创建文件)

二:FileInputStream(获取字节方法)输入流

三:FileOutputStream(写入字节方法)输出流

总结:



概念:

IO流可以初步的理解为数据间的传输,我们将一组数据入:1234567,将他们从hello文件中转入haha文件中,使用程序的方法进行转入的话则需要一个一个的传入,即为一个字节一个字节的传输,我们每次只能传入或读取一个字节,这就是io流的大致流程,io流对任何类型的文件都可以进行读取。如:文本文件,图片,歌曲mp3,视频等等的。

因为io流是一个字节一个字节的传入读取的所以我们需要用到byte单字节变量来获取长度。如果获取过多的内容则需要使用对应的数组。

io流对应的方法:

所有io流方法中都需要写入相应的文件操作路径,且所有io流的方法都有一个共同的父类接口(Exception),所以我们在使用时都需要链接相对应的接口如:

public static void main(String[] args) throws Exception

一:File方法(创建文件)

声明方式:

File file1 = new File("D:\\java制作\\高级特性\\hehe.txt");

File方法主要用于创建文件,且该方法在使用的时候必须填写需要被创建的文件的具体路径,我们需要将对应的文件类型后缀也写出来,如果没有路径的话默认是文件夹的格式,创建文件的方法如下:

file.createNewFile();//创造相对应的文件
file.mkdirs();//创建文件夹

.createNewFile():当且仅当具有该名称的文件不存在时,将会在对应的路径中创建一个对应的文件

.mkdirs():当且仅当具有该名称的文件夹不存在时,将会在对应的路径中创建一个对应的文件夹

File方法既然有创建文件的方式那么自然也少不了删除于判断文件是否存在的方法。

Boolean decide = file.exists();//判断该文件是否存在
file.delete();//删除该文件

.exists():测试此路径表示的文件是否存在,如果存在则返回true否则返回false

.delete():删除由此抽象路径下的文件或文件夹

此外也有一些相对应的查看文件的方法如名称,路径,大小


System.out.println("文件名称:"+file.getName());
System.out.println("相对路径:"+file.getPath());
System.out.println("绝对路径:"+file.getAbsolutePath());
System.out.println("文件大小:"+file.length()+"字节");

.getName():根据英语词义就可得知该方法是获取相应文件的文件名。

.getPath():将相应文件的路径转换为字符串

.getAbsolutePath():将相应文件的绝对路径转换为字符串格式,与上述方法相对比更加精确。

.length():返回该文件的长度,即内部字节的长度。

二:FileInputStream(获取字节方法)输入流

声明方式:

FileInputStream fis = new FileInputStream("D:\\java制作\\高级特性\\hello.txt");

 FileInputStream用于读取文件内字节内容的方法,且该方法在使用的时候必须填写需要被创建的文件的具体路径,我们平常对内部内容进行读写的方式如下:

byte[] data = new byte[fis.available()];//获取文件内容并以字节的方式存储如byte[]数组中
System.out.println((char)fis.read());//读出相对应的字节并以char的方式输出
//使用循环遍历出全部的字节
byte[] data = new byte[fis.available()];
for (int i = 0; i < data.length; i++) {
    System.out.print((char) fis.read());
}
System.out.println((char)fis.read(data,0,data.length));

.available():读取剩余的字节数,且必须用byte[]数组来存储对应的长度,因为byte是用来对字节的专门处理,该方法读取的是字节数,虽然输出时不会出错,但方法循环中时会出错

.read():读取该文件中的第一个字节,因为是字节的格式所以我们需要用char(单字符变量)进行转换,才能将其输出,注意每次只能读取一个,且不会读出同一个位置的字节,每读完一个就会少一个,如果读完后继续进行读取就会答应出一个黑色边框的空格。也可以通过需求去调用相应下标下的字节就如上述的最后一行代码。

fis.close();

.close():关闭此文件的输入流并释放与流相关联的任何系统资源,在我们引用FileInputStream流是就已经默认打开了输入流,当我们不使用它是应将其关闭,就好比我们进入了放假需要开门,当我们进入拿走需要的文件后离开房间要关门一样,否则它会一直开着占用电脑性能

三:FileOutputStream(写入字节方法)输出流

声明方式:

FileOutputStream fos = new FileOutputStream("D:\\java制作\\高级特性\\hehe.txt");

 FileInputStream用于读取文件内字节内容的方法,且该方法在使用的时候必须填写需要被创建的文件的具体路径,我们平常对内部内容进行写入的方式如下:

String str = "天天向上";//将需要进行存储的内容存入变量
byte[] words = str.getBytes();//将字符串变为字节方式进行存储
fos.write(words);//最后通过字节的方式进行存储

.write():将指定的内容存入文件输出流再由输出流存入文件中,存入时我们需要将文件格式转换为电脑可读懂的方式,8进制字节,所以我们需要将存储的内容用byte强转为8进制字节

fos.close();//关闭输出流

.close():关闭此文件的输出流并释放与流相关联的任何系统资源,在我们引用FileInputStream流是就已经默认打开了输入流,当我们不使用它是应将其关闭,就好比我们进入了放假需要开门,当我们进入拿走需要的文件后离开房间要关门一样,否则它会一直开着占用电脑性能

总结:

他们三个有一个共同的父类接口Exception类,所以只要们调用其中一个方法时就必须链接Exception类,我们在进行文件输入与输出流传输时都会去打开对应的流,所以当我们对流的运用完毕后就需要.close()去关闭流。对于流基本操作方式不管是度还是写需要遵循:1.打开一个流 2.读或写内容 3.关闭流这三个基本操作。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IO流: Input Output 输入输出流 自己去扩展: 1. 对象序列化和反序列化生成一个 2. 流的种类: io包下 扩展nio包下 1. IO分类: 输入流 输出流 字节流 InputStream(抽象类) OutputStream(抽象类) 字符流 Reader (抽象类) Writer(抽象类) 2.字节流:(重点) * 使用场景: * 1.字节流处理除了文本、文字相关所有的流问题,如,png/jpg/avi/map4/mp3/exe * 2.字符流只处理文本、文字相关(编码乱码问题) * * 1.输入流 abstract class InputStream:这个抽象类是表示输入字节流的所有类的超类。 * | * FileInputStream 子类:文件字节输入流 * 1. 构造方法 * FileInputStream(String name) name:表示(绝对路径、相对路径)文件名 * FileInputStream(File file) * * 2. 普通方法: //1. int read(byte[] b) 从输入流读取一些字节数,并将它们存储到缓冲区 b 。 最常用 * //2. int read() 从输入流读取数据的下一个字节。 //3. int read(byte[] b, int off, int len) 从输入流读取最多 len字节的数据到一个字节数组。 * 2.输出流 abstract class OutputStream:这个抽象类是表示输出字节流的所有类的超类。 * | * FileOutputStream 子类:文件字节输出流 * 1. 构造方法 FileOutputStream(String name) name:表示(绝对路径、相对路径)文件名 FileOutputStream(String name, boolean append) append:表示是否在该文件末尾追加数据,如果为true,表示追加,false,表示从头开始覆盖 * FileOutputStream(File file) FileOutputStream(File file, boolean append) * * 2. 普通方法: //1. void write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入文件输出流。 最常用 * //2. void write(byte[] b)将 b.length个字节从指定的字节数组写入文件输出流。 //3. void write(int b) 将指定的字节写入文件输出流。 3. 注意事项: 1. 必须要关闭IO流,节约资源开销 2. 关闭IO流原则,先开后关 3. IO流工具类的抽取,将所有的关流(字节流和字符流)方法抽取出来,优化代码 4. 字符流:(重点) * 使用场景:使用于处理文本相关的文件 * * Reader 抽象类: * |子类 * InputStreamReader(转换流) * |子类 * FileReader:适用于读取字符相关的文件 * 1. 构造方法: * 1.FileReader(File file) 2.FileReader(String fileName) fileName:文件名(相对路径/绝对路径) * * 2. 读取方法: * 3. int read(char[] c)读取字符到char数组 最常用 * 2. int read()读取一个字符 * 3. int read(char[] c,int start,int length)读取制定长度的字符到char数组 * * Writer 抽象类: * |子类 * OutputStreamWriter(转换流) * |子类 * FileWriter:适用于写出字符相关的文件 * 1. 构造方法: * 1.FileWriter(File file) 默认是false 2.FileWriter(File file, boolean append) append:表示是在文件末尾追加还是从头覆盖,如果true追加,false覆盖,默认是false 3.FileWriter(String fileName) 默认是false 4.FileWriter(String fileName, boolean append) fileName:文件名(相对路径/绝对路径) * 2. 写出方法: * 1. public Writer append(CharSequence csq,int start,int end) * 2. public Writer append(char c) * 3. public Writer append(CharSequence csq) * 4. public void write(char[] c) * 5. public void write(String str) * 6. public void write(String str,int start,int end) 5. 乱码问题:(掌握) GBK: 文2个字节 英文、数字:1字节 UTF-8: 文3~6个字节 英文、数字:1字节 编码:将字符串转换为字节 * 1. byte[] getBytes() 根据默认字符集将当前字符串转换为字节数组 * 2. byte[] getBytes(String charsetName) UTF-8/GBK * 按照指定的字符集将将当前字符串转换为字节数组 * * 解码:将字节转换为字符 * 1.String(byte[] bytes, int offset, int length) * 根据默认字符集将字节数组从指定下标开始到指定长度结束的数据转换为字符串 * * 2.String(byte[] bytes, int offset, int length, String charsetName) * 根据指定字符集将字节数组从指定下标开始到指定长度结束的数据转换为字符串 * charsetName:字符集名 例如 : "GBK"、"UTF-8" 、"ISO-8859-1" * * 不常用 * 3.String(byte[] bytes) 根据默认字符集将字节数组转换为字符串 * 4.String(byte[] bytes, String charsetName) * 根据默认字符集将字节数组转换为字符串 * * 这里有乱码问题: * 产生的原因: * 1、因为字符集不统一,即编码和解码new String(b,0,read,"gbk")字符集不一致 * 2、因为字节流读取汉字的时候,字节数组长度不够,将一个汉字拆开了 * 解决: * 1. 用字符流用统一的字符集(最常用) * * 浏览器 : UTF-8 * 前台: * HTML :UTF-8 * CSS :UTF-8 * JS、JSP :UTF-8 * * 后台: * java :UTF-8 * * 数据库: * mysql、oracle、DB2 :UTF-8 * * 开发工具:UTF-8 * 2. 文本文件用统一的字符集 且用字符流读取和写出文本相关文件(最常用) * 3. 用一个大的字节数组(一般不用) 6. 转换流:(重点) 目前唯一一个可以设置字符集的流 (简单的理解为包装流,就是将字节流包装以下,方便操作文本相关的文件) * 使用场景: * 别人给提供了字节流,而需要处理文本文件,这时候,就需要用转换流转换一下,更方便处理文本文件 * * 作用:就是一字符流的方式读取或写出文本相关的数据 * * InputStreamReader:将字节输入流包装一下,让其更适合读取文本文件 * 构造方法: * 1.InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。 * 2.InputStreamReader(InputStream in, String charsetName) 创建一个使用指定字符集的InputStreamReader。 * 普通方法: * public int read(char[] cbuf) * int read(char[] cbuf, int offset, int length) * OutputStreamWriter:将字节输出流包装一下,让其更适合写出文本文件 * 构造方法: * 1. OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。 * 2. OutputStreamWriter(OutputStream out, String charsetName) 创建一个使用指定字符集的OutputStreamWriter。 普通方法: void write(char[] cbuf, int off, int len) append(CharSequence csq,int start,int end) 只有转换流可以设置字符集 7. jdk7关流的新方式: 用新结构可以自动关流 前提:该流必须是实现了一个接口 AutoCloseable 语法: try( //只能写创建流的操作,不能写其他业务操作 ){ //可能有异常的代码 }catch(异常类型1 e){ }...不需要finally关流了 8. 缓冲流:(重点)包装流 * 1.概念: 提高读取和写出效率的流 * 2.作用: 提高效率 3.使用场景:以后一律都要使用,以提高效率 建议以后都是用字节或者字符数组的方式复制文件,这样效率最高 * 4. * BufferedInputStream * 字节输入缓冲流构造方法: 1.BufferedInputStream(InputStream

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值