Java学习:I/O流(2)

LineNumberReader

跟踪行号的缓冲字符输入流,父类为BufferedReader。

成员方法:

getLineNumber()
          获得当前行号。

setLineNumber(int lineNumber)
          设置当前行号。

练习代码如下:

 1 //创建LineNumberReader对象
 2         //public LineNumberReader(Reader in)
 3         LineNumberReader lnr = new LineNumberReader(new FileReader("a.txt"));
 4
 5         //默认起始行号从0开始
 6         //设置其实行号为从10开始
 7         lnr.setLineNumber(10);
 8
 9         //一次读取一行
10         String line;
11         while ((line = lnr.readLine())!=null) {
12             //打印每一行的行号和内容
13             System.out.println(lnr.getLineNumber()+":"+line);
14         }
15
16         //关流
17         lnr.close();

获取行号,设置行号

结果如下:

操作基本数据类型的流

DataInputStream:读数据

DataOutputStream:写数据

具体的方法见API

练习代码如下:

 1 public static void main(String[] args) throws IOException {
 2         //写数据和读数据
 3         write();
 4         read();
 5     }
 6
 7     private static void read() throws IOException {
 8         //DataInputStream:读数据
 9         //创建对象:public DataInputStream(InputStream in)
10         DataInputStream dis = new DataInputStream(new FileInputStream("dos.txt"));
11
12         //读数据了,按什么顺序写入就必须按照什么顺序读出来
13         System.out.println(dis.readByte());
14         System.out.println(dis.readShort());
15         System.out.println(dis.readInt());
16         System.out.println(dis.readLong());
17         System.out.println(dis.readChar());
18         System.out.println(dis.readFloat());
19         System.out.println(dis.readDouble());
20         System.out.println(dis.readBoolean());
21
22         //关流
23         dis.close();
24     }
25
26     private static void write() throws IOException {
27         //public DataOutputStream(OutputStream out)
28         DataOutputStream dos = new DataOutputStream(new FileOutputStream("dos.txt"));
29
30         //给流关联的文件中写入基本类型的数据
31         dos.writeByte(20);
32         dos.writeShort(200);
33         dos.writeInt(2000);
34         dos.writeLong(20000L);
35
36         dos.writeChar(97);
37         dos.writeFloat(12.34F);
38         dos.writeDouble(23.34);
39         dos.writeBoolean(true);
40
41         //关流
42         dos.close();
43     }

写入数据和读数据

结果如下:

内存操作流

解决临时数据存储的问题。

操作字节数组

ByteArrayInputStream
ByteArrayOutputStream
byte[] toByteArray() 将之前写入内存的流转换成字节数组
操作字符数组
CharArrayReader
CharArrayWrite
操作字符串
StringReader
StringWriter

练习代码:

 1 //给内存中写数据public ByteArrayOutputStream()
 2         ByteArrayOutputStream baos = new ByteArrayOutputStream();
 3         //给内存中调用方法写数据
 4         baos.write("hello".getBytes());
 5         //将写入内存中的数据读取出来
 6         byte[] buf = baos.toByteArray();//调用这个方法,将之前写入内存中的数据存储到字节数组中
 7         ByteArrayInputStream bais = new ByteArrayInputStream(buf);//将刚才存储到字节数组中的内容关联上bais
 8
 9         //只有这样之后,我们才可以直接从bais中读取我们想要的内容
10         //一次读取一个字节
11         int by;
12         while ((by=bais.read())!=-1) {
13             System.out.print((char)by);
14         }
15         //关流
16         bais.close();
17         baos.close();

操纵字节流

打印流

字节打印流  PrintStream

字符打印流  PrintWriter

特点:

A:只能操作目的地,不能操作数据源

B:可以操作任意类型的数据

C:如果启动了自动刷新,能够自动刷新

如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作

D:可以操作文件的流
注意:什么流可以直接操作文件?
看流对象的API,如果其构造方法同时有File和String类型的参数,就可以直接操作文件。

 1     //注意:如果已经开启了自动刷新功能,必须调用则 println、printf 或 format的时候,才可以实现自动刷新
 2         pw.println("hello");
 3         pw.println("java");
 4         pw.println("world");//调用println这个方法给文件中写数据,1.写数据  2.换行  3.刷新
 5
 6         //可以操作任意类型的数据
 7         pw.println(true);
 8         pw.println(12.34);
 9
10         //关流
11         pw.close();

自动刷新

合并流:

SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流,因此,该流也被称为合并流。

构造:
SequenceInputStream(InputStream s1, InputStream s2) :将s1和s2合并成一个输入流,先读取s1后读取s2

联系代码如下:

 1 //将两个数据源合而为一
 2         SequenceInputStream sis = new SequenceInputStream(new FileInputStream("PrintWriterDemo.java"), new FileInputStream("SystemIn2.java"));
 3         //封装目的地
 4         FileOutputStream fos = new FileOutputStream("copy2.java");
 5
 6         //一下读写一个字节数组
 7         byte[] buf = new byte[1024];
 8         int len;
 9         while ((len=sis.read(buf))!=-1) {
10             //读多少写多少
11             fos.write(buf, 0, len);
12         }
13
14         //关流
15         fos.close();
16         sis.close();

将两个文件合并一个

对象的序列化和反序列化

序列化流:把对象按照流一样的方式写到文件或者在网络中传输。

反序列化流:把文件或者网络中的流对象数据还原对象。

ObjectOutputStream:序列化流
writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。  

ObjectInputStream:反序列化流
Object readObject() 从 ObjectInputStream 读取对象。

如何实现序列化?

类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。

注意:如果一个类不是实现Serializable接口无法把实例化,会报异常java.io.NotSerializableException

 1 public class Studnet implements Serializable{
 2     //实现这个接口不需要实现任何方法,这个接口说白了就是仅仅给Student类,打上了一个可以被序列化的标示
 3     private String name;
 4     private int age;
 5     public String getName() {
 6         return name;
 7     }
 8     public void setName(String name) {
 9         this.name = name;
10     }
11     public int getAge() {
12         return age;
13     }
14     public void setAge(int age) {
15         this.age = age;
16     }
17     public Studnet(String name, int age) {
18         super();
19         this.name = name;
20         this.age = age;
21     }
22     public Studnet() {
23         super();
24         // TODO Auto-generated constructor stub
25     }
26     @Override
27     public String toString() {
28         return "Studnet [name=" + name + ", age=" + age + "]";
29     }

对象类

 1 //创建序列化流对象
 2         //public ObjectOutputStream(OutputStream out)
 3         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
 4
 5         //创建一个学生对象,将学生对象写入文件中
 6         Studnet s = new Studnet("刘德华", 50);
 7         oos.writeObject(s);
 8         // java.io.NotSerializableException
 9         //类通过实现 java.io.Serializable 接口以启用其序列化功能
10
11         //关流
12         oos.close();

序列化

 1 //创建反序列化流对象
 2         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));
 3
 4         //读取文件中存储的对象,以实现反序列化
 5         //readObject()
 6         Object object = ois.readObject();
 7         System.out.println(object);
 8
 9         //关流
10         ois.close();

反序列化

 

时间: 2024-10-09 08:05:25

Java学习:I/O流(2)的相关文章

java 学习笔记之 流、文件的操作

ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import java.io.FilenameFilter; public class Test1 { public static void main(String[] args) { File file=new File("F:\\2017-2018-1\\javase"); // //获取该目录下

Java学习之IO流三

1.从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中(高效流) 1 /** 2 * 1.从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 3 * @author vanguard 4 * 5 */ 6 public class Demo01 { 7 public static void main(String[] args) { 8 //键盘输入两个文件夹路径 9 Scanner sc = new Scanner(System.in); 1

java学习之字符流与字节流的转换

1 package com.io; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.InputStreamReader; 9 /** 10 * 字节流转为字符流读入 11 * @author ga

java学习笔记 处理流之数据流

以前写数据如double类型 3.1415926,写进文件必须把这个Double类型转换成字符串写进去,这样做一是比较麻烦,二是如果数据比较长,那么占用内存空间会很大(实际上一个Double类型在内存中占用64位既8个字节). DataOutputStream和DataInputStream类的适用来解决这一问题,可以把这8个字节直接写入内存里面. DataOutputStream和DataInputStream类都是处理流,既包在管道上的管道. 操作示例 import java.io.*; p

Java学习之IO流总结

---恢复内容开始--- 流是用来读写数据的,java有一个类叫File,它封装的是文件的文件名,只是内存里面的一个对象,真正的文件是在硬盘上的一块区间,在这个文件里面存放着各种各样的数据,我们想读文件里面的数据怎么办?是通过一个流的方式来读的,咋恩要想从程序读数据,对于计算机来说,无论读什么类型的数据都是以01010101010101这样的形式读取的,怎么把文件里面的数据读取出来呢?你可以把文件想象成一个小桶,文件就是一个桶, 文件里面的数据就相当于是这个桶里面的水,那么我们怎么从这个桶里面取

Java学习日记-----IO流

1.java.io包下 File类:java程序中的此类的一个对象,就对应着一个文件或网络中的一个资源. Flie file1 = new File("D:\\io\\hello.txt"); File file2 = new File("D:\\IO\\io1"); >1. File既可以表示一个文件也可以表示一个文件目录 >2.   File的对象是与平台无关的 >3. File类针对于文件或文件目录,只能进行新建.删除.重命名.上层目录等等操

Java学习日记-----IO流 练习

分别使用字节流和字符流完成以下程序: 1. 在指定的路径下新建一个 .txt 文件 "test.txt",利用程序在文件中写入如下内容: "Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于个人PC.数据中心.游戏控制台.科学超级计算机.移动电

Java学习之IO流

转载链接:https://blog.csdn.net/zhaoyanjun6/article/details/54292148 Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了

Java学习:Stream流式思想

Stream流 Java 8 API添加了一种新的机制——Stream(流).Stream和IO流不是一回事. 流式思想:像生产流水线一样,一个操作接一个操作. 使用Stream流的步骤:数据源→转换成流→操作1→操作2→…… 数据源(source):可以是集合.数组等. Stream操作有两个基础特征: Pipelining(流水线):流操作会返回流对象(新的对象),以便后续继续进行流操作. 内部迭代:不需要像for循环或Iterator一样进行显式的迭代. 遍历及过滤集合中的元素 使用传统方

Java学习之IO流四

1.用代码实现以下需求 (1)定义学生类,包含姓名(String name),性别(String gender),年龄(int age)三个属性,生成空参有参构造,set和get方法,toString方法 (2)键盘录入6个学员信息(录入格式:张三,男,25),要求有两个相同的信息,将6个学员信息存入到ArrayList集合中 (3)将存有6个学员信息的ArrayList集合对象写入到D:\\StudentInfo.txt文件中 (4)读取D:\\StudentInfo.txt文件中的Array