Java IO总结
Posted yuwenS.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java IO总结相关的知识,希望对你有一定的参考价值。
文章目录
1、Java IO
Java中的IO流大概可以分为以下几类:
- 磁盘操作:FIie
- 字节操作:InputStream 和 OutputStream 针对二进制文件
- 字符操作:Reader 和 Writer 针对文本文件
- 对象操作:Serializable
- 网络操作:Socket
- 新的输入和输出:NIO
1.1、磁盘操作
File可以用于表示文件和目录的信息,但是它不包括文件的内容
递归的列出文件夹中的所有文件
public static void getFileName(File file){
if (file==null || !file.exists()){
System.out.println("没有文件");
return;
}
if (file.isFile()){
System.out.println(file.getName());
return;
}
for (File f :file.listFiles()) {
getFileName(f);
}
}
从Java7开始,可以使用Paths和Files代替File
1.2、字节操作
实现文件复制
public static void copy(String src, String dist) throws IOException {
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dist);
byte[] buffer = new byte[1024];
int b;
// read() 最多读取 buffer.length 个字节
// 返回的是实际读取的个数
// 返回 -1 的时候表示读到 eof,即⽂件尾
while ((b = fis.read(buffer,0,buffer.length)) != -1){
fos.write(buffer,0,buffer.length);
}
fis.close();
fos.close();
}
使用一个具有缓存功能的字节流对象时。只需要在FileInputStream对象上再套一层BufferedInputStream对象即可
FileInputStream fis = new FileInputStream(src);
BufferedInputStream bis = new BufferedInputStream(fis);
1.3、字符操作
1.3.1、编码与解码
编码就是把字符转化为字节,而解码就是把字节重新转化为字符
如果编码和解码过程中使用了不同的编码方式就会出现乱码
-
GBK 编码中,中⽂字符占 2 个字节,英⽂字符占 1 个字节
-
UTF-8 编码中,中⽂字符占 3 个字节,英⽂字符占 1 个字节
-
UTF-16be 编码中,中⽂字符和英⽂字符都占 2 个字节
Java 的内存编码使⽤双字节编码 UTF-16be,这不是指 Java 只⽀持这⼀种编码⽅式,⽽是说 char 这种 类型使⽤ UTF-16be 进⾏编码。char 类型占 16 位,也就是两个字节,Java 使⽤这种双字节编码是为了 让⼀个中⽂或者⼀个英⽂都能使⽤⼀个 char 来存储
1.3.2、String的编码方式
String 可以看成⼀个字符序列,可以指定⼀个编码⽅式将它编码为字节序列,也可以指定⼀个编码⽅式 将⼀个字节序列解码为 String
String str = "Hello";
byte[] byte = str.getBytes("UTF-8");
String str1 = new String(bytes,"UTF-8");
System.out.println(str1);
在调⽤⽆参数 getBytes() ⽅法时,默认的编码⽅式不是 UTF-16be。双字节编码的好处是可以使⽤⼀个 char 存储中⽂和英⽂,⽽将 String 转为 bytes[] 字节数组就不再需要这个好处,因此也就不再需要双字 节编码。getBytes() 的默认编码⽅式与平台有关,⼀般为 UTF-8
String str = "Hello";
byte[] byte = str.getBytes();
1.3.3、Reader和Writer
不管是磁盘还是⽹络传输,最⼩的存储单元都是字节,⽽不是字符。但是在程序中操作的通常是字符形式的数据,因此需要提供对字符进⾏操作的⽅法
- InputStreamReader 将字符解码为字节流
- OutputStreamWriter 将字节流编码为字符流
实现逐行输出文本内容
public static void readFile(String fileName) throws IOException {
FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine()) != null){
System.out.println(line);
}
br.close();
}
1.4、对象操作
1.4.1、序列化
序列化就是将对象转化成字节序列,方便存储和传输
- 序列化:ObjectOutputStream.writeObject()
- 反序列化:ObjectInputStream.readObject()
不会对静态变量进行序列化,因为序列化只是保存对象的状态,静态变量属于类的变量
1.4.2、Serializable
序列化的类需要实现 Serializable 接⼝,它只是⼀个标准,没有任何⽅法需要实现,但是如果不去实现它的话⽽进⾏序列化,会抛出异常
1.4.3、transient
transient 关键字可以使⼀些属性不会被序列化
以上是关于Java IO总结的主要内容,如果未能解决你的问题,请参考以下文章