字符流,缓冲字符流(各种复制文件,文件夹),集合与文件,序列化与反序列化
来源:互联网 发布:nginx 跨域访问配置 编辑:程序博客网 时间:2024/06/06 03:26
缓冲字节流的数据读写过程
读数据是从缓冲区中读取数据
文件→缓冲区→自定义容器
写出的数据是放在缓冲区里面,如果需要将数据刷新到硬盘上面去,需要调用flush方法。(否则只有当缓冲区填满的时候才会将数据写写出来)
public class Demo {public static void main(String[] args) {BufferedInputStream bis=null;BufferedOutputStream bos=null;try {FileInputStream fis= new FileInputStream("/Users/yoofale/Desktop/haha.txt");bis = new BufferedInputStream(fis);FileOutputStream fos= new FileOutputStream("/Users/yoofale/Desktop/666.txt");bos = new BufferedOutputStream(fos);byte[] buf=new byte[1024];int len=-1;while((len=bis.read(buf))!=-1){bos.write(buf,0,len);//写一次数据就刷新一次数据bos.flush();}System.out.println("拷贝成功");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if(bos!=null){try {bos.close();//close内部会自动调用flush方法} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(bis!=null){try {bis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}依旧是复制文件标准套路,拷贝文件夹要用递归。
字符流:因为使用字节流操作文本数据比较麻烦,所以出现了字符流
字符流=字节流+编码表
编码表:就是一张可以表示文字的码表。
转换流:
OutputStreamWriter字符流通向字节流的桥梁
InputStreamReader字节流通向字符流的桥梁
字符流写出
public static void main(String[] args) throws Exception {FileOutputStream fos = new FileOutputStream("/Users/yoofale/Desktop/haha.txt");OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");osw.write("大吉大利,今晚吃鸡");osw.flush();osw.close();}
字符流读取
public static void main(String[] args) throws Exception {public InputStreamReader(InputStream in)创建一个使用默认字符集的InputStreamReaderFileInputStream fis = new FileInputStream("/Users/yoofale/Desktop/haha.txt");//public InputStreamReader(InputStream in,String charsetName)创建使用指定字符集的InputStreamReaderInputStreamReader isr = new InputStreamReader(fis,"UTF-8");//public int read(char[] cbuf)将字符读入数组,读取的字符数,如果已经到达流的末尾,返回-1//定义一个变量用于统计读取的字符的个数char[] cbuf=new char[1024];int len =isr.read(cbuf);//将字符数组转换成字符串String content = new String(cbuf,0,len);System.out.println(content);}模式等同于字节流。读取后放入缓冲区,进行计数,多了一步将字符数组转化成字符串的过程
文件本身的编码和写入的编码,读取的编码,要保持一致
转换流的简化写法
FileWriter是OutputStreamWriter的简化写法,FileWriter的编码方式就是默认的平台编码(写入字符文件的便捷类)
FileReader是InputStreamReader的简化写法,FileReader的编码方式也是默认的平台编码
简化的写入
public static void main(String[] args) throws Exception {// TODO Auto-generated method stubFileWriter fw =new FileWriter("/Users/yoofale/Desktop/mm.txt");fw.write("简化版成功写入");fw.flush();fw.close();}简化的读取
public static void main(String[] args) throws Exception {// TODO Auto-generated method stubFileReader fr = new FileReader("/Users/yoofale/Desktop/mm.txt");char[] brr=new char[1024];int len =fr.read(brr);System.out.println(new String(brr, 0, len));}不管是那种情况。写入结束一定要刷新,关闭流。
读取一定要用缓冲区,定义变量。
简化版的复制文件
public class CopyTestQuickly {private static FileReader fr;public static void main(String[] args) throws Exception {fr = new FileReader("/Users/yoofale/Desktop/haha.txt");FileWriter fw = new FileWriter("/Users/yoofale/Desktop/hehe.txt");char[] ass =new char[1024];int len =-1;while((len=fr.read(ass))!=-1){fw.write(ass,0,len);}fw.close();fr.close();System.out.println("拷贝成功");}}
缓冲字符流
写入数据
public static void main(String[] args) throws Exception {// TODO Auto-generated method stubFileWriter fw = new FileWriter("/Users/yoofale/Desktop/haha.txt");BufferedWriter bw = new BufferedWriter(fw);bw.write("西瓜皮");bw.append("6");//append是在后面写入bw.newLine();//nextLine()是换行bw.write("不知细叶谁裁出,二月春风似剪刀");bw.flush();bw.close();}
newLine换行!!!!!
public static void main(String[] args) throws Exception {// TODO Auto-generated method stubFileReader fr = new FileReader("/Users/yoofale/Desktop/haha.txt");BufferedReader br = new BufferedReader(fr);String line = br.readLine();System.out.println(line);line = br.readLine();//readLine()是读取一个文本行,没有数据了返回nullSystem.out.println(line);line = br.readLine();System.out.println(line);}
关于使用缓冲拷贝和普通拷贝时间的区别,先System.currentTimeMillis(),再分别调用封装的拷贝文件类,再接收时间,求差值。比较差值即可比较出效率。
复制文本文件
使用缓冲区写出数据时,如果中途不着急将一部分数据刷新出去,就等到最后关闭流的时候顺带将数据刷出去
如果缓冲区存满了,那么里面的数据都会强制刷新出去。
普通读取都是一次一个字符数组,很慢。写入可以一次一行。效率过低
缓冲字符流读取写入都很快,一次一行。!!!!!!!!!!!!切记newline换行
字符流缓冲最后都简化为BufferedReader BufferedWriter
字节流都是BufferedInputStream BufferedOutputStream
将集合中的内容保存到文件中
public class ArrayListToFile {public static void main(String[] args) throws Exception {// TODO Auto-generated method stubArrayList<String> list = new ArrayList<String>();list.add("我");list.add("是");list.add("我");BufferedWriter bw = new BufferedWriter(new FileWriter("/Users/yoofale/Desktop/haha.txt"));for (String content : list) {bw.write(content);bw.newLine();}bw.close();System.out.println("写出成功");}}
将文件中的内容写入集合中
public static void main(String[] args) throws Exception {// TODO Auto-generated method stubBufferedReader br = new BufferedReader(new FileReader("/Users/yoofale/Desktop/haha.txt"));ArrayList<String> list = new ArrayList<String>();String line=null;while((line=br.readLine())!=null){list.add(line);}br.close();for (String content : list) {System.out.println(content);}}拷贝单级文件
public class CopyFolderDemo {public static void main(String[] args) {//1.封装原文件夹的文件对象File srcFolder = new File("/Users/yoofale/Desktop/666");//2.封装要拷贝到的文件夹对象File destFolder = new File("/Users/yoofale/Desktop/777");//3.在目标位置创建一个一模一样的文件夹destFolder =new File(destFolder,srcFolder.getName());destFolder.mkdir();//4.获取原文件夹中所有的子文件对象File[] files = srcFolder.listFiles();//5.遍历所有的子文件对象数组,然后拷贝到目标文件夹中for (File srcFile : files) {//在目标文件夹里面创建一个名字一模一样的文件File destFile = new File(destFolder,srcFile.getName());//调用拷贝文件的方法copyFile(srcFile,destFile);}System.out.println("拷贝成功");}private static void copyFile(File srcFile, File destFile) {try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));BufferedOutputStream bos =new BufferedOutputStream(new FileOutputStream(destFile))){byte[] buf= new byte[1024];int len =-1;while((len=bis.read(buf))!=-1){bos.write(buf,0,len);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
java序列化:把Java对象转换成字节序列的过程
Java反序列化:把字节序列恢复为Java对象的过程
当两个java进程进行通信的时候,发送方需要进行java序列化,接收方需要进行java反序列化
序列化
// 被序列化的对象必须实现Serializable接口,否则运行错误public static void main(String[] args) throws Exception {// public objectOutputStream(OutputStream// out)创建写入指定OutputStream的ObjectOutputStreamObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/Users/yoofale/Desktop/person.txt"));// 将对象写出到文件中// public final void writeobject(Object obj)将指定对象写入ObjectOutputStreamoos.writeObject(new Person("张三", 17));oos.close();}
一个成员如果被transient修饰,那么这个对象不能序列化保存。
反序列化
private static void fileToObject() throws Exception {// TODO Auto-generated method stubObjectInputStream ois=new ObjectInputStream(new FileInputStream("/Users/yoofale/Desktop/person.txt"));Object obj = ois.readObject();System.out.println(obj);}
- 字符流,缓冲字符流(各种复制文件,文件夹),集合与文件,序列化与反序列化
- java中的io流(输入输出流,序列化与反序列化,字节流 , 字符流,包装流,缓冲流)
- protocol buffers 序列化与反序列化 文件操作
- java缓冲字符流,复制文件,逐个读取、写入
- java缓冲字符流,复制文件,数组读取、写入
- portobuf各种序列化与反序列化API
- 序列化与反序列
- 序列化与反序列
- JSON序列化与反序列化一个集合
- JSON序列化与反序列化到文件
- Io流,文件复制与文件夹复制
- java字节流与字符流之文件复制
- Symbian 流的对象序列化与反序列化
- Symbian 流的对象序列化与反序列化
- IO流对象序列化与反序列化
- java的对象流(序列化与反序列化)
- IO流丶序列化与反序列化
- IO流之序列化与反序列
- SmartRefreshLayout---“智能”下拉刷新布局
- json 级联
- java核心技术卷 之网格布局
- sublime快捷键
- 分布式跟集中式系统
- 字符流,缓冲字符流(各种复制文件,文件夹),集合与文件,序列化与反序列化
- Fabric 1.0 Crypto Generator的使用
- 《Spark快速大数据分析》笔记Ch4 键值对操作
- FTP客服端编程(ftp协议指令编程)
- 数据仓库分层架构设计
- 常用 Git 命令清单
- 在Java中如何高效判断数组中是否包含某个元素
- linux 常用命令
- Maven构建应用程序常用配置