JAVA基础-IO流(二)



一、字节流

字节流是通过字节来进行读写操作的,他的使用对象相比于字符流来说更加的广泛。这主要是因为他们读写文件的方
式而决定的。字符流读写文件时是将读取到的字节通过默认编码表转换成字符,在通过默认编码表将字符转换成字节存储
到文件里,在这个过程中虽然提高了文本文档的读写效率,但是在面对非文本文件时 - 字节转换成字符的这个操作因为编
码表的原因可能会造成丢失字节,导致文件的缺失。所以在对非文本文档进行操作时要使用字节流。

二、InputStream类

此抽象类是字节输入流的所有类的超类(读),其常用子类有 FileInputStream、 ObjectInputStream 。
而此类的常用方法与Reader类相似,其常用方法有:
(1)关闭此输入流并释放与该流关联的所有系统资源、close()

(2)从输入流中读取数据的下一个字节、 read()

(3)从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中、read(byte[] b)

(4)将输入流中最多 len 个数据字节读入 byte 数组、read(byte[] b, int off, int len)

1、FileInputStream类

FileInputStream类为InputStream抽象类的常用实现类,他可以用于读取视频、音频、图片等非文本文件,也可以
读取文本文件(读取文本文件推荐使用FileReader类),其构造方法与FileReader类似,可以传递路径名或File对象为
参数。它继承了InputStream类的全部方法。

2、ObjectInputStream类

ObjectInputStream类主要用于对象的读取,继承了InputStream类的全部方法。他的构造方法为:
(1)创建从指定 InputStream 读取的 ObjectInputStream

ObjectInputStream(InputStream in)

因其读取对象的特性,他有一些自己独有的自己独有的方法:
(1)从 ObjectInputStream 读取对象、readObject()

两种遍历方式的举例:

 1 //抛出异常
 2 private static void method2() throws IOException, FileNotFoundException, ClassNotFoundException {
 3 //根据传入的FileInputStream对象创建ObjectInputStream对象
 4 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("aa.txt"));
 5 //遍历文件直到无文件可读,捕获抛出的异常,结束循环
 6 try {
 7 while (true) {
 8 //读取文件
 9 Object readObject = ois.readObject();
10 System.out.println(readObject);
11 }
12 //捕获异常结束循环
13 } catch (EOFException e) {
14 System.out.println("已经输出完毕");
15 //一定会执行,一般用于关闭流
16 } finally {
17 //关闭资源
18 ois.close();
19 }
20 }

将对象传入到集合中,将集合写入文件,读取集合

 1 public static void main(String[] args) throws Exception, IOException {
 2 // method();
 3 // method2();
 4 // 创建学生对象
 5 Student student = new Student("张三", 18);
 6 Student student2 = new Student("白洁", 19);
 7 Student student3 = new Student("赵四", 39);
 8 // 创建集合
 9 ArrayList<Student> lists = new ArrayList<>();
10 // 将学生丢向加入到集合中
11 lists.add(student);
12 lists.add(student2);
13 lists.add(student3);
14 // 根据传入的FileOutputStream对象创建ObjectOutputStream对象
15 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("bb.txt"));
16 // 将集合写入
17 oos.writeObject(lists);
18 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("bb.txt"));
19 // 从文件中读取集合
20 Object readObject = ois.readObject();
21 // 向下转型
22 ArrayList<Student> re = (ArrayList<Student>) readObject;
23 // 遍历集合
24 for (Student student4 : re) {
25 System.out.println(student4);
26 }
27 // 关闭资源
28 ois.close();
29 oos.close();

三、OutputStream类

此抽象类是表示输出字节流的所有类的超类(写),其常用子类有 FileInputStream、 ObjectInputStream。
此类的常用方法与Reader类相似,其常用的实现类有:
(1)FileOutputStream类

(2)ObjectOutputStream类
    而此类的常用方法与Writer类相似,其常用方法有:
(1)关闭此输出流并释放与此流有关的所有系统资源、close()

(2)刷新此输出流并强制写出所有缓冲的输出字节、flush()

(3)将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流、write(byte[] b, int off, int len)

1、FileOutputStream类

FileOutputStream类为OutputStream抽象类的常用实现类,其构造方法与FileWriter类似,可以传递路径名或
File对象为参数。它继承了OutputStream类的全部方法。

用字符流拷贝文件举例:

 1 //创建File对象
 2 File file = new File("D:\\songs\\小苹果.mp4");
 3 //根据file创建FileInputStream对象
 4 FileInputStream fi=new FileInputStream(file);
 5 //定义int用来存数组长度
 6 int i;
 7 //定义byte数组
 8 byte[] b=new byte[1024];
 9 //根据给定路径创建FileOutputStream对象
10 FileOutputStream fo=new FileOutputStream("D:\\aa\\小苹果.mp4");
11 //循环读取
12 while ((i=fi.read(b))!=-1) {
13 //写入文件
14 fo.write(b, 0, i);
15 }
16 //关闭资源
17 fo.close();
18 fi.close();

2、ObjectOutputStream类

可以用ObjectOutputStream类将对象写入到文件中,要注意的是被写入的对象的类要进行序列化,否则你在对类进行
修改时会报异常。
    对类序列化举例:

 1 class Student implements Serializable {
 2 /**
 3 * 序列号如果不生成系统会自动生成,但是你更改类的成员变量序列号也会变,就会报错所以要重写
 4 */
 5 //实现Serializable接口进行序列化
 6 private static final long serialVersionUID = 4123259833120003092L;
 7 private String name;
 8 private int age;
 9
10 public Student() {
11 super();
12 // TODO Auto-generated constructor stub
13 }
14
15 public Student(String name, int age) {
16 super();
17 this.name = name;
18 this.age = age;
19 }
20
21 @Override
22 public String toString() {
23 return "Student [name=" + name + ", age=" + age + "]";
24 }
25 }

写入对象举例:

 1 //创建ObjectOutputStream对象
 2 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("aa.txt"));
 3 //创建学生类
 4 Student student = new Student("张三", 18);
 5 Student student2 = new Student("白洁", 19);
 6 //写入数据
 7 oos.writeObject(student);
 8 oos.writeObject(student2);
 9 //关闭资源
10 oos.close();

四、转换流的使用

转换流不属于字节流的子类,而是Writer和Reader的子类,因为它涉及到了字节流和字符流的转换所以在这里说。

1、InputStreamReader(字符输入流)

字符输入流是字节流通向字符流的桥梁。它可以将节符流对象转化成字符流对象,因为是输入,所以字节数据会被转
换成字符数据。其常用的构造方法为:InputStreamReader(InputStream in) 。

2、OutputStreamWriter(字符输出流)

他是字符流通向字节流的桥梁。它可以将字节流对象转换成字符流对象,因为是输出,所以字符数据会被转换成字节
数据。其常用的构造方法为:创建使用默认字符编码的 - OutputStreamWriter(OutputStream out)。

举例:

 1 public static void main(String[] args) throws IOException {
 2 // 标准输入流
 3 InputStream in = System.in;
 4 // 转换流
 5 InputStreamReader inputStreamReader = new InputStreamReader(in);
 6 // 创建FileWriter对象
 7 FileWriter fw = new FileWriter("a.txt");
 8 // 存储数组长度
 9 int i;
10 char[] c = new char[1024];
11 // 循环读取
12 while ((i = inputStreamReader.read(c)) != -1) {
13 // 将数组写入到指定文件,从0一直写到i,目的是为了防止出现重复数据
14 fw.write(c, 0, i);
15 // 刷
16 fw.flush();
17
18 }
19 // 关闭资源
20 fw.close();
21 inputStreamReader.close();
22 }
23 }
时间: 2025-01-06 16:10:54

JAVA基础-IO流(二)的相关文章

黑马程序员——Java基础--IO流(一)---字符流和字节流

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.IO流的介绍及体系 IO流用来处理设备之间的数据传输.java对数据的操作是通过流的方式.java用于操作流的对象都在IO包中. 输入流和输出流相对于内存设备而言:将外设中的数据读取到内存中:输入.将内存中的数据写出到外设中:输出. 流按照操作数据分为两种:字节流和字符流. 字符流的由来:其实就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字,再对这个文字进行操作

Java 基础 IO流(转换流,缓冲)

一,前言 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStreamWriter,这又是什么意思呢 二,转换流 2.1 OutputStreamWriter类 查阅OutputStreamWriter的API介绍,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节.它的作用的就是,将字符串按照指

黑马程序猿——JAVA基础——IO流

----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一. 一.IO流的三种分类方式 1.按流的方向分为:输入流和输出流 2.按流的数据单位不同分为:字节流和字符流 3.按流的功能不同分为:节点流和处理流     二.IO流的四大抽象类: 字符流:Reader Writer 字节流:InputStream(读数据) OutputStream(写数据)     三.InputStream的基本方法 int read() throws

Java基础——iO(二)

接着上一篇,继续做学习笔记.学IO这块,突然找到一点好处,好像以后操作电脑,尤其是电脑里的文件啥的,可以很少的用鼠标了.添加.修改.删除啥的,几行代码就可以搞定了.这只是我一个初学者的一点小心思,IO背后的大用处,相信还有很多很多.继续学习ing.... 一.缓冲流和装饰模式 缓冲流(包装类),缓冲区的出现提高了对数据读写的效率,它可以用来对流进行包装,在流的基础上对流的功能进行了增强.和底层系统提供的缓冲区有什么区别?底层直接和目标设备交换数据,包装类中,通过被包装的对象. BufferedR

JAVA基础-IO流(一)

一.IO流 IO流是Java为方便我们对文件的读写进行操作而提供的一种技术.按照读取写入文件的方式不同可以分为字符流和字节流,而每个流派按照功能又分为读和写.字符流读写操作的根类为Reader和Writer,其实现的常用子类分别为.写:PrintWriter.FileWriter.BufferedWriter.OutputStreamWriter(这个为转换流后边会详细说).读:BufferedReader.InputStreamReader(转换流). FileReader. 二.Reader

Java学习IO流(二)

字节流复制文件 原理:读取一个已有的数据,并将这些读取到的数据写到另一个文件中 字节流通过单字节复制和字节数组赋值 package com.oracle.demo01; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyDemo { public static void main(String[] args) throws IO

Java基础IO流(一)

IO概念: 大多数应用程序都需要实现与设备之间的数据传输,例如键盘可以输入数据,显示器可以显示程序的运行结果等.在Java中,将这种通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象表述为"流",程序允许通过流的方式与输入输出设备进行数据传输.Java中的"流"都位于java.io包中,成为IO(输入输出)流. IO分类: IO流有很多种,按照操作数据的不同,可以分为字节流和字符流,按照数据传输方向的不同又可以分为输入流和输出流,程序从输入流中读取

Java基础-IO流

简单的使用IO流是很简单的~ package com.j2se.d59.demo; import java.io.*; //IO里的对象来自于java.io.*; //IO流的输入输出是相对于内存RAM的 //分类:单位[字节流.字符流]or方向[输入流.输出流]or功能[节点流.处理流] //所有的IO流由四个抽象类扩展而来: //InputStream 的子类 FileInputStream BufferedInputStream //OutputStream 的子类FileInputStr

黑马程序员——Java基础——IO流

第一讲 IO概述 1概述:IO流:输入(Input与Output流) 2特点: a.IO流用于数据传输: b.按操作分为字节流与字符流 c.按流向分:输入流和输出流 3.常用IO流的基类 1)字节流的基类:InputStream和OutpuStream 2)字符流的基类:Reader和Writer 第二讲 字符流 一.简述 1.字符流的对象融合了编码表.使用的是默认的编码 2.字符流只能用于文字处理,而字节流可以处理其他: 3.下列把FileWriter和FileReader一起讲 1 pack

Java基础——IO流

IO流1.java.io.File 1.凡是与输入输出相关的类.接口都定义在java.io下 2.File是一个类,可以由构造器创建其对象.此对象对应着一个文件(.txt .avi .ppt .doc .mp3 .jpg)或文件目录 3.File类对象是与平台无关的(Java的跨平台特性) 4.File中的方法,仅涉及到如何创建,删除,重命名等(表面功夫),只要涉及到文件内容的,File是无能为力的,必须由io流来完成 5.File类的对象常常作为io流的具体类的构造器的形参 访问文件名: ge