I/O流

字节流:可以读取任意类型文件

I/O流

文件输入输出流:

FileOutputStream(写):
FileOutputStream out =new FileOutputStream(“a.txt”,true);可以追加内容。输出流若文件不存在会自动帮你创建。
out.write(int b):写一个字节 超过一个字节 砍掉前面的字节。
out.write(byte[] b):写一个字节数组。
out.write(byte[] b,int off,int len):写一个字节数组的一部分。从第几个字节输入多少个字节
out.write(“/r/n”)换行符。
out.close();释放资源。
FileInputStream(读):
FileInputStream in =new FileInputStream(“a.txt”);
in.read()一次读一个字节,读取不到返回-1。
byte[] bytes=new byte[1024];
in.read(bytes);一次读一个字节数组。读不到返回-1。
in.read(bytes,0,4);一次读一部分,从0开始读取4个有效字节。
in.close();释放资源。

高效输入输出流:

BufferOutputStream和BufferInputStream这对流底层加入了缓冲区。读取速度快一些。
BufferOutputStream(写):
该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
BufferInputStream(读):
为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。

字符流:只能读取文本文件,字符流=字节流+编码表

I/O流

字符转换流:

OutputStreamWriter(写):
输出流关联的文件不存在会帮你创建。
OutputStreamWriter out=new OutputStream(new FileOutputStream(“a.txt”),true),“UTF-8”)可以追加内容,指定UTF-8编码
out.write(int c);一次一个字符
out.fiush();必须刷新
out.write(String str);一次一个字符串
out.write("\r\n");换行符
out.write(char[] cbuf,int off ,int len);一次写一部分
out.write(char[]);一次写一个字符数组
out.close();关闭并刷新
InputStreamReader(读):
输入流关联的文件不存在会报错
InputStreamReader in =new InputStreamReader(new FileInputStream(“a.txt”),“UTF-8”);
in.read();一次读一个字符。
char[] chars=new char[100];
int len=in.read(chars);一次读一个字符数组如果没读到返回-1。
int len=in.read(chars,0,2);从0开始读取2个字符返回的是读取到的有效字符。

高效字符转换流:

BufferedWriter(写):
BufferedWriter bfw=new BufferedWriter(new FileWriter(“a.txt”,true);可以追加内容默认编码表
bfw.newLine();换行符具有平台兼容性
BufferedReader(读):
BufferedReader bfr=new BufferedReader(new FileReader(“a.txt”);
bfr.readLine();一次读一行读不到返回null

杂七杂八流:

数据输入输出流:能够读写基本数据类型

DataInputStream输入流 从硬盘读到内存。DataOutputStream输出流从内存写到硬盘。怎么写怎么读。

内存操作流:此流不关联文件,不直接读写文件,就在内存中操作数据

  • 操作字节数组:ByteArrayOutputStream 和ByteArrayInputStream。此流关闭无效,无需关闭
  • 操作字符数组:CharArrayOutputStream和CharArrayInputStream。
  • 操作字符串:StringWriter和StringReader。

ByteArrayOutputStream:
此类实现了一个输出流,其中的数据被写入了一个byte数组。缓冲区会随着数据的不断写入而自动增长。可使用toByteArray()和toString()获取数据。关闭ByteArrayOutputStream无效,此类中的方法在关闭此流后仍然可被调用,而不会产生任何IOException。

  • write(int b);
  • write(byte[] b,int off,int len);
  • write(OutputStream out);
  • write(byte[] b);

ByteArrayOutputStream out=new ByteArrayOutputStream();
out.write(“长江”.getBytes());
ByteArrayInputStream:
使用buf作为其缓冲区数组
byte[] bytes=out.toByteArray();
ByteArrayInputStream in=new ByteArrayInputStream(bytes);
byte[] bytes1=new byte[1024];
int len=in.read(bytes1);记录有效字节个数
System.out.println(bytes1,0,len);

打印流:

打印流只关联目标文件,不关联源文件。
PrintStream:字节打印流: 关联屏幕或者文件。字节打印流,为其他输出流添加了功能,使他们能够方便的打印各种数据值的表现形式。
PrintStream out =System.out;标准输出流,关联屏幕
PrintStream out=new PringtStream(a.txt);关联文件a.txt。
out.println(“abc”);
out.print(“一行数据”.getBytes());
out.write(100);
out.close();
PrintWriter:字符打印流: 只能关联文件。
PrintWriter(OutputStream out, boolean autoFlush)通过现有的OutputStream 创建新的PrintWriter。如果启动了自动刷新,只有调用println,printf或者format的其中一个方法才可以完成此操作。
键盘录入:
第一种:
InputStream in = System .in;标准输入流,关联键盘
Scanner sc=new Scanner(in);
第二种:
BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));

随机访问流:

此流最大的特点是能读能写。二来可以设置文件指针的位置。
RandomAccessFile raf=new RandomAccessFile(“e.txt”,“rw”);
raf.getFilePointer();获取当前文件指针位置。
String s =raf.readUTF();使用modifiedUTF-8。首先把两个字节从当前文件写入此文件,类似于使用writeshort方法给定跟随的字节数。
raf.seek();跳转到此文件位置。

Properties:

属性集合,双列集合 键值默认都是字符串类型。
Properties properties=new Properties();
properties.setProperty(“李四”,“王五”);
properties.store(new FileWrite(“sh.properties”),null);将属性集合中的键值对数据,存到文本中。参2是文件的注释。文件中用=连接。
properties.load(new FileInputStream(“sh.properties”));遍历读取properties.entrySet();

SequenceInputStream:

顺序流。按顺序读并合并成一个文件。
表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始,并从第一个输入流的有序集合开始读取,直到到达文件末尾,接着从第二个流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
SequenceInputStream(InputStream s1,InputStream s2)
通过记住这两个参数来初始化新创建的SequenceInputStream(将按顺序读取这两个参数,先读s1,再读s2),以提供从此SequenceInputStream读取的字节。
SequenceInputStream(Enumeration<?extends InputStream > e):传入一个类型为InputStream对象的Enumeration型参数。
//复制多个文件
public class Test{
public static void main(String[] args)throws IOException{
FileInputStream in1=new FileInputStream(“a.txt”);
FileInputStream in2=new FileInputStream(“b.txt”);
FileInputStream in3=new FileInputStream(“c.txt”);
FileOutputStream out =new FileOutputStream(“all.txt”);
Vector vector=new Vector<>();
vector.add(in1);
vector.add(in2);
vector.add(in3);
Enumeration enumeration =vector.elements();
SequenceInputStream allIn=new SequenceInputStream();
in len=0;
byte[] bytes=new byte[1024*8];
While(){
out.write(bytes,0,len);
}
allIn.close();
out.close();
}
}

序列化流和反序列化流:

ObjectOutputStream序列化流:将一个对象保存到文件中。
1.要保证一个对象能保存到文件中,序列化时类得实现serilizable标记接口告诉JVM保存对象。
2.序列化后再加上一个静态的常量的UID。
3.transient修饰的这个字段不需要保存到文件中去。
ObjectInputStream反序列化流:读取对象。