4、 字符流和字节流的区别5、字符流的扩展分类打印流 :一般是打印到控制台,可以进行控制打印的地方。 管道流 :PipedInputStream的一个实例要和PipedOutputStream的一个实例共同使用,共同完成管道的读取写入操作。主要用于线程操作。 序列流 :可以将流合并,可以用于数据的切割和合并。 对象序列化流:对象序列化,把对象直接转换成二进制,写入介质中。使用对象流需要实现Serializable接口,否则会报错。IO流(字节流)
字节流:
输出流:OutputStream(抽象):
|--FileOutputStream:
构造方法:文件可以不存在,会自动创建
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。
FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append) :创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
写入:
void write(int n):写入一个字节;
void write(byte[] byteArray):写入一个字节数组;
void write(byte[] byteArray ,int off,int len):写入一个字节数组的一部分;
输入流:InputStream(抽象):
|--FileInputStream:
构造方法:(文件必须存在,否则抛出异常)
FileInputStream(String fileName):
FileInputStream(File file):
读取:
int read():一次读取一个字节;
int read(byte[] b):一次读取一个字节数组,返回:读取的字节数;
字符流:
输出流:Writer:
输入流:Reader:
例子:
public class Demo {
public static void main(String[] args) throws IOException {
// 1.构造一个BufferedOutputStream
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream("bufferdOutput.txt"));
//分开写
/*
FileOutputStream fileOut = new FileOutputStream("aa.txt");
BufferedOutputStream bufOut = new BufferedOutputStream(fileOut);
*/
//2.写入文件
out.write("你好Java".getBytes());
out.write("Hello".getBytes());
out.write("Worlddddddddd".getBytes());
//3.刷新缓冲区
// out.flush();
//4.释放资源
out.close();//先flush(),再close()
}
}
四:字节流四种方式复制MP4并测试效率
--基本流:
1.FileInputStream:
FileOutputStream:
1).一次读、写一个字节; method1()--> 58250 毫秒
2).一次读、写一个字节数组; method2()--> 105 毫秒!
--缓冲流:
2.BufferedInputStream:
BufferedOutputStream:
3).一次读、写一个字节 method3()--> 968 毫秒!
4).一次读、写一个字节数组: method4()--> 70 毫秒!
五:转换流--输出流:
字节流:
输出流:OutputStream
输入流:InputStream
字符流:
输出流:Writer
|-OutputStreamWriter:将字节输出流转换为字符输出流;
输入流:Reader
|--InputStreamReader:将字节流的输入流,转换为字符的输入流;
构造方法:这也是转换流的作用:可以将"字节流"转换为"字符流"
public OutputStreamWriter(OutputStream out)
public OutputStreamWriter(OutputStream out,String charsetName) 写入的方法:
public void write(int c):写入一个字符;
public void write(char[] cbuf):写入一个字符数组
public void write(char[] cbuf,int off,int len):写入一个字符数组的一部分
public void write(String str):写入一个字符串
public void write(String str,int off,int len):写入一个字符串的一部分;
6、总结一.数据输入输出流:
DataOutputStream:
DateInputStream:
可以输出任何的Java基本数据类型。所以,读取的时候,要按照
写入时的字节数,读取。
二.内存操作流:
ByteArrayOutputStream:
ByteArrayInputStream:
byte[]数组的缓冲区;就是用来缓存byte[]数组
三.打印流:
1.字符流:PrintWriter:
2.字节流:PrintStream:
特点:
1.只有输出流,没有输入流;
2.可以读写任何的数据类型;
3.部分功能带自动刷新,换行;
4.可以操作文件;
3.标准输入输出流:
System.in : BufferedInputStream:
System.out: PrintStream;
四.字节流转换为字符流:(必须掌握)
字节流 --> 转换流 --> 字符流
PrintStream OutputStreamWriter BufferedWriter
PrintStream ps = System.in;
OutputStreamWriter out = new OutputStreamWriter(ps);
BufferedWriter bw = new BufferedWriter(out);
五.随机访问流:
RandomAccessFile:不属于"流"类。它内部封装了InputStream和OutputStream
对文件进行读写操作:
构造方法:
RandomAccessFile(String fileName,String mode):mode:"r"只读;"rw":读写;
成员方法:
writeXxxx();
readXxxxx();
getFilePointer():获取当前文件指针
seek():设置当前文件指针;
六.序列化和反序列化:
序列化:ObjectOutputStream:
注意:1.序列化的类必须实现:Serializable接口(标记接口)
2.添加一个成员变量:serialVersionUID
成员方法:
writeObject(Object obj):
反序列化:
ObjectInputStream:
成员方法:
readObject();
七.Properties类:
1.它就是一个Map集合,继承自:Hashtable;
2.继承的: pub(Object key,Object value) get(Object key) keySet()
特有的: setProperty(String key,String value) getProperty(String key) stringPropertyNames()
3.操作配置文件相关:
load(Reader read):读取配置文件的信息;
store(Writer out,String com):将集合中的数据写入到配置文件;
八.NIO的一个案例:
1.public static long copy(Path source, OutputStream out) :复制文件
2.public static Path write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options):
|
|