Java 笔记09

简介: Module 10:I/O流(java如何实现与外界数据的交流) Input/Output:指跨越出了JVM的边界,与外界数据的源头或者目标数据源进行数据交换。               输出                   输入                    注意:输入/输出是针对JVM而言。 File类(java.io.*)可表示一个文件,也有可能是一个目录

Module 10:I/O流(java如何实现与外界数据的交流)

Input/Output:指跨越出了JVM的边界,与外界数据的源头或者目标数据源进行数据交换。

              输出

 

 


              输入                  

 注意:输入/输出是针对JVM而言。

File类(java.io.*)可表示一个文件,也有可能是一个目录(在JAVA中文件和目录都属于这个类中,而且区分不是非常的明显)。

Java.io下的方法是对磁盘上的文件进行磁盘操作,但是无法读取文件的内容。

注意:创建一个文件对象和创建一个文件在JAVA中是两个不同的概念。前者是在虚拟机中创建了一个文件,但却并没有将它真正地创建到OS的文件系统中,随着虚拟机的关闭,这个创建的对象也就消失了。而创建一个文件才是在系统中真正地建立一个文件。

例如:File f=new File(“11.txt”);//创建一个名为11.txt的文件对象

f.CreateNewFile();    //真正地创建文件

 

f.CreateMkdir():创建目录

f.delete();删除文件

f.deleteOnExit();在进程退出的时候删除文件,这样的操作通常用在临时文件的删除。

 

对于命令:File f2=new file(“d:\\abc\\789\\1.txt”)

这个命令不具备跨平台性,因为不同的OS的文件系统很不相同。

如果想要跨平台,在file类下有separtor(),返回锁出平台的文件分隔符。

File.fdir=newFile(File.separator);

Stringstr=”abc”+File.separator+”789”;

使用文件下的方法的时候一定注意是否具备跨平台性。

 

List():显示文件的名(相对路径)

ListFiles():返回Files类型数组,可以用getName()来访问到文件名。

使用isDirectory()和isFile()来判断究竟是文件还是目录。

 

练习:

写一个javaTest程序,列出所有目录下的*.java文件,把子目录下的JAVA文件也打印出来。

 

使用I/O流访问file中的内容。

JVM与外界通过数据通道进行数据交换。

分类:

按流分为输入流和输出流;

按传输单位分为字节流和字符流;

还可以分为节点流和过滤流。

节点流:负责数据源和程序之间建立连接;

过滤流:用于给节点增加功能。

过滤流的构造方式是以其他流位参数构造(这样的设计模式称为装饰模式)。

 

字节输入流:io包中的InputStream为所有字节输入流的父类。

Int read();读入一个字节(每次一个);

可先使用new  byte[]=数组,调用read(byte[] b)

read (byte[])返回值可以表示有效数;read(byte[])返回值为-1表示结束。

 

字节输出流:io包中的OutputStream位所有字节输入流的父类。

Write和输入流中的read相对应。

 

在流中close()方法由程序员控制。因为输入输出流已经超越了VM的边界,所以有时可能无法回收资源。

原则:凡是跨出虚拟机边界的资源都要求程序员自己关闭,不要指望垃圾回收。

以Stream结尾的类都是字节流。

如果构造FileOutputStream的同时磁盘会建立一个文件。如果创建的文件与磁盘上已有的文件名重名,就会发生覆盖。

用FileOutputStream中的boolean,则视,添加情况,将数据覆盖重名文件还是将输入内容放在文件的后面。(编写程序验证)

 

DataOutputStream:输入数据的类型。

因为每中数据类型的不同,所以可能会输出错误。

所有对于:DataOutputStream

         DataInputStream

          两者的输入顺序必须一致。

过滤流:

 bufferedOutputStream

 bufferedInputStream

用于给节点流增加一个缓冲的功能。
在VM的内部建立一个缓冲区,数据先写入缓冲区,等到缓冲区的数据满了之后再一次性写出,效率很高。

使用带缓冲区的输入输出流的速度会大幅提高,缓冲区越大,效率越高。(这是典型的牺牲空间换时间)

切记:使用带缓冲区的流,如果数据数据输入完毕,使用flush方法将缓冲区中的内容一次性写入到外部数据源。用close()也可以达到相同的效果,因为每次close都会使用flush。一定要注意关闭外部的过滤流。

 

(非重点)管道流:也是一种节点流,用于给两个线程交换数据。

PipedOutputStream

PipedInputStream

输出流:connect(输入流)

 

RondomAccessFile类允许随机访问文件

GetFilepoint()可以知道文件中的指针位置,使用seek()定位。

Mode(“r”:随机读;”w”:随机写;”rw”:随机读写)

练习:写一个类A,JAVAA file1 file2

file1要求是系统中已经存在的文件。File2是还没有存在的文件。

执行完这个命令,那么file2就是file1中的内容。

 

字符流:reader\write只能输纯文本文件。

FileReader类:字符文件的输出

 

字节流与字符流的区别:

字节流的字符编码:

字符编码把字符转换成数字存储到计算机中,按ASCii将字母映射为整数。

把数字从计算机转换成相应的字符的过程称为解码。

编码方式的分类:

ASCII(数字、英文):1个字符占一个字节(所有的编码集都兼容ASCII)

ISO8859-1(欧洲):1个字符占一个字节

GB-2312/GBK:1个字符占两个字节

Unicode: 1个字符占两个字节(网络传输速度慢)

UTF-8:变长字节,对于英文一个字节,对于汉字两个或三个字节。

 

原则:保证编解码方式的统一,才能不至于出现错误。

Io包的InputStreamread称为从字节流到字符流的桥转换类。这个类可以设定字符转换方式。

OutputStreamred:字符到字节

Bufferread有readline()使得字符输入更加方便。

在I/O流中,所有输入方法都是阻塞方法。

Bufferwrite给输出字符加缓冲,因为它的方法很少,所以使用父类printwrite,它可以使用字节流对象,而且方法很多。

 

练习:做一个记事本

swing/JfileChoose:getSelect file()

InputStreeamReader:把字节变为字符

JAVA中对字符串长无限制  bufferedReader(ir)

()

 

释放锁标记只有在Synchronized代码结束或者调用wait()。

注意锁标记是自己不会自动释放,必须有通知。

注意在程序中判定一个条件是否成立时要注意使用WHILE要比使用IF要严密。

WHILE会放置程序饶过判断条件而造成越界。

补充知识:

suspend()是将一个运行时状态进入阻塞状态(注意不释放锁标记)。恢复状态的时候用resume()。Stop()指释放全部。

这几个方法上都有Deprecated标志,说明这个方法不推荐使用。

 

一般来说,主方法main()结束的时候线程结束,可是也可能出现需要中断线程的情况。对于多线程一般每个线程都是一个循环,如果中断线程我们必须想办法使其退出。


如果主方法main()想结束阻塞中的线程(比如sleep或wait)

那么我们可以从其他进程对线程对象调用interrupt()。用于对阻塞(或锁池)会抛出例外InterruptedException。

这个例外会使线程中断并执行catch中代码。

 

多线程中的重点:实现多线程的两种方式,Synchronized,以及生产者和消费者问题(ProducerConsumer.java文件)。

 

练习:

①  存车位的停开车的次序输出问题;

②  写两个线程,一个线程打印1-52,另一个线程答应字母A-Z。打印顺序为12A34B56C……5152Z。通过使用线程之间的通信协调关系。

注:分别给两个对象构造一个对象o,数字每打印两个或字母每打印一个就执行o.wait()。在o.wait()之前不要忘了写o.notify()。

 

补充说明:通过Synchronized,可知Vector较ArrayList方法的区别就是Vector所有的方法都有Synchronized。所以Vector更为安全。

同样:Hashtable较HashMap也是如此。
目录
相关文章
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
143 2
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
158 1
|
11月前
|
存储 Java 开发者
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
本文详细介绍了 Java 中 `toString()` 方法的重写技巧及其重要
585 10
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
|
11月前
|
前端开发 JavaScript Java
Java构建工具-maven的复习笔记【适用于复习】
这篇文档由「潜意识Java」创作,主要介绍Maven的相关知识。内容涵盖Maven的基本概念、作用、项目导入步骤、依赖管理(包括依赖配置、代码示例、总结)、依赖传递、依赖范围以及依赖的生命周期等七个方面。作者擅长前端开发,秉持“得之坦然,失之淡然”的座右铭。期待您的点赞、关注和收藏,这将是作者持续创作的动力! [个人主页](https://blog.csdn.net/weixin_73355603?spm=1000.2115.3001.5343)
333 3
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
187 2
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)