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();
}
}