第十周课程总结
这一周主要学习的知识就是字节流与字符流的基本操作;
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候就要使用输入流取数据,而当程序需要将一些数据保存起来的时候就要使用输出流。
一、字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是Output Stream类和Input Stream类。
在Java中io操作也是是有相应步骤的,以文件为例:
- 1)使用File类打开一个文件。
- 2)通过字节流或字符流的子类指定输出的位置。
- 3)进行读/写操作。
4)关闭输入/输出。
- 1.在字节流中输出数据主要使用OutputStream类完成:Output Stream是整个IO包中字节输出流的最大父类,定义如下:
Public abstract class OutputStream
Extends Object
Implements Closeable,Flushable
package javabook;
import java.io.*;
public class JavaIO {
public static void main(String[] args) {
String a="holle java 学习java";
File f=new File("d:"+File.separator+"javaxx"+File.separator+"dome.txt");
//第一步给路径
try {
FileOutputStream str=new FileOutputStream(f);
//第二步给出输出流
try {
byte[] b=a.getBytes();
for(int i=0;i<b.length;i++) {
str.write(b[i]);
}
// str.write(a.getBytes());
// str.write(b, 2, 5);
//第三步读
str.close();
//第四步关闭
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
- 2.既然程序可以利用Output Stream类向文件中写入内容,则也可以通过InputStream类从文件中把内容读取进来。定义如下:
Public abstract class InputStream
Extends Object
Implements Closeable
package javabook;
import java.io.*;
public class Javaiotwo {
public static void main(String[] args) {
//第一步给出路径
File f=new File("d:"+File.separator+"javaxx"+File.separator +"dome.txt");
//第二步给出输出流
try {
FileInputStream str=new FileInputStream(f);
//第三步读
try {
byte[] b=new byte[str.available()];
str.read(b);
System.out.println(new String(b));
//第四步关闭
str.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
二、字符流
字符流和字节流基本上差不多,他们之间的最主要的区别就是,字节流顾名思义要把字符等转化为字节然后读取,而字符流就是直接使用字符,在日常的操作中,用到的比较多的是字节流,字符流用的比较少,这是因为字符只在内存里面才存在,其他地方比如硬盘就是要字节。同时值得注意的是字符流在操作的时候本身是要用到缓冲区的,就是文件内容写入文件的时候,不是向字节流一样直接写入文件,而是全部写入缓冲区,等到刷新或者等到文件关闭,内存区满了的时候才会写入文件中,不然就会一直在缓冲区等待。
- 1)字符输出流Writer本身就是一个字符流的输出类,定义如下:
Public abstractclassWriter
Extends Object
Implements Appendable,Closeable,Flushable
package javabook;
import java.io.*;
public class JavaIO {
public static void main(String[] args) {
String a="holle java 学习java";
File f=new File("d:"+File.separator+"javaxx"+File.separator +"dome.txt");
try {
FileWriter str=new FileWriter(f);
str.write(a);
str.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 2)字符输入流Reader类使用字符的方式从文件之中取出数据,定义:
Public abstract class Reader
Extends Object
Implements Readable,Closeable
三、管道流和打印流
管道流的主要作用是可以进行两个线程的通信,分为管道输出流(Piped Output Stream)、管道输入流(Piped Input Stream)如果想进行管道输出,则必须把输出流连在输入流上。
在发送线程中定义了管道输出流,在接收的线程类中定义了管道的输入流,在操作是只要使用Piped Output Stream类提供的connection()方法,就可以将两个线程管道连接到一起,线程启动后会主动的进行输入、输出操作。
打印流可以提供非常方便的打印功能,可以打印任何的数据类型,如小数、整数、字符串等。把一个输出流的实例传递到打印流之后,可以更加方便的输出内容,也就是说,是打印流把输出流重新装饰了一遍,就向送人礼物一样,需要把礼物包装一下显得更加好看,所以这样的设计被称作装饰设计模式。
四、System类对IO的支持
System.out是PrintStream的对象,在PrintS stream中定义了一系列的print()和println()方法,所以前面使用的“System.out.print()”或“System.out.println()”语句调用的实际上就是PrintStream类的方法。既然此对象不是的是向显示器上输出,而PrintStream又是Output Stream的子类。所以直接利用此对象向屏幕上输出信息。
System.err表示的是错误信息的输出,如果程序出现错误,则可以直接使用System.err进行打印。实际上与System.out差不多,只不过是err输出的信息一般是程序员自己看到的,别人是看不到的,输出的颜色则是红色,out则是输出给用户看的。