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();
}
}