Java IO操作

文件操作相关

列出某个目录中的所有文件

例子:

package com.ylfeiu.io;

import java.io.File;

public class ShowFileInfo {

	public static void main(String[] args) {

		File f = new File("d:" + File.separator + "txt");
		show(f);
	}

	private static void show(File f) {
		if (f.isDirectory()) {
			File[] res = f.listFiles();
			if (res != null) {
				for (int i = 0; i < res.length; i++) {
					show(res[i]);
				}

			}
		}
		System.err.println(f);

	}

}

创建带目录的文件

例子:

package com.ylfeiu.io;

import java.io.File;
import java.io.IOException;

public class CreateDirectorFile {

	public static void main(String[] args) {
		File f = new File("d:" + File.separator + "test" + File.separator
				+ "hello.txt");

		if (!f.getParentFile().exists()) {
			f.getParentFile().mkdirs();
		} else {
			try {
				f.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

字节流与字符流

输入输出流,分为字节流(InputStream,OutPutStream),字符流(Writer,Reader),它们4个都是抽象类,实例化靠其子类对象;传输中用字节流.字符流在操作时用到了缓冲区,若在使用字符流操作后,不关闭输出流操作,那么该缓冲区的内容不会被输出,这个时候得去调用flush()强制清空缓冲区的内容进行输出.字节流这不存在该情况

java.lang.Object

         |-java.io.InputStream

                   |-java.io.FileInputStream

java.lang.Object

         |-java.io.Reader

                   |-java.io.InputStreamReader

                            |-java.io.FileReader

通过以上继承关系可以看出,所有字符数据都是需要转换的,依靠转换流操作,真正保存或传输的数据是以字节流来完成的

转换操作流

字节流与字符流的转换采用:OutputStreamWriter,InputStreamReader

package com.ylfeiu.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class CreateDirectorFile {

	public static void main(String[] args) throws Exception {
		File f = new File("d:" + File.separator + "test" + File.separator
				+ "hello.txt");
		if (!f.getParentFile().exists()) {
			f.getParentFile().mkdirs();
		} else {
			f.createNewFile();
		}
		OutputStream out = new FileOutputStream(f);

		Writer w = new OutputStreamWriter(out);
		w.write("你好啊");
		w.flush();
	}

}

内存操作流

构造:输入流构造需要传参(操作对象),输出流构造函数中没有操作对象

public ByteArrayInputStream(byte buf[])

使用ByteArrayInputStream,ByteArrayOutputStream对内存进行输入输出操作

例子:

package com.ylfeiu.io;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class ByteArrayIO {

	public static void main(String[] args) throws Exception {

		String str = "hello";
		InputStream in = new ByteArrayInputStream(str.getBytes());
		OutputStream w = new ByteArrayOutputStream();

		int tmp = 0;
		while ((tmp = in.read()) != -1) {
			w.write((char)Character.toUpperCase(tmp));
		}
		
		w.close();
		in.close();

		String newStr = w.toString();
		System.err.println(newStr);
	}

}

字节打印流与字符打印流

PrintStream,PrintWriter

构造public PrintStream (OutputStream out)

这里虽然传参的是OutputStream型的对象,但是打印流使用的是打印流的方法,并不是使用OutputStream的子类的实际对象的方法

System类的err,out,in这三个常量都是PrintStream的实例(该3个常量在JDK早期出现,所以并不是大写的)

System.out本身就属于PrintStream的对象,而它又是OutputStream的子类,所以有了下面的代码:

package com.ylfeiu.io;

import java.io.OutputStream;

public class SysIn {

	public static void main(String[] args) throws Exception {
		OutputStream out = System.out;
		String info = "你好啊  world";
		out.write(info.getBytes());
	}

}
打印流例子
package com.ylfeiu.io;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;

public class PrintIO {

	public static void main(String[] args) throws Exception {
		String str = "hello world!";

		InputStream in = new ByteArrayInputStream(str.getBytes());
		OutputStream out = new ByteArrayOutputStream();
		PrintStream echo = new PrintStream(out);
		int tmp = 0;
		while ((tmp = in.read()) != -1) {
			echo.print((char)Character.toUpperCase(tmp));
		}

		String newStr = out.toString();
		out.close();
		in.close();
		System.err.println(newStr);
	}

}
中文乱码的产生
package com.ylfeiu.io;

import java.io.InputStream;

/**
 * 
 * @author Administrator 本程序演示中文乱码的产生
 */
public class MessyCode {

	public static void main(String[] args) throws Exception {
		InputStream in = System.in;
		StringBuffer buf = new StringBuffer();
		System.out.println("请输入数据");
		int tmp = 0;
		while ((tmp = in.read()) != -1) {
			if (tmp == '
') {
				break;
			}
			buf.append((char) tmp);
		}

		System.err.println("输入的内容是:" + buf);

	}

}
BufferedReader缓冲区操作
从缓冲区读取数据

解决中文输入产生的乱码
package com.ylfeiu.io;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BufRead {

	public static void main(String[] args) throws Exception {
		BufferedReader buf = new BufferedReader(
				new InputStreamReader(System.in));
		System.out.println("请输入数据");
		String info = buf.readLine();
		System.err.println("输入地 数据是:" + info);

	}
Scanner(放在java.utils包中)
Jdk1.5之后推出的,方便进行输入操作,在程序开发过程中,如果通过程序输出,则采用PrintStream打印流,若存在中文,推荐使用PrintWriter,而对于程序输入数据,建议使用Scanner
例子
package com.ylfeiu.io;

import java.util.Scanner;

public class ScannerInput {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.err.println("请输入数据");
		if (in.hasNext()) {
			String info = in.next();
			System.err.println("输入的数据是:" + info);
		}

	}

}

对象输入/出流

采用ObjectInputStream,ObjectOutputStream进行对象的输入与输出,这两个类与打印流的设计相似,都是需要接收父类的实例化对象

例子

对象序列化

对象序列化可以将内存中的对象转换成2进制数据(必须实现Serializable接口),如果不想某个对象的属性被序列化,则采用transient关键字

例子

把对象信息写入到文件中:

package com.ylfeiu.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class ObjInputIO {

	public static void main(String[] args) throws Exception {
		Person p = new Person(20, "ylfeiu");
		File f = new File("d:" + File.separator + "p.ser");

		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
		out.writeObject(p);
		out.close();

	}

}

class Person implements Serializable {
	transient int age;
	String name;

	Person(int age, String name) {
		this.age = age;
		this.name = name;
	}

}
从二进制文件中读取数据
package com.ylfeiu.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class ObjReadIO {

	public static void main(String[] args) throws Exception {
		File f = new File("d:" + File.separator + "p.ser");

		ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
		Person p = (Person) in.readObject();
		in.close();

		System.err.println(p.name);// 若给age字段添加private属性,则编译不通过
		System.err.println(p.age);
	}

}

字符编码

GBK/GB2312:表示国际中文编码,其中GBK包含简体与繁体中文,而GB2312只包含简体中文ISO 8859-1:一种国际通用编码,可以表示任何文字?查一下

Unicode:一种16进制编码,可以便是任何语言文字?

UTF-8:部分编码使用了Unicode,而另一些则采用了ISO-8859-1,它适合网络传输,在项目开发过程中推荐采用此编码?(为什么)

产生乱码的原因:编码与解码不统一

  

  

  

  

  

  

  

  

  

 

原文地址:https://www.cnblogs.com/ylfeiu/p/3597315.html