JavaSE基础知识梳理——IO流和nio部分内容

六、IO流

  • 这一部分IO流指的是Java.util.io包下的标准IO流。java.io包下提供的是同步IO流,它指的是必须等数据返回后才能执行后续代码,即它是阻塞的,如in.read会阻塞。缺点是CPU执行效率低,但代码简单java.nio包下提供的是异步IO流,CPU效率高,但代码复杂普通IO流方式如果使用相对路径,windows是project下,与src同级

  • IO流分为字节流和字符流,其中带stream的都是字节流,以字节为单位进行读写。带reader\writer的都是字符流,以字符为单位读写。

  • IO流的工作方式为:从磁盘中读到内存,从内存中写到磁盘。

  • IO流在死循环中读取数据,并不会一直重复读取数据,而是读完了就会停止,此时循环体变成空循环体,如:因为字节流就好比一个管道,当读取完数据之后,管道就空了,再读也就读取不到了。但是写数据不会停止

  • 类路径:maven工程为java和resources下。普通工程为src下。当使用类加载器读取路径时,读取的是编译后的class文件的路径,对于maven工程,是target/classes下。其实类路径是输出文件夹中的路径,只是因为在maven工程中这两个路径结构相同,所以可以忽略。

  • System类下的in:InputStream,默认读取控制台,可以重定向System.setIn()

    System类下的out:PrintStream,默认输出到控制台,可以重定向System.setOut()

    System.getProperty("user.dir"),可以获得当前工程的相对路径。

6.1 InputStream和OutputStream

//InputStream和OutputStream是两个抽象类

//InputStream类方法
    int read():读一个字节,返回读到的内容,int形式
    int read(byte[]):读一个字节数组长度的字节,将内容存到该数组,返回实际读取到的长度,碰到输入流末尾-1时返回
    long skip(int n):跳过前n个字节,返回实际跳过的字节数
    int available():返回在不阻塞情况下可获取的字节数,当阻塞时该线程失去了对资源的占有
    void close():关闭
    void mark(int readlimit):在输入流的当前位置打一个标记(并非所有流都支持这个方法),如果从输入流中已经读取的字节数大于readlimit,则这个流忽略这个标记
    void reset():返回到最后一个标记,随后对read的调用将重新读入这些字节,如果没有任何标记,则不重置流。
    boolean markSupported():检查该流是否支持标记

//OutputStream类方法
    void write(int):写一个字节
    void write(byte[]):写一个字节数组
    void write(byte[] int offset,int len):写一个指定长度的字节数组
    void flush():将流从管道冲刷出去,发送到目的地
    void close():关闭流

6.2 DataInputStream和DataOutputStream

//DataInputStream类方法
    .readBoolean\readDouble\readInt...:读入一个指定类型的值
    String readUTF():读入由修订过的UTF-8格式组成的字符串。(该字符串格式必须是修订过的UTF-8才能正确读取,否则报EOF异常,即应该读取writeUTF的内容)

//DataOutputStream类方法
    .writeBoolean\writeDouble\writeInt...:读入一个指定类型的值
    String writeUTF():写出由修订过的UTF-8格式组成的字符串。(与readUTF搭配)

6.3 InputStreamReader和OutputStreamWriter

//字节流转换为字符流:
    -InputStreamReader(InputStream in)
//把输入字节流转为字符流,可以供字符流的构造参数使用
    -OutputStreamWriter(OutputStream out)
同理

6.4 FileInputStream和FileOutputStream

//FileInputStream类
    int read():无参时是按1个字节读,返回的是读到的ASCII码
    int read(byet[]):按多少个字节读,将字节数据存到字节数组中,返回的是读到的字节长度,一共读了多少个字节,不是ASCII码
    long available 返回流当中剩余的没有读到的字节数量(即对应于文件中,还有多少个字节没有被读取)
    它的好处:初始调用可以得到文件的总字节数量,直接创建一个对应大小的字节数组去读取就可以不用循环了,不适合大文件 
    int skip(long n)  跳过几个字节不读
//FileOutputStream
    void write(int b):按ASCII码写入该字符
    void write(byet[]):把字节数组中的数据写入
    void write(byte[] off len):写多少
    void flush():刷新流中未写入的数据
读与写最好是同时进行,一边读,一边写,而不是读完了再写;

6.5 FileReader和FileWriter

//FileReader
按字符读取,可以按字符数组读取,擅长于操作普通文本
    int read(char[])

//FileWriter
按字符流写,只能输出普通文本,不能操作视频、图片等,也可以输出指定长度的字符
    void write(char[],int offset,int len)

6.6 缓冲流

/*缓冲流:自带有char[]、byet[]数组,不需要new;
当一个流的构造方法中需要另一个流时,这个被传进来的流称为:节点流
外部负责包装的这个流称为:包装流\处理流*/

//BufferedReader
    String readLine():返回值为String,当读到末尾时为null,带缓冲区不需要指定数组,可以按行读,但是速度没有前面快,且没读换行符。所以输出的时候用System.out.println()就可以把原来文本的换行符补上。
//BufferedWriter
//BufferedInputStream
//BufferedOutputStream  

6.7 ObjectInputStream和ObjectOutputStream

  • 对象流:(序列化:把内存中的Java对象放到硬盘上 反序列化:把硬盘中的数据返回到内存中,恢复成java对象)
    类必须实现Serializable接口才能可序列化,JVM会去识别这个标志,自动生成一个序列化版本号。
    建议如果一个类实现了序列化接口,手动给该类提供一个固定不变的序列号,这样以后更改类的内容时,JVM还是会认为是同一个类(因为如果不提供序列号,JVM重新编译生成新的序列号,类就成一个新的了,在反序列化的时候就不能解码了)
    java中通过什么机制来区分类?
    -1、通过类名进行对比
    -2、如果类名一样,通过序列化版本号进行区分(只要两个类都实现了序列化接口,即使类名相同,JVM也能区分)
  • transient关键字:修饰的变量不参与序列化不可序列化异常(==NotSerializableException==):原因:未实现Serializable接口
//ObjectInputStream
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("Stu"));
    Object o = in.readObject();
//ObjectOutputStream
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("ooops"));
    out.writeObject();

6.8 标准输出流

//标准输出流
-PrintWriter
    new PrintWriter(包装流对象,重定向输出)
-PrintStream
    new PrintStream(包装流对象,重定向输出)

6.9 Properties类

//Properties。它是一个Map集合。
    void load(Reader)
    void load(InputStream)
    Object getProperty(key)
    Object setProperty(key,value)
    void list(PrintStream\PrintWriter)把该property的内容输出到指定的流

6.10 File类

//File,不是流,是路径名的抽象表示形式(目录或者文件)
//默认路径和IO流一样,当前工程下与src同一级
    void createNewFile()
    void mkdirs() 创建该路径下的目录,如果有不存在的目录,一起创建出来
    void mkdir() 创建当前目录,如果父目录不存在就报错
    boolean exits()
    String getParent()
    String getPath()  取得相对路径(相对于工程的路径,比如maven的src/main/....)
    String getAbsolutePath() 取得在磁盘中的绝对路径
    boolean isDirectory()
    boolean isFile()
    File[] listFiles()

6.11 网络流

  • URL下的流

    URL url = new URL("https://www.baidu.com");
    Connection conn = url.openConnection();
    conn.getInputStream()//获取客户端输入流,客户端输入流返回的内容是网页源码,一般用缓冲流接收
    
    url.openStream()//直接获取输入流。
    

七、nio包下的流

7.1 Paths类

  • Paths是一个工具类,用于产生Path对象,Paths对象构造方法为private,Path为一个接口。

==常用方法==

Path:接口
    Paths.get(String first,String... more),通过连接给定的字符串组成一个路径,该路径可以不存在,只是一个目录序列,返回Path
    Path resolve(String other)
    Path resolve(Path other)
    如果other是绝对路径,就返回other,否则,连接this和other。即当前路径作为parent。
    Path resolveSibling(String other)
    Path resolveSibling(Path other)
    如果other是绝对路径,就返回other,否则,连接this的父路径和other。即当前路径的父路径作为parent,other和this同级目录。
    Path relative(Path other):返回相对于调用者path,other相对于this的路径。即从this出发,得到other的相对路径。
    Path normalize():移除相对路径中.. . 这些元素
    Path toAbsolutePath():返回磁盘中的绝对路径
    Path getFileName():返回该路径中最后一个部件的名称,当路径为空时返回null
    Path gerRoot():返回该路径中的根部件,当路径为空时返回null
    File toFile():从该路径中创建一个File对象

7.2 Files类

  • Files工具类:适合处理中等长度的文本文件,这种方式简便快捷。如果处理的文件较大,还是应该用传统的字节流或者字符流。

==常用方法==

    static byte[] readAllBytes(Path path):读入文件所有内容,存进字节数组中,可以用new String()返回字符串
    static List<String> readAllLines(Path path,Charset charset):按行读取,返回到集合中
    static Path write(Path path,byte[] contents,OpenOption...options):向指定path中写入contents,返回该Path对象,OpenOption表示可以追加的操作,比如StandardOpenOption.APPEND,表示从末尾追加写入
    static Path wirte(Path path,Iterable<? extends Charsequence> contents,OpenOption option):表示可以向指定的path写入任何可迭代的对象,比如集合。Map不能,因为它不可迭代。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335