1.file类
文件或目录都被抽象成一个file实例;
File file = new File(“c:\\demo.txt”); //表示文件
File dir = new File(“c:\\dir”); //表示目录
2.什么是流?
流是一组有序,有起点和终点的字节的数据序列。包括输入流和输出流.
是指一连串流动的字符,是以先进先出方式发送信息的通道。
3.分类
- 字节流:8位
- 字符流:字符,不同编码位数不一样;
4.常用字符字节流
5.BufferedReader与BufferedWriter读写文本文件
文本缓冲流采用的装饰器模式进行设计,它包装了一个字符流同时内部提供一个缓冲区,这样可以使读写有更好性能。
6.位(bit)、字节(byte)、字符、编码之间的关系
1.位:bit
- 数据存储的最小单位,每个二进制数字0和1就是1个位。
2.字节:byte
- 8个位构成一个字节,即:1 byte(字节) = 8 bit(位);
3.字符:
- a、A、中、+、*、の…均表示一个字符;
- 一般 utf-8 编码下,一个汉字 字符 占用 3 个 字节;
- 一般 gbk 编码下,一个汉字 字符 占用 2 个 字节;
4.编码:
- 规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。
- 通俗的说:编码就是按照规则对字符进行翻译成对应的二进制数,在计算器中运行存储,用户看的时候(比如浏览器),在用对应的编码解析出来用户能看懂的;
7.字节输入Input,OutputStream输出流;
- OutputStream是抽象类,是表示输出字节流的所有超类,操作的数据都是字节,定义了字节输出流的基本共性和方法;
- InputStream的作用是将文件中的数据读入到内存中
8.字符流Reader和Writer
- Reader是抽象类,Reader的直接子类有InputStreamReader,它的直接子类有FileReader.这表明Reader是字符输入流的祖宗类。
- Writer是抽象类,Writer的直接子类有OutputStreamWriter,它的直接子类有FileWriter.这表明Writer字符输出流的子类。
9.字符流和字节流的区别
- 字节流是以字节为单位传递的,因为所有电脑上的东西都是二进制字节,因此可以传递任何数据,比如图片,各种字符等。字节流只能写入字节,读取字节
- 字节流FileInputStream读取方法read()是一个字节一个字节的读取,Write()方法是一个字节一个字节的写入
- 字符流是根据字符所占字节大小而决定读取多少字节的
- 用字符流,去读取,字符流会根据默认编码一次性的读取一个字符,即若是utf-8编码就会读取3字节,若是gbk编码就会一次读取2个字节
10.字符流读写文件:FileReader和FileWriter;
try ( FileReader fileReader = new FileReader("D:" + File.separator + "123.java");
FileWriter fileWriter = new FileWriter("D:" + File.separator + "333.txt");
){
int len=-1;
char[] c=new char[1024];
//读文件
while ((len= fileReader.read(c))!=-1){
String str = new String(c, 0, len); //三个属性:内容 开始 结束
System.out.println(str);
//文件写
fileWriter.write(c,0,len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
11.字符缓冲流读文件,合并写;
//两个读合并写进一个
try (BufferedReader bufferedReader1 = new BufferedReader(new FileReader("E:\\122.txt"));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("E:\\write.txt"));
BufferedReader bufferedReader = new BufferedReader(new FileReader("E:\\123.txt"))
) {
String line = null;
//写入第一个
while((line=bufferedReader.readLine())!=null){
bufferedWriter.write(line);
bufferedWriter.newLine();
}
//第二个
while((line=bufferedReader1.readLine())!=null){
bufferedWriter.write(line);
bufferedWriter.newLine();
}
} catch (IOException e) {
}
12.字符流–键盘输入写到文件
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\321.txt"));
) {
String str = null;
while ((str=br.readLine())!=null) {
System.out.println(str);
if (str.equals("结束")) {
System.out.println("写入已经结束");
break;
}
bw.write(str);
bw.newLine();
}
} catch (IOException e) {
}
13.字节流读写文件
try (FileInputStream fileInputStream = new FileInputStream("E:\\a1.jpg");
FileOutputStream fileOutputStream = new FileOutputStream("E:\\aaa.jpg")
) {
//创建缓冲区
byte[] bytes = new byte[1024 * 10];
int len = -1;
while ((len=fileInputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0,len);
}
} catch (IOException e) {
}
14.字节缓冲流读写文件input和output;
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\cat.gif"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\333.gif"));
) {
int len = -1;
byte[] bytes = new byte[1024 * 2000];
//read()读入缓冲区的字节总数,如果因为已经到达流末尾而没有更多的数据,则返回 -1
while ((len = bis.read(bytes)) != -1) {
//write()将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流
System.out.println(1);
bos.write(bytes,0,len);
}
} catch (IOException e) {
}
15.字节缓冲流从网上下载图片,也可下载其他文件
BufferedOutputStream bos = null;
BufferedInputStream bis=null;
try {
//传入一个图片链接
URL url = new URL("https://ss1.baidu.com/9.jpg");
InputStream inputStream = url.openConnection().getInputStream();
//图片字节流
bis = new BufferedInputStream(inputStream);
bos = new BufferedOutputStream(new FileOutputStream("E:\\copy1.jpg"));
int ben=-1;
byte[] bytes = new byte[1024 * 10];
while ((ben = bis.read(bytes)) != -1) {
bos.write(bytes,0,ben);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bis.close();
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
16.字符流从网站下载文件
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
URL url = new URL("https://www.sogou.com/");
InputStream inputStream = url.openConnection().getInputStream();
//网站文本字符流 -----字节转字符
bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
bufferedWriter = new BufferedWriter(new FileWriter("E:\\copy.html"));
String line = null;
while ((line=bufferedReader.readLine()) != null) {
System.out.println(line);
bufferedWriter.write(line);
bufferedWriter.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bufferedReader.close();
bufferedWriter.flush();
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
17.BufferReader有read和readLine函数;
其他的只有read函数;