IO流(字节流,字符流,打印流)

Java学习第九周

1.:IO流分类
a:按照数据流向
输入流 读入数据
输出流 写出数据
b:按照数据类型
字节流 可以读写任何类型的文件 比如音频 视频 文本文件
字符流 只能读写文本文件
什么情况下使用哪种流呢?
如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。
如果你什么都不知道,就用字节流
使用完流之后记得释放资源.close()

2.IO流(FileOutputStream的三个write()方法)
public void write(int b):写一个字节 超过一个字节 砍掉前面的字节
public void write(byte[] b):写一个字节数组
public void write(byte[] b,int off,int len):写一个字节数组的一部分
换行符只用是 \r\n
注意写入的都是字节,用getbytes转换
int read():一次读取一个字节
如果没有数据返回的就是-1

3.高效字节流
BufferedOutputStream
BufferedInputStream

4.多层文件夹复制
利用缓冲区的思想与递归进行复制
代码

public class CopyFileDemo2 {
    public static void main(String[] args) throws IOException {
        File file1 = new File("E:\\test");
        File file2 = new File("E:\\test2");
        if(!file2.exists()){
            file2.mkdirs();
        }
        copyFolders(file1,file2);
    }

    private static void copyFolders(File file1, File file2) throws IOException {
        File[] files = file1.listFiles();
        for (File f : files) {
            if(f.isFile()){
                copyFile(f, file2);
            }else{
                File file = new File(file2, f.getName());
                file.mkdirs();
                copyFolders(f,file);
            }
        }
    }

    private static void copyFile(File f, File file2) throws IOException {
        FileInputStream in = new FileInputStream(f);
        FileOutputStream out = new FileOutputStream(new File(file2, f.getName()));
        byte[] bytes = new byte[1024 * 8];
        int len=0;
        while ((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();
    }
}

5.IO流(字符流)
写数据的方式:
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) 写一个字符串的一部分
转换流 便捷类

  • OutputStreamWriter ------- FileWriter
  • InputStreamReader ------- FileReader
    字符流写完必须flush()否则不能写入
    高效的字符输出流: BufferedWriter
    高效的字符输入流: BufferedReader
    BufferedWriter: public void newLine():根据系统来决定换行符 具有系统兼容性的换行符
    BufferedReader: public String readLine():一次读取一行数据 是以换行符为标记的 读到换行符就换行 没读到数据返回null

6.IO流(字符缓冲流的特殊功能复制文本文件)

A:案例演示:	字符缓冲流的特殊功能复制文本文件

	// 创建对象
	BufferedReader br = new BufferedReader(new FileReader("OutputStreamWriterDemo.java")) ;
	BufferedWriter bw = new BufferedWriter(new FileWriter("copyFile2.txt")) ;
	
	// 频繁的读写操作
	String line = null ;		// 作用: 记录读取到的行数据
	while((line = br.readLine()) != null){
		bw.write(line) ;
		bw.newLine() ;
		bw.flush() ;
	}
	
	// 释放资源
	bw.close() ;
	br.close() ;

7.IO流(键盘录入学生信息按照总分排序并写入文本文件)

	A:案例演示:	需求:键盘录入3个学生信息(姓名,语文成绩(chineseScore),数学成绩(mathScore),英语成绩(englishScore)),
 * 	           按照总分从高到低存入文本文件
 * 
 * 分析: 	
 * 		a: 创建一个学生类: 姓名,语文成绩(chineseScore),数学成绩(mathScore),英语成绩(englishScore)
 * 		b: 因为要排序,所以需要选择TreeSet进行存储学生对象
 * 		c: 键盘录入学生信息,把学生信息封装成一个学生对象,在把学生对象添加到集合中
 * 		d: 创建一个高效的字符输出流对象
 * 		e: 遍历集合,把学生的信息写入到指定的文本文件中
 * 		f: 释放资源


 //  因为要排序,所以需要选择TreeSet进行存储学生对象
		TreeSet<Student> students = new TreeSet<Student>(new Comparator<Student>() {
			
			@Override
			public int compare(Student s1, Student s2) {
				
				// 比较总分
				int num = s2.getTotal() - s1.getTotal() ;
				
				// 比较姓名
				int num2 = (num == 0 ) ? s2.getName().compareTo(s1.getName()) : num ;
				
				// 返回
				return num2;
			}
		}) ;
		
		// 键盘录入学生信息,把学生信息封装成一个学生对象,在把学生对象添加到集合中
		for(int x = 0 ; x < 3 ; x++){
			
			int i =  x + 1  ;
			
			System.out.println("第" + i + "个学生信息录入开始................................");
			
			// 创建一个Scanner对象
			Scanner sc = new Scanner(System.in) ;
			System.out.println("请您输入第" + i + "个学生的姓名: ");
			String name = sc.nextLine() ;
			System.out.println("请您输入第" + i + "个学生的语文成绩: ");
			String chineseScoreStr = sc.nextLine() ;
			System.out.println("请您输入第" + i + "个学生的数学成绩: ");
			String mathScoreStr = sc.nextLine() ;
			System.out.println("请您输入第" + i + "个学生的英语成绩: ");
			String englishScoreStr = sc.nextLine() ;
			
			// 创建一个学生对象
			Student s = new Student() ;
			s.setName(name) ;
			s.setChineseScore(Integer.parseInt(chineseScoreStr)) ;
			s.setMathScore(Integer.parseInt(mathScoreStr)) ;
			s.setEnglishScore(Integer.parseInt(englishScoreStr)) ;
			
			// 把学生对象添加到集合中
			students.add(s) ;
			
		}
		
		// 创建一个高效的字符输出流对象
		BufferedWriter bw = new BufferedWriter(new FileWriter("studentInfo.config")) ;
		bw.write("姓名\t\t总分\t\t语文成绩\t\t数学成绩\t\t英语成绩") ;
		bw.newLine() ;
		bw.flush() ;
		
		// 遍历
		for(Student s : students){
			bw.write(s.getName() + "\t\t" + s.getTotal() + "\t\t" + s.getChineseScore() + "\t\t" + s.getMathScore() + "\t\t" + s.getEnglishScore()) ;
			bw.newLine() ;
			bw.flush(); 
		}
		
		// 释放资源
		bw.close() ;
	
		//提示
		System.out.println("学生信息存储完毕......................ohyeah!");

8.IO流(打印流)
方法
PrintWriter
PrintWriter(OutputStream out, boolean autoFlush)参数autoFlush为true时,自动完成自动刷新功能 PrintWriter(Writer out, boolean autoFlush)参数autoFlush为true时,自动完成自动刷新功能
public void print(String s) 写出数据, 不换行
public void println(String x) 写出数据, 同时换行

ObjectOutputStream
public final void writeObject(Object obj)将指定的对象写入 ObjectOutputStream。

ObjectInputStream
public final Object readObject() 从 ObjectInputStream 读取对象

Properties
public Object setProperty(String key, String value) 存储键值对元素到集合
public String getProperty(String key) 获取集合中给定键所对应的值
public Set stringPropertyNames()返回此属性列表中的键集,其中该键及其对应值是字符串
public void load(Reader reader) 从流中读取数据,把数据存储到集合中
public void load(InputStream inStream) 从流中读取数据,把数据存储到集合中
public void store(OutputStream out,String comments) 把集合中的数据, 写出到流所对应的文件中
public void store(Writer writer,String comments) 把集合中的数据, 写出到流所对应的文件中

打印流(PrintStream、PrintWriter)的特点:
PrintStream在OutputStream基础之上提供了增强的功能,即可以方便地输出各种类型的数据(而不仅限于byte类型)的格式化表示形式。PrintStream的方法从不抛出IOException
PrintWriter提供了PrintStream的所有打印方法,其方法也从不抛出IOException。
与PrintStream的区别:作为处理流使用时,PrintStream只能封装OutputStream类型的字节流,而PrintWriter既可以封装OutputStream类型的字节流,还能够封装Writer类型的字符输出流并增强其功能。

9.通过序列化流与反序列化流完成从file.txt文件存取对象的操作

public class SerializableStreamTest {
   public static void main(String[] args) throws IOException, ClassNotFoundException {
      //write();
      read();
   }

   public static void read() throws IOException, ClassNotFoundException {
      ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.txt"));
      Object obj = ois.readObject();
      System.out.println(obj);
      ois.close();
   }

   public static void write() throws IOException {
      ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file.txt"));
      Student s = new Student("张三", 23);
      oos.writeObject(s);
      oos.close();
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值