字节流

mac2024-04-23  275

IO流

概述:用于设备之间数据的传输分类: (1)按数据流向划分: 输入流:读数据 输出流:写数据 (2)按数据类型划分: 字节流:可以读写任何类型的文件 字符流:只能读写文本文件

字节流

当然,还有其他子类,主要学习文件

FileOutputStream

构造方法 FileOutputStream(File file) FileOutputStream(String name)

三个Write()方法 public void write(int b):写一个字节 public void write(byte[] b):写一个字节数组 public void write(byte[] b,int off,int len):写一个字节数组的一部分

package org.westos.demo2; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class MyTest2 { public static void main(String[] args) throws IOException { //封装文件 File file = new File("a.txt"); //创建一个文件输出流,并且关联一个文件,如果该文件不存在,则自动创建 FileOutputStream out = new FileOutputStream(file); //调用write方法给文件写入数据 //一次写一个字节 out.write(97); out.write(98); out.write(99); // \r\n代表换行 out.write("\r\n".getBytes()); //一次写一个字节数组 byte[] bytes = {100, 101, 102}; out.write(bytes); out.write("\r\n".getBytes()); //一次写数组的一部分 out.write(bytes,0,2); //使用完流之后,要关闭流 out.close(); } }

在创建字节输出流对象时做的事: (1)调用系统资源创建了一个文件 (2)创建out对象 (3)out对象指向这个文件

关闭流的原因: (1)通知系统释放关于管理a文件的资源 (2)让IO流对象变成垃圾,等待垃圾回收站回收

追加方法 FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流,即追加内容 package org.westos.demo2; import java.io.FileOutputStream; import java.io.IOException; public class MyTest2 { public static void main(String[] args) throws IOException { //创建一个输出流,并向文件追加内容 //true代表追加,false代表不追加 FileOutputStream out = new FileOutputStream("a.txt", true); out.write("\r\n".getBytes()); out.write("好好学习".getBytes()); out.write("\r\n".getBytes()); out.write("天天向上".getBytes()); //最后,关闭流 out.close(); } }

FileInputStream

构造方法 FileInputStream(File file) :通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定 FileInputStream(String name) :通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定

三个Read()方法 public int read():一次读取一个字节 public int read(byte[] b):一次读取一个数组,返回有效字节长度 public int read(byte[] b,int off,int len):一次读取一个字节数组的一部分

package org.westos.demo2; import java.io.FileInputStream; import java.io.IOException; public class MyTest2 { public static void main(String[] args) throws IOException { //创建一个输入流 //注意,输入流关联的文件若不存在就会报错 FileInputStream in = new FileInputStream("a.txt"); //一次读取一个字节 int read = in.read(); System.out.println(read); System.out.println("---------"); //一次读取一个数组 //创建一个字节数组充当缓冲区 byte[] bytes = new byte[1024 * 8]; //返回字节有效长度 int len = in.read(bytes); System.out.println(len); System.out.println("---------"); //返回字节内容 String s = new String(bytes, 0, len); System.out.println(s); System.out.println("---------"); //释放资源 in.close(); } }

了解完两者各自特征,下面结合两个类一起完成需求:复制文件 (1)读一个字节,写一个字节

package org.westos.demo2; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class MyTest2 { public static void main(String[] args) throws IOException { //创建一个输入流并关联文件 FileInputStream in = new FileInputStream("a.txt"); //创建一个输出流并指定新路径 FileOutputStream out = new FileOutputStream("E:\\a.txt\\"); //复制文件,读一个字节,写一个字节 //定义一个变量,接收字节 int len = 0; while((len=in.read())!=-1){ out.write(len); out.flush(); } //释放资源 in.close(); out.close(); } }

(2)读一个数组,写一个数组

package org.westos.demo2; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class MyTest2 { public static void main(String[] args) throws IOException { //创建一个输入流并关联文件 FileInputStream in = new FileInputStream("E:\\a.txt\\"); //创建一个输出流并指定新路径 FileOutputStream out = new FileOutputStream("D:\\b.txt\\"); //复制文件,读一个数组,写一个数组 //创建一个数组,充当缓冲区 byte[] bytes = new byte[1024 * 8]; //定义一个变量,记录读取的字节有效个数 int len = 0; while((len=in.read(bytes))!=-1){ out.write(bytes,0,len); out.flush(); } //释放资源 in.close(); out.close(); } }

另外,在之前的代码对于流的异常都是抛给虚拟机处理,其实也可以自己处理

package org.westos.demo2; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class MyTest2 { public static void main(String[] args) { //自己处理流异常 FileInputStream in=null; FileOutputStream out=null; try { //创建一个输入流并关联文件 in = new FileInputStream("E:\\a.txt\\"); //创建一个输出流并指定新路径 out = new FileOutputStream("D:\\b.txt\\"); //复制文件,读一个数组,写一个数组 //创建一个数组,充当缓冲区 byte[] bytes = new byte[1024 * 8]; //定义一个变量,记录读取的字节有效个数 int len = 0; while((len=in.read(bytes))!=-1){ out.write(bytes,0,len); out.flush(); } } catch (IOException e){ e.printStackTrace(); } finally { //释放资源 try { if(in!=null){ in.close(); } if(out!=null){ out.close(); } } catch (IOException e) { e.printStackTrace(); } } } }

高效字节流

概述:该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中, 而不必针对每次字节写入调用底层系统方法: BufferedInputStream(InputStream in):创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用 BufferedOutputStream(OutputStream out):创建一个新的缓冲输出流,以将数据写入指定的底层输出流 package org.westos.demo2; import java.io.*; public class MyTest2 { public static void main(String[] args) throws IOException{ BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\c.txt")); //复制文件 byte[] bytes = new byte[1024 * 8]; int len = 0; while((len=bis.read(bytes))!=-1){ bos.write(bytes, 0, len); bos.flush(); } bis.close(); bos.close(); } }

实现逻辑跟FileInputStream、FileOutputStream一样,只不过再多创建两个对象BufferedInputStream、 BufferedOutputStream,然后对它俩进行操作,操作的方法都是一样的,达到高效的效果

最新回复(0)