讲讲IO里面的常见类,字节流,字符流、接口、实现类、方法阻塞
输入流就是从控制台、外部文件输入到内存,输出流主要是从内存输出到控制台、文件。我们在控制台输入数据就属于输入流,即从控制台输入到内存。在控制台打印则属于输出流。
字节流和字符流的主要区别是什么呢?
一. 字节流在操作时不会用到缓冲区(内存),是直接对文件本身进行操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
二. 在硬盘上的所有文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会形成。
- 字节流
字节流主要是操作byte类型数据,也byte数组为准,主要操作类就是
·字节输出流:OutputStream(抽象类)
·字节输入流:InputStream(抽象类)
均实现接口 Closeable
常见子类:FileInputStream、FileOutputStream
- 字符流
在程序中一个字符等于2个字节,那么java提供了Reader、Writer两个专门操作字符流的类
·字符输出流:Writer(抽象类)
·字符输入流:Reader(抽象类)
均实现接口 Appendable, Closeable, Flushable
常见子类:BufferedReader、BufferedWriter
- 字节-字符转换流
OutputStreamWriter和InputStreamReader
• OutputStreamWriter(实现类):是Writer的子类,将输出的字符流转换为字节流。即:将一个字节流的输出对象变为字节流的输出对象
• InputStreamReader(实现类):是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象
- 方法阻塞
java中的阻塞式方法是指在程序调用改方法时,必须等待输入数据可用或者检测到输入结束或者抛出异常,否则程序会一直停留在该语句上,不会执行下面的语句。比如read()和readLine()(BufferedReader中有该方法)方法。
String编码UTF-8和GBK的区别
UTF-8是国际通用的编码,通用性比较好,GBK是国家编码,支持中文,但是相比UTF-8的通用性差,不过UTF-8占用的数据库比较大,所以相对反应速度要慢
什么时候使用字节流,什么时候 使用字符流
字节流和字符流的主要区别是什么呢?
一. 字节流在操作时不会用到缓冲区(内存),是直接对文件本身进行操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
二. 在硬盘上的所有文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会形成。
所有的输入都是转换成字节流之后,然后在内存中变成字符流。所以一般建议使用字符流。但是遇到中文汉字,出现乱码的情况下,可以使用字节流。 在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。我们建议尽量尝试使用字符流,一旦程序无法成功编译,就不得不使用面向字节的类库,即字节流。
如果要操作的是文本文件时用字符流,否则的话用字节流。
BufferedInputStream 操作的字节流的输入流
BufferedReader 操作的是字符流的输入流
Java NIO和IO的主要区别
阻塞型IO和非阻塞型IO
Java IO的各种流是阻塞型的。这意味着,当一个线程调用read()方法或write()方法时这个线程将一直被阻塞,直到有数据被读到或者数据被完全写入;在被阻塞的同时,该线程不能做任何其他事情。
Java NIO的非阻塞模式允许一个线程从一个channel中请求读取数据,这只会取到当前有效的数据或当前没有数据有效时获取不到任何数据;而不是一直阻塞直到所读取数据准备好为止;在这同时该线程可以做其他事情。
这个过程对非阻塞式数据写入也是成立的。一个线程可以写入一些数据到channel,但是不用等待数据被完全写入。该线程在请求完成后可以继续同时去做其他事情。
当线程不在IO调用上被阻塞时,那么它们的空闲时间通常都花在了在其他channel上执行IO操作。也就是说,一个线程可以管理多个输入和输出的channel。
递归读取文件夹下的文件,代码怎么实现
import java.io.File;
/**
* Created by yzk on 2018/3/14.
*/
public class FileTest {
public static void visitFile(String path) {
if (path == null) return;
File[] files = new File(path).listFiles();
if (files == null) return;
for (File f : files) {
if (f.isFile()) {
System.out.println(f.getName());
} else if (f.isDirectory()) {
System.out.println("-----" + f.getName());
visitFile(f.getPath());
} else {
System.out.println("Error");
}
}
}
public static void main(String[] args) {
visitFile("E:\\Workspace\\IDEA\\Job");
}
}