JavaIO之字节流、字符流、缓冲流、转换流、序列化流、打印流

24 篇文章 2 订阅
19 篇文章 0 订阅

1、硬盘、内存与IO流的关系

在这里插入图片描述

2、字节输出流OutputStream(java.lang.Object)

package aaaa_io;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamTest {
    public static void main(String[] args) throws IOException {
		FileOutputStream fos = new FileOutputStream("写入文件的目的地");
		fos.write(97);
		fos.close();
	}
}

在这里插入图片描述
子类ByteArrayOutputStream、FileOutputStream、FilterOutputStream、ObjectOutputStream、OutputStream、PipedOutputStream

3、FileInputStream字节输入流写读取字节数据

package aaaa_io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class FileInputStreamTest {
    public static void main(String[] args) throws Exception {
		FileInputStream fis = new FileInputStream("读取文件的路径");
		
		//一个字节一个字节的读取
		int len = fis.read();
		int len2 = fis.read();
		int len3 = fis.read();		
		//多个字节一起读取
		byte[] bytes = new byte[1024];
		fis.read(bytes);
		fis.close();
	}
}

4、利用OutputStream、InputStream字节流实现文件复制

package aaaa_io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class FileCobyTest {
    public static void main(String[] args) throws Exception {
		FileInputStream fis = new FileInputStream("读取文件路劲");
		FileOutputStream fos = new FileOutputStream("写入文件的路径");
		
		byte[] bytes = new byte[1024];
		
		int len = 0;
		while((len = fis.read()) != -1) {
			fos.write(bytes);
		}
		fos.close();
		fis.close();
	}
}

5、缓冲流

BufferedOutputStream 字节缓冲流

package aaaa_io;

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class BufferedOutputStreamTest {
      public static void main(String[] args) throws Exception {
		FileOutputStream fos = new FileOutputStream("要输出文件的目的地");
		BufferedOutputStream bos  = new BufferedOutputStream(fos);  //缓冲流
		bos.write("把数据写入缓冲区".getBytes());  //字节的方式写入缓冲区
	    bos.flush(); //刷新缓冲区
	    bos.close();
	}
}

BufferedInputStream字节输入缓冲流

package aaaa_io;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class BufferedInputStreamTest {
    public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("读取文件的地址");
		
	    BufferedInputStream bis = new BufferedInputStream(fis); 
	    byte[] bytes = new byte[1024];
	    int len = 0;
	    while((len = bis.read()) != -1) {
	    	System.out.println(new String(bytes,0,len));
	    }
	    bis.close();
	}
}

BufferedWriter字符写入缓冲流

package aaaa_io;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterTest {
    public static void main(String[] args) throws IOException {
    	
		BufferedWriter bw = new BufferedWriter(new FileWriter("输出文件目的地"));
		
		for(int i = 0;i < 10;i++) {
			bw.write("你好你好");
			bw.newLine();
		}
		bw.flush();  //刷新缓冲区的数据到文件
		bw.close();
	}
}

BufferedReader字符读入缓冲流

package aaaa_io;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderTest {
     public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("读取文件目的地"));
		String line;
		while((line = br.readLine()) == null) {
			System.out.println(line);
		}
		br.close();
	}
}

用缓冲流实现文本排序测试

package aaaa_io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.annotation.processing.Filer;
import javax.lang.model.element.Element;
import javax.tools.FileObject;
import javax.tools.JavaFileObject;
import javax.tools.JavaFileManager.Location;

public class FileOrderTest {
    public static void main(String[] args) throws IOException {
		Map<String, String> hashMap = new HashMap<String, String>();
		BufferedReader br = new BufferedReader(new FileReader("读取文件的目的地"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("写入文件的目的地"));
		
		String line;
		while((line =br.readLine()) != null) {
			String[] str = line.split("\\.");
			hashMap.put(str[0], str[1]);
		}
		
		for(Entry<String, String> map : hashMap.entrySet()) {
			line = map.getKey() + "." +map.getValue();
			bw.write(line);
			bw.newLine(); //写换行
		}
		for(String key : hashMap.keySet()) {
			String value = hashMap.get(key);
			line = key + "." + value;
			bw.write(line);
			bw.newLine(); //写换行
		}
		bw.close();
		br.close();
	}
}

6、转换流

字符编码和字符集
字符编码就是自然语言和计算机二进制转换存储的对应规则
字符集也是一个编码表表示一个系统支持的所有字符集合,包括各国语言

OutputStreamWriter输出转换流

package aaaa_io;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

public class OutputStreamWriterTest {
       public static void main(String[] args) throws IOException {
		 write_utf_8();
		 write_gbk();
	}

	private static void write_gbk() throws IOException {
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("输出文件目的地"),"utf-8");
		osw.write("你好");
		osw.flush();
		osw.close();
	}

	private static void write_utf_8() throws IOException {
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("输出文件目的地"),"gbk");
		osw.write("你好");
		osw.flush();
		osw.close();
	}
}

InputStreamReade读取转换流

package aaaa_io;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class IInputStreamReaderTest {
     public static void main(String[] args) throws IOException {
		reader_utf_8();
		reader_gbk();
	}

	private static void reader_utf_8() throws IOException {
		InputStreamReader isr = new InputStreamReader(new FileInputStream("读取文件目的地"),"utf-8");
		int len = 0;
		while((len = isr.read()) != -1) {
			System.out.println((char)len);
		}
	}

	private static void reader_gbk() throws IOException {
		InputStreamReader isr = new InputStreamReader(new FileInputStream("读取文件目的地"),"gbk");
		int len = 0;
		while((len = isr.read()) != -1) {
			System.out.println((char)len);
		}
	}
}

用转换流实现文件编码格式转换

package aaaa_io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class zhuanhuanTest {
      public static void main(String[] args) throws IOException {
		InputStreamReader isr = new InputStreamReader(new FileInputStream("读取文件的目的地"),"utf-8");
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("输出文件目的地"),"gbk");
		
		char[] bytes = new char[1024];
		int len = 0;
		while((len = isr.read(bytes)) != -1) {
			osw.write(len);
		}
		osw.flush();
		osw.close();
		isr.close();
	}
}

7、序列化流

序列化和反序列化的概念

序列化: 就是把对象转换成字节
反序列化: 把字节转换成对象
要实现序列化或者反序列化必须满足
(1)序列化和反序列化都必须实现Serializable接口 形成一个标记
(2)必须存在对应的class文件或者字节码文件
在这里插入图片描述
ObjectOutputStream序列化流

package aaaa_io;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class ObjectOutputStreamTest implements Serializable{
   public static void main(String[] args) throws IOException {
	  ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("把对象序列化成二级制文件的地址"));
	  oos.writeObject(new Person("zzz","eee"));
	  oos.close();
   }
}

ObjectInputStream 反序列化流

package aaaa_io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class ObjectOInputStreamTest implements Serializable{
      public static void main(String[] args) throws Exception {
    	  ObjectInputStream ois = new ObjectInputStream(new FileInputStream("需要的子节流文件"));
          Object o = ois.readObject();
          Person person = (Person)o;
          ois.close();
	}
}
class Person{
	private String name;
	private String age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	
}

static、transient关键字

静态优先于非静态加载到内存中(静态优先于对象进入内存中)
被staitic修饰的成员变量不能被序列化,序列化的都是对象
transient关键字:瞬态关键字
被transient关键字修饰的成员变量不能被序列化

InvalidClassException异常原理和解决方案
在这里插入图片描述

class Person{
	private final static Long serialVersionUID = 1L;   //让序列化编号不变
	private String name;
	private String age;
	public Person(String string, String string2) {
		// TODO Auto-generated constructor stub
	}
}

测试集合对象的序列化和反序列化

package aaaa_io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class ListSerilaizableTest {
	public static void main(String[] args) throws Exception {
		List<Person> list = new ArrayList<Person>();
		Arrays.asList(new Person("", ""), new Person("", ""));
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("序列化目的地"));
		oos.writeObject(list);
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("反序列环文件目的地"));
		List<Person> temp = (List<Person>) ois.readObject();
		for (Person person : temp) {

		}

	}
}

8、打印流

package aaaa_io;

import java.io.FileNotFoundException;
import java.io.PrintStream;

public class PrintStreamTest {
     public static void main(String[] args) throws FileNotFoundException {
		PrintStream ps = new PrintStream("输出数据的目的地");
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值