Java IO流


java IO流

数据是怎么存储到磁盘当中的?
内存起到了什么作用?

内存和内存之间,内存和网络的其它内存,内存和硬盘文件,内存和数据库文件之间的数据是通过流进行传递的。

以数据的流向分类,能够读取字节的序列的API对象成为输入流

(InputStream),能够写入字节序列的成为输出流(OutputStream)。字节是计算机数据的存储的形式,任何数据都可以使用字节流进行读写。



读取来源和写入目标可以是文件,内存,网络,数据库和文件。

InputStream和OutputStream两个抽象类构成了读写IO体系的框架基础。



字节流虽然可以操作任何的数据形式,但是对于占用多个字节的字符却不是很方便。  
需要知道,所以在JAVA中有专门提供了对于字符流的两个抽象类Reader和Writer

分类:

IO流按照操作对象:字节流和字符流

按照流的方向分:输入流和输出流

这些流就像流动的血液,在内存和数据存储媒介间来回的流动

获取项目路径

String path=FileReader.class.getResource("/").getFile();

//获取当前项目运行时所在根目录

System.out.println(path);

FileInputStream

InputStream f = new FileInputStream("C:/java/hello");

File f = new File("C:/java/hello");
InputStream out = new FileInputStream(f);

基本用法

	import java.io.*;
 
public class fileStreamTest {
    public static void main(String args[]) {
        try {
            byte bWrite[] = { 11, 21, 3, 40, 5 };
            OutputStream os = new FileOutputStream("test.txt");
            for (int x = 0; x < bWrite.length; x++) {
                os.write(bWrite[x]); // writes the bytes
            }
            os.close();
 
            InputStream is = new FileInputStream("test.txt");
            int size = is.available();
 
            for (int i = 0; i < size; i++) {
                System.out.print((char) is.read() + "  ");
            }
            is.close();
        } catch (IOException e) {
            System.out.print("Exception");
        }
    }
}

FileOutputStream

OutputStream f = new FileOutputStream("C:/java/hello");

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

基本用法

import java.io.*;
 
public class fileStreamTest2 {
    public static void main(String[] args) throws IOException {
 
        File f = new File("a.txt");
        FileOutputStream fop = new FileOutputStream(f);
        // 构建FileOutputStream对象,文件不存在会自动新建
 
        OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
        // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk
 
        writer.append("中文输入");
        // 写入到缓冲区
 
        writer.append("\r\n");
        // 换行
 
        writer.append("English");
        // 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入
 
        writer.close();
        // 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
 
        fop.close();
        // 关闭输出流,释放系统资源
 
        FileInputStream fip = new FileInputStream(f);
        // 构建FileInputStream对象
 
        InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
        // 构建InputStreamReader对象,编码与写入相同
 
        StringBuffer sb = new StringBuffer();
        while (reader.ready()) {
            sb.append((char) reader.read());
            // 转成char加到StringBuffer对象中
        }
        System.out.println(sb.toString());
        reader.close();
        // 关闭读取流
 
        fip.close();
        // 关闭输入流,释放系统资源
 
    }
}

File类

File可以让我们创建一个文件夹,这个对象便利了我们对文件的操作。

创建文件夹及路径

public static void main(String[] args) {
	String path ="F:\\testcode\\Index"; //所创建文件目录
	File f = new File(path); 
	if(!f.exists()){
		f.mkdirs(); //创建目录
	}
	String fileName = "abc.txt"; //文件名及类型
	File file = new File(path,fileName);
	if(!file.exists()){ //surround with try/catch
		try { 
			file.createNewFile();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
}

文件写入

	方式一
	String str="hello world!";
        FileWriter writer;
        try {
            writer = new FileWriter("E:/token.txt");
            write.write("");//清空原文件内容
            writer.write(str);
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


	方式二
	File txt=new File("E:/log1.txt");
         if(!txt.exists()){  
             txt.createNewFile();  
        }  
         byte bytes[]=new byte[512];   
         bytes=str.getBytes();  
         int b=bytes.length;   //是字节的长度,不是字符串的长度
         FileOutputStream fos=new FileOutputStream(txt); 
         fos.write(bytes,0,b); 
         fos.write(bytes);
         fos.close;
		

	方式三

	FileOutputStream fos = new FileOutputStream("E:/log.txt",true);
	//true表示在文件末尾追加  
	fos.write(log.getBytes());  
	fos.close();

路径创建与写入联合使用

	String result=extractText(doc);
    FileWriter fileWriter=null;
    File file =new File("D:\\work");
    if (!file.exists()){
        file.mkdirs();//创建
    }
    file=new File(file+"\\"+"txt"+".txt");
    try {
        fileWriter = new FileWriter(file, true);
        fileWriter.write(result+"\n");
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            fileWriter.flush();
            fileWriter.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

FileReader

FileReader类从InputStreamReader类继承而来。该类按字符读取流中数据。可以通过以下几种构造方法创建需要的对象。

在给定从中读取数据的 File 的情况下创建一个新 FileReader。

FileReader(File file)
在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。

FileReader(FileDescriptor fd)
在给定从中读取数据的文件名的情况下创建一个新 FileReader。

FileReader(String fileName)

import java.io.*;

public class FileRead {
    public static void main(String args[]) throws IOException {
        File file = new File("Hello1.txt");
        // 创建文件
        file.createNewFile();
        // creates a FileWriter Object
        FileWriter writer = new FileWriter(file);
        // 向文件写入内容
        writer.write("This\n is\n an\n example\n");
        writer.flush();
        writer.close();
        // 创建 FileReader 对象
        FileReader fr = new FileReader(file);
        char[] a = new char[50];
        fr.read(a); // 读取数组中的内容
        for (char c : a)
            System.out.print(c); // 一个一个打印字符
        fr.close();
    }
}

FileWriter

FileWriter 类从 OutputStreamWriter 类继承而来。该类按字符向流中写入数据。可以通过以下几种构造方法创建需要的对象。

在给出 File 对象的情况下构造一个 FileWriter 对象。

FileWriter(File file)
在给出 File 对象的情况下构造一个 FileWriter 对象。

FileWriter(File file, boolean append)
file:要写入数据的 File 对象。

append:如果 append 参数为 true,则将字节写入文件末尾处,相当于追加信息。如果 append 参数为 false, 则写入文件开始处。

import java.io.*;
 
public class FileRead {
    public static void main(String args[]) throws IOException {
        File file = new File("Hello1.txt");
        // 创建文件
        file.createNewFile();
        // creates a FileWriter Object
        FileWriter writer = new FileWriter(file);
        // 向文件写入内容
        writer.write("This\n is\n an\n example\n");
        writer.flush();
        writer.close();
        // 创建 FileReader 对象
        FileReader fr = new FileReader(file);
        char[] a = new char[50];
        fr.read(a); // 从数组中读取内容
        for (char c : a)
            System.out.print(c); // 一个个打印字符
        fr.close();
    }
}