java 学习总结:输入/输出流

1.输入/输出流概念

在这里插入图片描述

实例

package com.io;

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

public class Demo1 {

	public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("xxx.txt");		//创建流对象
		int x = fis.read();				//从硬盘上读取一个字节
		System.out.println(x);
		int y = fis.read();
		System.out.println(y);
		
		fis.close();			//关流释放资源
	}

}

2.思考

read()方法读取的是一个字节,为什么返回的是int ,而不是byte
00000000 00100010 01000001 11111111 00000000
用int会读取都补上24个零 变成4个字节

100000001 byte类型-1的原码
11111110 -1的反码
11111111 -1的补码
在这里插入图片描述

3. FileOutputStream追加

FileOutputStream在创建对象的时候是如果没有这个文件会自动帮我创建
如果有会先将文件清空

实例

package com.io;

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

public class Demo2 {

	public static void main(String[] args) throws IOException {
		demo1();
		FileOutputStream fos = new FileOutputStream("yyy.txt",true);//创建字节输出流,如果没有就自动创建一个
																	//如果想续写就在第二个参数传true
		fos.write(97);			//虽然写出的是一个int数,但是到文件上是一个字节,会自动去除前面三个8位
		fos.write(98);
		fos.write(97);
		
		fos.close();
	}

	private static void demo1() throws FileNotFoundException, IOException {
		FileOutputStream fos = new FileOutputStream("yyy.txt");		//创建字节输出流,如果没有就自动创建一个
		fos.write(97);			//虽然写出的是一个int数,但是到文件上是一个字节,会自动去除前面三个8位
		fos.write(98);
		fos.write(97);
		fos.close();
	}

}

4.IO流 核心代码(重点)

拷贝

package com.io;

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

public class Demo3 {

	public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("hello.jpg");		//创建输入流对象,关联hello.jpg
		FileOutputStream fos = new FileOutputStream("copy.jpg");		//创建输出流对象,关联copy.jpg
		int b ;
		while ((b = fis.read()) != -1) {							//在不断的读取每一个字节
			fos.write(b);  											//将每一个字节写出
		}
		fis.close(); 												//关流释放资源
		fos.close();
	}

}

5.BufferedInputStream 类可以对所有InputStream类进行带缓冲区的包装以达到性能的优化

在这里插入图片描述

6.思考

在这里插入图片描述

图解

在这里插入图片描述

7.flush()和close()方法的区别

在这里插入图片描述
在这里插入图片描述

8.图片加密:

将写出的字节异或上一个数,这个数就是密钥,解密的时候再次异或就可以了

package com.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo5 {

	public static void main(String[] args) throws IOException {
		Object hello;
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("hello.jpg"));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("hello.jpg"));
		
		int b;
		while((b = bis.read())!= -1) {
			bos.write(b ^ 123);
	}
		bis.close();
		bos.close();
	}

}

9.录入数据拷贝到文件

package com.io;

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

public class Demo6 {

	public static void main(String[] args) throws IOException {
		//1.创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		//2.创建输出流对象,关联text.txt文件
		FileOutputStream fos = new FileOutputStream("text.txt");
		System.out.println("请输入");
		//定义无限循环
		while(true) {
			String line = sc.nextLine();
			//4.遇到quit退出循环
			if("quit".equals(line)) {
				break;
			}
			//5.如果不quit。就将内容写出
			fos.write(line.getBytes());
			fos.write("\r\n".getBytes());
			
		}
		fos.close();
	}

}

10.字符流

在这里插入图片描述

11.思考

在这里插入图片描述
newLine()方法是换行
readLine()方法读取一个文本行,并将去返回为字符串。若无数据可读,则返回null
newLine()与\r\n的区别:
newLine()是跨平台的
\r\n只支持windows系统

在这里插入图片描述
在这里插入图片描述
图解
加粗样式

获取文本字符出现的次数

package com.io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.TreeMap;

public class Demo1_FileReader {
	/*
	 *分析:
	 *1.创建带缓冲的输入流对象
	 *2.创建双列集合对象TreeMap
	 *3.将读到的字符存储在双列集合中,存储的时候要判断,如果不包含这个键,就将键和1存储,如果包含这个键,就将该键的值加1存储
	 *4,关闭输入流
	 *5.创建输出流对象
	 *6.遍历集合将集合中的内容写到times.txt
	 *7.关闭输出流
	 */
	public static void main(String[] args) throws IOException {
		//1.创建带缓冲的输入流对象
		BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));
		//2.创建双列集合对象TreeMap
		TreeMap<Character, Integer> tm = new TreeMap<>();
		//3.将读到的字符存储在双列集合中,存储的时候要判断,如果不包含这个键,就将键和1存储,如果包含这个键,就将该键的值加1存储
		int ch;
		while((ch = br.read()) != -1) {
			char c = (char)ch;
			tm.put(c, !tm.containsKey(c) ? 1 : tm.get(c) + 1);
		}
		//4,关闭输入流
		br.close();
		//5.创建输出流对象
		BufferedWriter bw = new BufferedWriter(new FileWriter("times.txt"));
		//6.遍历集合将集合中的内容写到times.txt
		for(Character key : tm.keySet()) {
			switch(key) {
				case '\t':
				bw.write("\\t" + "=" + tm.get(key));
				break;
				case '\n':
					bw.write("\\n" + "=" + tm.get(key));
					break;
				case '\r':
					bw.write("\\r" + "=" + tm.get(key));
					break;
			}
			bw.newLine();
		}
		bw.close();
	}

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值