【Java-IO】IO入门

来源:互联网 发布:天猫直通车优化 编辑:程序博客网 时间:2024/04/20 08:25

根据处理的对象分为:字节流和字符流


字节流可以处理所有的数据:通常以“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,并构造时规定编码












0 0
原创粉丝点击