2021.11.17 Java io流 ·FileInputStream类·FileOutputStream类·文件复制

您所在的位置:网站首页 fileoutputstream转byte 2021.11.17 Java io流 ·FileInputStream类·FileOutputStream类·文件复制

2021.11.17 Java io流 ·FileInputStream类·FileOutputStream类·文件复制

2023-07-07 22:34| 来源: 网络整理| 查看: 265

io流 I:input O:output 通过IO可以完成硬盘文件的读和写 在这里插入图片描述 IO流的分类 1.按照流的方向,以内存为参照物,往内存中去,叫做输入(读)。从内存中出来,叫做输出(写)。 2.按照读取数据方式不同进行分类: ·有的流是按照字节的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位。 这种流是万能的,什么类型的文件都可以读取。包括:文本文件、图片、声音文件、视频 假设文件file.txt,采用字符流的话,读流程如下: a中国bc张三 第一次读:‘a’字符(正好读到’a’) 第二次读:'中’字符(正好读到’中’字符的一半) 第三次读:'中’字符(正好读到’中’字符的另一半)

·有的流是按照字符的方式读取数据的,一次读取一个字符,这种流是为了方便读取普通文件而存在的,这种流不能读取:图片、声音、视频等文件。只能读取纯文本文件,连word文件都无法读取。 假设文件file.txt,采用字符流的话,读流程如下: a中国bc张三 第一次读:'a’字符('a’字符在windows系统中占用1个字节。区别:char在Java中占两个字节。) 第二次读:'中’字符('中’字符在windows系统中占用2个字节。)

综上所述,流的分类:输入流、输出流、字节流、字符流

Java中所有的流都是在:java.io.*;下。 Java IO流—四大家族(都是抽象类) java.io.InputStream 字节输入流 java.io.OutputStream 字节输出流

java.io.Reader 字符输入流 java.io.Writer 字符输出流

·所有的流都实现了: java.io.Closeable接口,都是可关闭的,都有close()方法。 流毕竟是一个管道,这个是内存和硬盘之间的通道,用完之后一定要关闭。 ·所有的输出流都实现了java.io.Flushable接口,都是可刷新的,都有flush()方法。养成一个好习惯,输出流在最终输出之后,一定要记得flush()刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据强行输出完(清空管道!)刷新的作用就是清空管道。 如果没有flush(),可能会丢失数据。

注意:在java中只要“类名”以Stream结尾的都是字节流。以"Reader/Writer"结尾的都是字符流。

java.io包下需要掌握的流有16个,如下: 文件专属: java.io.FileInputStream java.io.FileOutputStream java.io.FileReader java.io.FileWriter

转换流:(将字节流转换成字符流) java.io.InputStreamReader java.io.OutputStreamWriter

缓冲流专属: java.io.BufferedReader java.io.BufferedWriter java.io.BufferedInputStream java.io.BufferedOutputStream

数据流专属: java.io.DataInputStream java.io.DataOutputStream

标准输出流: java.io.PrintWriter java.io.PrintSteam

对象专属流: java.io.ObjectInputStream java.io.ObjectOutputStream

测试代码如下:

public static void main(String[] args) {FileInputStream file = null;/*文件路径:E:\得邦照明公司\2021.11.15-11.20\11.17\新建文本文档(idea自动把\编程\\,因为Java中\表示转义)\\写成/也可以*/try {file = new FileInputStream("E:\\得邦照明公司\\2021.11.15-11.20\\11.17\\新建文本文档.txt");//开始读int readDate = file.read();//这个方法的返回值是读取到的这个"字节"本身System.out.println(readDate);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally{//finally语句块当中确保流一定关闭。if(file!=null){//避免空指针异常,且流如果是null没必要关闭。try {file.close();} catch (IOException e) {e.printStackTrace();}}} }

用while循环改进读出数据:

public static void main(String[] args) {FileInputStream fis = null;try {fis = new FileInputStream("E:\\得邦照明公司\\2021.11.15-11.20\\11.17\\新建文本文档.txt");while(true){int read = fis.read();if (read == -1){break;}System.out.println(read);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {fis.close();} catch (IOException e) {e.printStackTrace();}} }

改进while循环后代码:

public static void main(String[] args) {FileInputStream fis = null;try {fis = new FileInputStream("E:\\得邦照明公司\\2021.11.15-11.20\\11.17\\新建文本文档.txt");int data = fis.read();while((data=fis.read())!=-1){System.out.println(data);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {fis.close();} catch (IOException e) {e.printStackTrace();}} }

IDEA默认当前路径:工程Project的根就是IDEA的默认当前路径

此程序缺点:一次只读取一个字节byte,太浪费时间在硬盘与内存的交互上 使用 int read(byte[] b)方法,一次最多读取b.length个字节(这个方法返回值是读取到的字节数量,不是字节本身)。减少硬盘和内存的交互,提高程序的执行效率。往byte[]数组当中读。 例子如下: 在这里插入图片描述 然而这次每次都会有上一次的数组的"残余",所以调用使用String的有参构造方法,读取了几个长度转换几个。该sout中应该改成如下: 在这里插入图片描述

最终版

public static void main(String[] args) {FileInputStream fis = null;try {fis = new FileInputStream("E:\\得邦照明公司\\test.txt");byte[] bytes = new byte[4];int data=0;while ((data=fis.read(bytes))!=-1){System.out.print(new String(bytes,0,data));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (null!=fis){try {fis.close();} catch (IOException e) {e.printStackTrace();}}} }

FileInputStream类其他常用方法: 1.int available():返回流当中剩余的没有读到的字节数量 2.long skip(long n):跳过几个字节不读

public static void main(String[] args) {FileInputStream fis = null;try {fis = new FileInputStream("E:\\得邦照明公司\\test.txt");System.out.println("总字节数量"+fis.available());int data=fis.read();System.out.println("还有多少个字节没有读:"+fis.available());//知道还有多少个字节没有读就可以不用循环一次读完byte[] bytes = new byte[fis.available()];int read = fis.read(bytes);System.out.println(new String(bytes));} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (null!=fis){try {fis.close();} catch (IOException e) {e.printStackTrace();}}} }

此方法不太适合太大的文件,因为byte[]数组不能太大。

fis = new FileInputStream("E:\\得邦照明公司\\test.txt");fis.skip(3);//跳过三个字节

FileOutputStream类 负责写,从内存到硬盘。注意:写完之后一定要调用flush()方法刷新 代码如下:

```java package com.exception.test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.*; public class test {public static void main(String[] args) {FileOutputStream fos = null;try {//mylife文件不存在时会自动新建//这种方式谨慎使用,会先将原文件清空,然后重新写入。fos = new FileOutputStream("myfile");byte[] bytes = {97,98,99,100};fos.write(bytes);//写入abcdfos.write(bytes,2,3);//再写入cd//写完一定要flushfos.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} }

控制台报错: Exception in thread “main” java.lang.IndexOutOfBoundsException at java.io.FileOutputStream.writeBytes(Native Method) at java.io.FileOutputStream.write(FileOutputStream.java:326) at com.exception.test.test.main(test.java:17)

错误原因 :第17行写入起始位置位为3,写入长度为2;而字节长度剩余1,写入失败 更改后代码: fos.write(bytes,2,2);//再写入cd

执行效果 在这里插入图片描述 若不想每次都重新从头写入(保留之前的记录),在构造时,多加个true;则以追加的方式在文件末尾写入。代码如下:

fos = new FileOutputStream("myfile",true);

若要传入一个字符串,可用String类的.getBytes();方法 如下:

String s ="我是谁";byte[] bs = s.getBytes();fos.write(bs);

文件复制 一边读一边写 只要涉及写的 就一定要flush()刷新

public static void main(String[] args) {FileInputStream fis =null;FileOutputStream fos =null;try {//创建一个输入流对象fis = new FileInputStream("E:\\得邦照明公司\\test.txt");//创建一个输出流对象fos = new FileOutputStream("E:\\得邦照明公司\\2021.11.15-11.20\\copytest.txt");byte[] bytes = new byte[1024*1024];//1MB(一次最多拷贝1MB)int date=0;while((date=fis.read(bytes))!=-1){fos.write(bytes,0,date);}//刷新fos.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {fis.close();} catch (IOException e) {e.printStackTrace();}try {fos.close();} catch (IOException e) {e.printStackTrace();}} }

运行结果: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 字节大小与原文件一致,拷贝成功。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3