javaIO一些知识

1.File 文件和目录路径名的抽象表示形式。 包含了磁盘文件本身的信息,而不是文件中的内容
www.codeceo.com/article/java-file-class.html  File类使用详解

2.DataOutput 接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流。
DataInput 接口用于从二进制流中读取字节,并根据所有 Java 基本类型数据进行重构。

3.File[] liseRoots()//获取机器盘符
String[] list()//返回指定目录中的文件和目录
String[] list(FilenameFilter filter)//返回指定目录中的文件和目录(过滤后的
createNewFile()//创建文件
mkdir()//创建目录(一级目录)
mkdirs()//创建目录(可以创建多级目录,无论是否存在父目录)

4.RandomAccessFile 是用来访问那些保存数据记录的文件的,这样你就可以用seek( )方法来访问记录,并进行读写了。
RandomAccessFile是不属于InputStream和OutputStream类系的。
随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;

应用场景:(1)第一次下载到某处,下次下载的时候可以接着下载,不必重新开始下砸
(2)多线程下载图片,第一个线程下载1-2k内容,第二个线程下载2-3k的内容。。最后将多个线程下载的内容合并。 

5.RandomAccessFile 仅限于操作文件,不能访问其它的IO设备,如网络、内存映象

6.流是可以读出或写入字节序列的对象。文件可能是流的来源地或目的地。
文件是数据静态存储的形式,而流是指数据传输时的形态。

7.InputStream,OutputStream是所有字节流的父类。IO设备是外部设备。

8.输出流中flush()可以强制刷新内存缓冲区,并把数据发送到目的地。close( )冲刷并关闭输出流。

9.read和write方法在执行时都将阻塞,直至字节确实被读入或写出。阻塞意味着当前线程将失去它对资源的占用。

10. java中有垃圾回收GC, 为什么还要调用close ?
流不单在内存中分配了空间,也在操作系统占有了资源,java的gc是能从内存中回收不使用的对象,但对操作系统分配的资源是无能为力的,所以就要调用close()方法来通知OS来释放这个资源。 

11.     应用程序 《== 》 内存缓冲区 《 == 》外部设备(内存缓冲区提升了整体的cpu利用率,但对单个应用程序来说是降低效率的,所以有些类使用,有些没用)
因为如果应用程序与外部程序直接传输数据,会很慢,所以在内存出,开辟出内存缓冲区,当内存缓冲区满了或强制刷新后,再把数据发送到外部设备。
java缓冲区 www.cnblogs.com/jacktu/archive/2010/02/08/1665883.html
java.nio(java new IO),是jdk1.4 里提供的新api ,为所有的原始类型提供缓存支持。

12. 关于java字节流的read()方法返回值为int的思考(便于与-1比较)
blog.sina.com.cn/s/blog_9e351f9b01015kgp.html

13.二进制文件与文本文件有哪些差异
www.nowamagic.net/librarys/veda/detail/658
计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。
文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件

14.在使用FileReader 对象进行文件输入操作的时,JVM先读取本地文本文件,然后将其格式转化为Unicode编码格式进行操作。再用FileWriter进行文本文件输出时则把Unicode编码格式再转换成本地(本地主机上)的编码格式(如ASCII或者GBK等)。
FileReader与FileWriter两个类和FileInputStream和FileOutputStream两个类的操作方法基本相同,只不过前者基于字符,后者基于字节(byte),若操作的文件不是文本文件,则建议使用FileInputStream和FileOutputStream进行文件的输入输出。

15.管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。
不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。在Java中,可以使用管道流进行线程之间的通信
www.tuicool.com/articles/qAbi2i
www.cnblogs.com/gnuhpc/archive/2013/01/04/2844084.html

16.使用管道流类,可以实现各个程序模块之间的松耦合通信。

17.ByteArrayOutputStream是用来缓存数据的(数据写入的目标(output stream原义)),向它的内部缓冲区写入数据,缓冲区自动增长,当写入完成时可以从中提取数据。由于这个原因,ByteArrayOutputStream常用于存储数据以用于一次写入。可使用 toByteArray() 和 toString() 获取数据。

ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。
关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException
blog.csdn.net/rcoder/article/details/6118313

18.字符编码:
计算机中只有0,1的二进制数字,而字符等表示是逻辑上表示的。
ASCII的范围是0~256,GBK包括繁体字等,GB2312是GBK的子集。
Unicode全球通用,统一编码。UTF-8:保持ASCII原样,仍然只占一个字节,

19.通过System.getPropertity()可获取JVM环境的系统属性。通过System.setPropertity()可设置系统属性

20.new String(str.getBytes("utf-8"),"gbk");可通过这样的形式重新编码解决乱码问题,不过要具体分析,需要怎样的转换。

21.字符编码(英语:Character encoding)也称字集码,是把字符集中的字符, 编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递

22.在显示器上看见的文字、图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片。假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1,凹的地方代表数字0。硬盘只能用0和1来表示所有文字、图片等信息

23.字符编码详解 polaris.blog.51cto.com/1146394/377468/
www.regexlab.com/zh/encoding.htm

24.各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。因此,平常我们所说的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。
字符编码就是以二进制的数字来对应字符集的字符。
“编码”的概念就是把“字符”转化成“字节”就可以了

25.内码是指整机系统中使用的二进制字符编码,是沟通输入、输出与系统平台之间的交换码,通过内码可以达到通用和高效率传输文本的目的。

26.本地字符编码与Unicode编码共存(需要转换)

27.包装流类没有指向具体的输入、输出流类,而是由底层流实现。
因为只使用底层流,对不同的数据转换比较麻烦,所以使用封装流。

28.DataInput 接口用于从二进制流中读取字节,并根据所有 Java 基本类型数据进行重构。
如:readInt()读取四个输入字节并返回一个 int 值。readDouble()读取八个输入字节并返回一个 double 值。
DataOutput 接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流。

29.BufferedInputStream,BufferedOutputStream增加了内存缓冲区,创建时可指定缓冲区大小。
包装类的缓冲区与底层流类的缓冲区不一样。包装类需要先写到底层流,然后再写到目标设备,而底层缓冲区可直接写到目标设备。

30.BufferedInputStream的实现原理: blog.sina.com.cn/s/blog_67f995260101huxz.html
BufferedInputStream内部有一个缓冲区,默认大小为8M,每次调用read方法的时候,它首先尝试从缓冲区里读取数据,若读取失败(缓冲区无可读数据),则选择从物理数据源(譬如文件)读取新数据,最后再将缓冲区中的内容部分或全部返回给用户.由于从缓冲区里读取数据远比直接从物理数据源(譬如文件)读取速度快,所以BufferedInputStream的效率很高! 
blog.sina.com.cn/s/blog_735065f90100pv3g.html

31.java是Unicode编码,本地编码与Unicode编码共存,需要转换。

32.DateOutputStream中有writeBytes(),writeChars() ,但DateInputStream没有readBytes(),readChars(),是因为没有字符的长度,没有结束标志,读取时不知何时结束。

33.java流栈:多个流对象形成流栈。(java设计模式—Decorator模式 www.cnblogs.com/forlina/archive/2011/06/23/2088213.html)
关闭流栈中最上层流对象,底层流对象就会被删除。

34.PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream;这意味着可在写入 byte 数组之后自动调用 flush 方法,可调用其中一个 println 方法,或写入一个换行符或字节 ('\n')。 

PrintWriter遇到'\n',不会自动清空缓冲区。
与PrintStream的区别:作为处理流使用时,PrintStream只能封装OutputStream类型的字节流,而PrintWriter既可以封装OutputStream类型的字节流,还能够封装Writer类型的字符输出流并增强其功能。
blog.csdn.net/caixiexin/article/details/6719627

35.ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。 (还用于网络传输对象)
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。
ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会
被读取和写入

36.InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

37.ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获得相关信息

38.编码、解码
编码:将字符转换为字符序列
解码:将字符序列转换为字符
blog.csdn.net/sunxing007/article/details/4516361

39.使用BufferedWriter缓冲输出流时,记得加上换行符结束标志,newLine()

40.使用输出流中,若没有读取到数据,使用flush()刷新。



你可能感兴趣的:(Java)