Java的字符流和字节流

Java的字节流:把数据从程序存储到文件,把数据从文件读取程序中

File:只操作文件和文件属性,createNewFile

getPath--->项目目录 ,getAbsolutePath()

getName()---->substring()

list()-->列出当前目录的所有文件或文件夹,返回值String[] ,返回只有文件名,路径可以拼接

listFiles()---->列出当前目录的所有文件或文件夹,返回值是File[],调用File的方法去进行处理

字节流

返回的整型int

输入流 FileInputStream   read方法   最后关闭close

输出流 FileOutputStream  write方法  最后关闭close

性能指标参考:System. currentTimeMillis(),具体的时间戳.

实际处理问题,一般是有缓存,定义一个字节数组byte[]

系统提供了缓存的类

BufferInputStream-->(FileReader)FileInputStream-->File

缓存输入类 BufferedInputStream  

缓存输出类 BufferedOutputStream

底层写缓存的方法,与我们自己定义字节数组缓存思想一样.
BufferedInputStream缓存数字是8192  (8K)

文件内容放在Buffer中,读的时候用BufferedInputStream,写的时候用BufferOutputStream

字节流:处理文件传输

字符流:专门针对于文本文件处理

FileReader-->FileInputStream-->File, 底层是Reader类

FileWriter, 底层是Writer类

实质还是字节,只不过处理过程用char

Reader的缓存类BufferedReader,这个类中readLine,读文本文件处理,往往项目需求按行读

Buffer,使用缓存,write后一定flush(),如果关闭,自动flush()

在应用缓存的开发中,这里有三种操作:剪切,复制,粘贴。剪切,复制对文字是100%有效,字符流更好保证了剪切,复制,粘贴。

不执行flush(),数据在缓存中,flush()之后数据变成实际的文件

剪切是不清楚这个文件剪切,剪切是不保存文件的,

剪切逻辑: 

首先把文件全部在缓存中,不执行flush()方法,只有粘贴时执行flush方法,New Writer里面传File,File没有路径是做不了的.相当于剪切必须知道剪切到哪里.实际操作是不知道路径的,就必须有一个路径先有效,后期把路径覆盖.

所以每个人电脑都有一个预先的路径设置,预先设置的路径是临时文件.(tmp)

文件剪切,执行文件到缓存中,同时在源路径删除 , 实际开发,用buffer产生临时文件.  执行到粘帖时,把缓存中的数据flush就可以。剪切,一定需要Buffer

复制

复制文件:

首先文件是否存在,不存在,报错:文件不存在

如果文件存在,复制到缓存中,不flush, 自己找一个路径,做临时文件的路径,用户选择粘贴:输入粘贴的地址:地址是文件是文件夹,文件夹(有没有无所谓,创建文件夹)

文件(创建文件)flush, 复制不删除原文件

//定义执行时间记录long start=System.currentTimeMillis();//复制文件,有输入,有输出,输入一个路径,输出一个路径//FileInputStream输入流,有输入FileInputStream fis=new FileInputStream("C:\\Users\\Administrator\\Desktop\\aaa.png");//FileOutputStream 输出流,有输出FileOutputStream fos=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\bbb.png");int ch=0;while((ch=fis.read())!=-1){fos.write(ch);}//结束后flush
//        fos.flush();//流运行结束,一定要关闭fis.close();fos.close();

剪切:

首先文件是否存在,不存在,报错:文件不存在 , 如果文件存在,复制到缓存中,不flush

但是把原文件删除掉 , 用户粘帖,用把flush到这个路径,无论复制,剪切,到粘帖,把临时文件中产生的临时文件干掉.

代码在码云:


 面向接口开发.

Java线程

Java面临的问题并发的问题

同时: 并发 (访问程序时多个用户对程序同时操作)

模拟抢票

面向对象

类->票   

 当前写法还是主线程的程序调用for循环

public class MyMain {
    public static void main(String[] args) throws Exception {
        //new实例化,把MyTrain初始化,才有100张票,放在循环里,就是每个人都有100张票
        //现在只有一趟火车,100张票
        MyTrain mytrain=new MyTrain();
        //这里的i就是100个人
        for(int i=0;i<100;i++){
            System.out.println(mytrain.fetch());
        }
    }
}

 模拟并发,开线程

进程,在进程中可能并发的过程,并发的过程就是线程.

进程是一条火车道,每个火车都走自己的线,

线程:java中的每一个程序抢票,模拟多线程抢票

Thread线程类

线程是需要运行的 run方法

@Override
public int fetch() {if(tickets<=0){return -1;}return --tickets;}

源代码在码云 Gitee,有需要的小伙伴自取哦:

Java的字符流和字节流抢票代码 · zyt/麦当劳投资人 - Gitee.comicon-default.png?t=N7T8https://gitee.com/zytscode/mcdonalds-investors/blob/master/Java%E7%9A%84%E5%AD%97%E7%AC%A6%E6%B5%81%E5%92%8C%E5%AD%97%E8%8A%82%E6%B5%81%E6%8A%A2%E7%A5%A8%E4%BB%A3%E7%A0%81