`
747017186
  • 浏览: 317482 次
社区版块
存档分类
最新评论

java之IO(2)

 
阅读更多

前面讲解了IO的原理以及使用,下面针对于中文读取于拷贝问题看几个例子,掌握下面的东西java所有 IO基本上也就那些东西了,话不多说看例子:

package io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;

public class IOTest {
	public static void main(String[] args) throws Exception{
		final File file = new File("F:\\1.txt");
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					String str = readChar(file);
					System.out.println(Thread.currentThread().getName()+"--->"+str);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					String str = readString(file);
					System.out.println(Thread.currentThread().getName()+"--->"+str);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println(Thread.currentThread().getName()+"已执行!");
					read_write_string(file);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}).start();
	}
	
	/**
	 * 字节的形式读取
	 * 需指定大小
	 * @param file
	 * @return
	 * @throws Exception
	 */
	private static String readChar(File file) throws Exception{
		InputStream in = new FileInputStream(file);
		byte[] b=new byte[(int) file.length()];//如果知道file可以指定file的大小作为数组的大小
//		byte[] b=new byte[in.available()];//如果不知道file,可以指定流的大小
		BufferedInputStream bufferIn = new BufferedInputStream(in,10);//创建缓冲输入流,缓冲区大小为10
		bufferIn.read(b);//直接把二进制流读入流
		bufferIn.close();
        in.close();
        return new String(b);
//      return new String(b,"GBK");//指定编码中文才能转换
	}
	
	/**
	 * 字符的形式读取
	 * 需指定大小
	 * @param file
	 * @return
	 * @throws Exception
	 */
	private static String readString(File file) throws Exception{
		InputStream in = new FileInputStream(file);//获得文件字节流
		Reader reader = new InputStreamReader(in, "GBK");//字节流转换为字符流并指定编码中文
		BufferedReader bufferedReader = new BufferedReader(reader,10); //运用字符缓冲流进行包装,缓冲区大小为10
		char[] c=new char[(int) file.length()];
//		char[] c=new char[(in.available()];//通过文件来判断的大小
		bufferedReader.read(c);//通过输入流来判断大小
		bufferedReader.close();
		reader.close();
		in.close();
        return new String(c);
	}
	
	/**
	 * 行的形式读取 
	 * 无需指定大小
	 * @param file
	 * @return
	 * @throws Exception
	 */
	private static String readLine(File file) throws Exception{
		InputStream in = new FileInputStream(file);//获得文件字节流
		Reader reader = new InputStreamReader(in, "GBK");//字节流转换为字符流并指定编码中文
//		InputStreamReader reader = new InputStreamReader(in, "GBK");
//		System.out.println("encoding:"+reader.getEncoding());//得到流的编码
		BufferedReader bufferedReader = new BufferedReader(reader,10); //运用字符缓冲流进行包装,缓冲区大小为10		String temp = "";
		String temp ="";//临时保存读取到的数据
		String str= "";//累加临时数据
		while((temp=bufferedReader.readLine())!=null) {
			str = str +temp;
        }
		bufferedReader.close();
		reader.close();
		in.close();
		return str;
	}
	
	/**
	 * 字节边读边写
	 * @param file
	 * @return
	 * @throws Exception
	 */
	private static void read_write_char(File file) throws Exception{
		InputStream in = new FileInputStream(file);
		BufferedInputStream bufIn = new BufferedInputStream(in,10);//字节缓冲输入流
		OutputStream out = new FileOutputStream("F:\\2.txt");
		BufferedOutputStream buffOut = new BufferedOutputStream(out, 10);//字节缓冲输出流
		
		byte[] b = new byte[2];//每次取出2字节进行写入
		while((bufIn.read(b)!=-1) {
			buffOut.write(b);//每次2字节循环写入
		}
		buffOut.close();
		out.close();
		bufIn.close();
                in.close();
	}
	
	/**
	 * 字符边读边写(不推荐用,文件有中文必须字节转字符流指定编码,否则出现乱码)
	 * @param file
	 * @throws Exception
	 */
	private static void read_write_string(File file) throws Exception{
		Reader reader = new FileReader(file);
		BufferedReader bufReader = new BufferedReader(reader,10);//字符缓冲输入流
		Writer writer = new FileWriter("F:\\2.txt");
		BufferedWriter buffWriter = new BufferedWriter(writer, 10);//字符缓冲输出流
		
		char[] c = new char[2];//每次取出2字符进行写入
		while(bufReader.read(c)!=-1) {
			buffWriter.write(c);//每次2字节循环写入
		}
		buffWriter.flush();
		writer.flush();
		buffWriter.close();
		writer.close();
		bufReader.close();
		reader.close();
	}
}

 注意:

  • public abstract int read() throws IOException
    从输入流读取数据的下一个字节。 值字节被返回作为int范围0255 。 如果没有字节可用,因为已经到达流的末尾,则返回值-1 。 该方法阻塞直到输入数据可用,检测到流的结尾,或抛出异常。

    一个子类必须提供这个方法的一个实现。

    结果
    数据的下一个字节,如果达到流的末尾, -1
    • public int read(byte[] b) throws IOException
      从输入流读取一些字节数,并将它们存储到缓冲区b 。 实际读取的字节数作为整数返回。 该方法阻塞直到输入数据可用,检测到文件结束或抛出异常。

      如果b的长度为零,则不会读取字节并返回0 ; 否则,尝试读取至少一个字节。 如果没有字节可用,因为流在文件末尾,则返回值-1 ; 否则,读取至少一个字节并存储到b

      第一个字节读取存储在元素b[0] ,下一个字节存入b[1]等等。 读取的字节数最多等于b的长度。 令k为实际读取的字节数; 这些字节将存储在元素b[0]b[ k -1] ,使元素b[ k ]b[b.length-1]不受影响。

       

      参数
      b - 读取数据的缓冲区。
      结果
      读取到缓冲区的总字节数,或者如果没有更多的数据,因为已经到达流的末尾,则是 -1
      read():方法返回的是下一个字节的强转的整形数
      read(byte[]):方法返回的是已经读取的多少字节总数 
  • 大小: 14.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics