您的位置:首页 > 编程语言 > Java开发

【Java-IO】IO入门

2016-02-16 17:42 387 查看
根据处理的对象分为:字节流和字符流

字节流可以处理所有的数据:通常以“Stream”结尾,读取一个字节,返回一个字节。

字符流则只能处理纯文本数据:通常以“Reader”或者“Writer”结尾,需要通过查找编码表,才能返回字符

一、字节流读写文件

try {
FileInputStream fis = new FileInputStream("files/test.txt");
FileOutputStream fos = new FileOutputStream("files/new.txt");

byte[]bytes = new byte[1024];
while(fis.read(bytes)!=-1){
fos.write(bytes);
}

System.out.println("copy done");
fos.close();
fis.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

注意点:
1. 记得读写完成,要close();
2. FileInputStream.read(byte[])返回的是读取byte到缓存的长度,如果没有了,返回-1
3. 如果读取byte[]后想转成String,最好设置编码

try {
FileInputStream fis = new FileInputStream("files/test.txt");

byte[] input = new byte[1024];
fis.read(input);

String inputString = new String(input,"UTF-8");
System.out.println(inputString);

fis.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}

写数据也一样
try{
FileOutputStream fos = new FileOutputStream("files/test.txt");

String s = "这是我写入txt的内容";
byte[] bytes = s.getBytes("UTF-8");

fos.write(bytes);

System.out.println("写入完成");
fos.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


二、字符流读写文件

try {
FileInputStream fis = new FileInputStream("files/test.txt");
FileOutputStream fos = new FileOutputStream("files/new.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

char[] temp = new char[50];
int len = 0;
while((len = isr.read(temp))!=-1){
osw.write(temp, 0, len);
//				osw.write(temp);
//				System.out.print(temp);
}

System.out.println("copy done");

osw.close();
fos.close();
isr.close();
fis.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

注意点:
1. 获取read数据的时候,得注意长度,因为最后一次读取的时候,往往不能填满char[]
2. 输入和输出流的编码得一致

三、带有缓冲区的字符流读写

try {
FileInputStream fis = new FileInputStream("files/test.txt");
FileOutputStream fos = new FileOutputStream("files/new.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedReader br = new BufferedReader(isr);
//			BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(osw,true);

String line = null;
while((line = br.readLine())!=null){
//				bw.write(line+"\n");
pw.println(line);
}

//	bw.flush();
//	pw.flush();
pw.close();
//	bw.close();
osw.close();fos.close();
br.close();isr.close();fis.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


注意点:
1. 使用BufferedReader readline时,读出的字符串是不带\n的
2. 在关闭输出流之前要用flush()强制把缓冲区的内容写出
3. 可以使用PrintWriter的println方法写,这个自带\n,其次PrintWriter在new的时候,可以设置autoflush为true,就不用
在关闭之前flush

四、FileReader和FileWriter

如果只针对简单的纯文本文件进行读写操作,可以使用FileReader和FileWriter来代替FileInputStream以及OutputStream转InpttStreamReader/OutputStreamWriter

try {
FileInputStream fis = new FileInputStream("files/test.txt");
FileOutputStream fos = new FileOutputStream("files/new.txt");

byte[]bytes = new byte[1024];
while(fis.read(bytes)!=-1){
fos.write(bytes);
}

System.out.println("copy done");
fos.close();
fis.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

注意点:
1. 记得flush,记得\n
2. FileReader/Writer 使用的是系统默认的字符集编码,所以可能存在编码的问题。如果出问题了,请使用FileInputStream -> InputStreamReader,并构造时规定编码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: