周记
IO流
存储和读取数据的解决方案
分类
纯文本文件(txt ,md)
注意:Window自带的记事本能读懂的文件
word excul
File类
1.对象的创建。
2.常用方法(具体可以参考API文档)
3.遍历目录下的文件
public void fileList(File contents) {
File[] files = contents.listFiles();
for (File file : files) {
System.out.println(file);
if (file.isDirectory()) {//检查子文件夹是否为目录
fileList(file);
}
}
}
字节输出流的细节
1.创建字节输出流的对象
细节1:参数是字符串表述的路径或者是File对象都是可以的
细节2:如果文件不存在就会创建一个新的文件,但是要保证父级的路径存在
细节3:如果文件有内容则会将文件的数据清除
2.写数据
write 方法的参数是整数数字对应的是字符
3.释放资源
在每次用完流之后,释放资源
字节输出流写数据的3种方式
字节输出流写数据的两个错误
换行写:
再次写一个换行符
Windows:\r\n
java中写\r,\n其中一个都行
续写:
创建对象时将第二个参数设为true
字节输入流的细节
1.创建字节输入流的对象(文件中不能写中文)
细节1:如果文件不存在直接报错(不会新建)
2.读数据
read 方法返回的参数是一个整数
读到末尾read返回-1;
3.释放资源
在每次用完流之后,释放资源
字节输入流的循环读取
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Main1 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream(".idea//a.txt");
int b;
while ((b=fis.read())!=-1){
System.out.print((char)b);
}
fis.close();
}
}
文件的复制
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Main1 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream(".idea//a.txt");
FileOutputStream fos=new FileOutputStream(".idea//b.txt");
int b;
while((b=fis.read())!=-1){
fos.write(b);
}
fis.close();
fos.close();
}
}
字符集
Unicode 字符集的UTF-8编码格式
一个英文占一个字节,二进制第一位是0转成十进制是正数
一个中文站三个字节,二进制的第一位是1,第一个字节转换为十进制是负数
字符流
字符输入流细节
1.创建字符输入流的对象
2.read数据
read方法默认是一个字节一个字节读的遇到中文后一次读取多个数据
len对参数进行强转
3.释放资源
在每次用完流之后,释放资源
字符输出流细节
1.创建字符输出流的对象
细节1:参数是字符串表述的路径或者是File对象都是可以的
细节2:如果文件不存在就会创建一个新的文件,但是要保证父级的路径存在
细节3:如果文件有内容则会将文件的数据清除
2.写数据
write 方法的参数是整数数字对应的是字符
3.释放资源
在每次用完流之后,释放资源
字节流,字符流的使用场景
拷贝文件夹
if else if
判断文件,拷贝
判断文件夹 递归
import java.io.*;
public class Main1 {
public static void main(String[] args) throws IOException {
}
public static void copydir(File src,File dest) throws IOException {
dest.mkdirs();
File []files=src.listFiles();
for (File file:files){
if(file.isFile()){
FileInputStream fis=new FileInputStream(file);
FileOutputStream fos=new FileOutputStream(new File(dest,file.getName()));
byte [] bytes=new byte[1024];
int len;
while((len= fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fos.close();
fis.close();
}else {
copydir(file,new File(dest,file.getName()));//递归
}
}
}
}
文件加密(类似与拷贝)
用到的知识点是异或
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test2 {
public static void main(String[] args) throws IOException {
/*^异或
两边相同flase 0
两边不同为true 1
对同一个数字异或两次还是本身
* */
FileInputStream fis=new FileInputStream(".idea\\a.txt");
FileOutputStream fos=new FileOutputStream(".idea\\a.txt");
int b;
while((b=fis.read())!=-1){
fos.write(b^2);
}
fos.close();
fis.close();
}
}
IO流体系
字节缓冲流
import java.io.*;
public class Main3 {
public static void main(String[] args) throws IOException {
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(".idea\\a.txt"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(".idea\\b.txt"));
int b;
while((b= bis.read())!=-1){
bos.write(b);
}
bos.close();
bis.close();
}
}
字符缓冲流
特有的特点
1.输入流中readLine()
2.输出流中的newLine()
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Main4 {
public static void main(String[] args) throws IOException {
BufferedWriter bw=new BufferedWriter(new FileWriter("c.txt"));
bw.write("嘴角上扬");
bw.newLine();
bw.write(" ");
bw.newLine();
bw.close();
}
}
缓冲流自带长度为8192的缓冲区
转换流
是字符流和字节流的桥梁
import sun.nio.cs.ext.GBK;
import java.io.*;
import java.nio.charset.Charset;
public class Main4 {
public static void main(String[] args) throws IOException {
//创建对象
InputStreamReader isr = new InputStreamReader(new FileInputStream(".idea\\a.txt"),"GBK");
int ch;
while((ch= isr.read())!=-1){
System.out.println((char)ch);
}
isr.close();
}
}
序列化流
import sun.nio.cs.ext.GBK;
import java.io.*;
import java.nio.charset.Charset;
class Student implements Serializable{//标记型接口
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Main4 {
public static void main(String[] args) throws IOException {
//创建对象
Student stu=new Student("张三",23);
//创建序列化流的对象/对象操作输出流
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(".idea\\a.txt"));
oos.writeObject(stu);
oos.close();
}
}
反序列化流
import java.io.*;
public class Main5 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//创建反序化流的对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(".idea//a.txt"));
Object o=(Student)ois.readObject();
System.out.println(o);
ois.close();
}
}
打印流
分类:打印流一般是指PrintStream,printWriter两个类
特点1:打印流只能操作文件目的地,不能操作数据源
特定2:特有的写出方法,可以实现,数据的原样写出
特点3:打印时自动换行
字节打印流
import java.io.*;
public class Main5 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//创建字节打印流对象
PrintStream ps=new PrintStream(new FileOutputStream(".idea//a.txt"));
ps.println(97);//不会删除之前的内容
ps.print("无敌了孩子");
ps.close();
}
}
字符打印流
import java.io.*;
public class Main5 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//字符流底层有缓冲区,想要自动刷新需要开启
//创建字符打印流的对象
PrintWriter pw=new PrintWriter(new FileWriter(".idea//a.txt"),true);
pw.println(23);
pw.println("fwewaf");
}
}
打印流的应用场景
获取打印流的对象,此打印流在虚拟机启动的时候,有虚拟机创建,默认指向控制台
//特殊的打印流,系统中的标准输出流,是不能关闭的,在系统中是唯一的。
调用println时自动换行自动刷新
解压缩流(读)输入流
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class Main {
public static void main(String[] args) {
//创建一个·File表示解压的压缩包
File src=new File("D:\\test.zip");
//创建一个File表示解压的目的地
File dest=new File("D:\\");
}
public static void outZip(File src,File dest) throws IOException {
//
ZipInputStream zip=new ZipInputStream(new FileInputStream(src));
ZipEntry entry;
while((entry=zip.getNextEntry())!=null){
System.out.println(entry);
//文件夹:需要在目的地dest创建一个同样的文件夹
if(entry.isDirectory()){
File file=new File(dest,entry.toString());
file.mkdirs();
}
else {
FileOutputStream fos=new FileOutputStream(new File(dest,entry.toString()));
int b;
while((b=zip.read())!=-1){
fos.write(b);
}
fos.close();
zip.closeEntry();
}
}
zip.close();
}
}
压缩流(写)输出流
单个文件
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
//TIP 要<b>运行</b>代码,请按 <shortcut actionId="Run"/> 或
// 点击间距中的 <icon src="AllIcons.Actions.Execute"/> 图标。
public class Main {
public static void main(String[] args) throws IOException {
File src = new File("D:\\test.txt");
File dest = new File("D:\\");
toZip(src,dest);
}
public static void toZip(File src,File dest) throws IOException {
ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(new File(dest,"test.zip")));
ZipEntry entry=new ZipEntry("a.txt");
zos.putNextEntry(entry);
FileInputStream fis=new FileInputStream(src);
int b;
while((b=fis.read())!=-1){
zos.write(b);
} zos.closeEntry();
zos.close();
}
}
压缩文件夹
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class Main {
public static void main(String[] args) throws IOException {
//创建一个·File表示压缩
File src=new File("D:\\test.zip");
File destParent=src.getParentFile();
File dest =new File(destParent,src.getName()+".zip");
ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(dest));
Zip(src,zos,src.getName());
zos.close();
}
public static void Zip(File src,ZipOutputStream zos,String name) throws IOException {
File [] files=src.listFiles();
for(File file:files){
if (file.isFile()){
ZipEntry entry=new ZipEntry(name+"\\"+file.getName());
zos.putNextEntry(entry);
FileInputStream fis=new FileInputStream(file);
int b;
while((b= fis.read())!=-1){
zos.write(b);
}
fis.close();
zos.close();
}else {
Zip(file,zos,name+"\\"+file.getName());
}
}
}
}
第八周总结
第八周总结
今周主要学习了Io流对文件的一系列处理,我是先看课本,在看网上的视频,自我感觉此次的效率非常的高,自己熟悉课本,知道这节的重要内容,在看视频学习博主的思路过程,收获很多,此外在视频中学到了在课本上未提及的压缩流,解压流,感觉收获很多,图形化界面也看完了,下一阶段主要学习数据库的相关内容,学完数据库,开始坐飞机大战的游戏