第十章 java的输入输出与文件处理
10.1 java的输入输出类库
java.io类库
10.1.1 流的概念
计算机各部件之间的数据流动。
按照传输方向:
- 输入流:从硬盘中读到内存中(程序中)
- 输出流:从程序(结果)输出到硬盘中
按照处理数据类型:
- 字节流:一次一个字节,处理类型为字节型。原始二进制
- 字符流:一次一个字符,输入字符流;输出字符流
10.2 使用InputStream和OutputStream
10.2.2 输入输出流的应用
文件输入输出流
文件输入流FileInputStream和文件输出流FileOutputStream主要负责完成对本地磁盘文件的顺序输入输出操作。
File类:(io包)
两种:
File file = new File("E:课件\\JAVA\\chap10\\a.txt");
File path = new File("E:\\课件\\JAVA\\chap10");
File file2 = new File(path,"a.txt");
File file3 = new File("E:\\课件\\JAVA\\chap10","a.txt");
获取分隔符:
File file = new File("E:"+File.separator+"a.txt");
不重要:
boolean exists():文件是否存在
boolean isFile():是否为一文件
boolean isDirectory():是否为一目录
long length():返回文件长度
long lastModified():返回修改日期和时间
boolean delete():删除文件
boolean createNewFile():创建文件
FileInputStream类:
- 对本地文件进行顺序读取:
public FileInputStream(String name)
public FileInputStream(File file)
public int read(byte b[])
文件的复制(拷贝)
fi.read(b); //将图形文件读入b数组
fo.write(b); //将b数组里的数据写入新文件my_icon.gif
import java.io.*;
public class app10_2
{
public static void main(String args[]) throws IOException
{
FileInputStream fi=new FileInputStream("d:\\cgj\\gificon.gif");
FileOutputStream fo=new FileOutputStream("d:\\cgj\\my_icon.gif");
System.out.println("文件的大小="+fi.available()); //输出文件的大小
byte b[]=new byte[fi.available()]; //创建byte类型的数组b
fi.read(b); //将图形文件读入b数组
fo.write(b); //将b数组里的数据写入新文件my_icon.gif
System.out.println("文件已被拷贝并被更名");
fi.close();
fo.close();
}
}
总:
File file = new File("E:"+File.separator+"a.txt");
FileInputStream fileInputStream= new FileInputStream("E:"+File.separator+"a.txt");
FileInputStream fileInputStream2 = new FileInputStream(file);
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args)
{
//输入流
File file = new File("E:"+File.separator+"abc"+File.separator+"a.txt");
//FileInputStream fileInputStream= new FileInputStream("E:"+File.separator+"a.txt");
FileInputStream fileInputStream2 = null;
//输出流
File file2 = new File("E:"+File.separator+"abc"+File.separator+"a2.txt");
FileOutputStream fileOutputStream2 = null;
try
{
fileInputStream2 = new FileInputStream(file);
fileOutputStream2 = new FileOutputStream(file2);
byte b[] = new byte[5];//存入数据,按照5的倍数
//int len = fileInputStream2.read(b);//读取
/*while(len>0)//当没有的时候就退出
{
System.out.println(len);//长度
System.out.println(new String(b));//输出数据(最后一个输出时,没有更新,为上一次的部分结果)
System.out.println(new String(b,0,len));//从0开始到len个长度
len = fileInputStream2.read(b);
}*/
//将a.txt的数据写到a2.txt
/*while(len>0)
{
fileOutputStream2.write(b, 0, len);
len = fileInputStream2.read(b);
*/
//优化
int len = 0;
while((len = fileInputStream2.read(b))>0)
{
fileOutputStream2.write(b, 0, len);
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
//关闭所有的流
fileInputStream2.close();
fileOutputStream2.close();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
获取文件大小
- 使用File的length()方法。long型,很大
- 使用FileInputStream的available()方法
public class Test9 {
public static void main(String[] args) throws IOException
{
FileInputStream in = null;
try
{
in = new FileInputStream("d:\\doc\\FileIputStream.java");
}
catch(FileNotFoundException fe)
{
System.out.println("找不到该文件!");
System.exit(-1);
}
int data;
while ((data = in.read()) != -1) #读到文件末尾的标志
{
System.out.println(data + "\t");
}
in.close();
}
}
中文乱码问题
- 使编码一致(文件保存的编码类型和程序的编码类型(文件上右键最后一个)一致)字节大小最好是128的倍数。
- 读数据到字节数组,然后构造字符串是指编码方式-txt文档的编码方式
分别又分为节点流和过滤流(BufferedInputStream&BufferedOutputStream)
节点流(低层流):用于直接操作目标设备的流(FileInputStream)
过滤流(高层流):对已经存在的节点流进行封装
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream2);
BufferedOutputStream bufferedOutputStream2 = new BufferedOutputStream(fileOutputStream2);
DateInputStream&DateOutStream
标准输入输出(System.in&System.out)
System类有out对象返回println方法
10.3 字符流(Reader&Writer)
public static void main(String[] args) {
File file = new File("E:"+File.separator+"abc"+File.separator+"a.txt");
File file2 = new File("E:"+File.separator+"abc"+File.separator+"a2.txt");
FileReader fileReader = null;
FileWriter fileWriter = null;
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
fileReader = new FileReader(file);
fileWriter = new FileWriter(file2);
bufferedReader = new BufferedReader(fileReader);
bufferedWriter = new BufferedWriter(fileWriter);
String string = null;
while((string = bufferedReader.readLine())!=null)
{
bufferedWriter.write(string);
//bufferedWriter.write("\n");回车
bufferedWriter.newLine();//回车
System.out.println(string);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
//关闭所有的流
fileReader.close();
fileWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
文件的分割与合并
package chap10;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
public class Test1 {
public static void main(String[] args)
{
File file = new File("e:\\Test.java");//分割文件
File file2=new File("e:\\abc");//合并文件夹
File file3=new File("e:\\Test2.java");//分割文件放入的文件
try {
Cut(file);
merg(file2, file3);
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
//传入一个文件,将文件分割
public static void Cut(File file) throws IOException
{
FileInputStream fileInputStream = new FileInputStream(file);
byte[] bs = new byte[256];//创建256字节大小的文件
//返回文件大小:long型的file().length和int型的fileInputStream.available();
long l = file.length();
//int l1 = fileInputStream.available();
int num = (int) (l%256==0?l/256:l/256+1);//三目,求得文件个数
for(int i =1;i<=num;i++)
{
int len = fileInputStream.read(bs);
FileOutputStream fileOutputStream = new FileOutputStream("e:\\abc\\a"+i+".java");
fileOutputStream.write(bs,0,len);
fileOutputStream.close();
}
fileInputStream.close();
}
//传入一个文件夹,将文件夹中的文件合并
public static void merg(File file,File newFile)throws IOException//将file合并到newfile文件夹
{
//不写true,从文件头开始。写上true都是从文件当前开始写入(末尾开始)
FileOutputStream fileOutputStream = new FileOutputStream(newFile,true);
//返回file数组,每一个元素都是一个文件,遍历该数组就可以得到每个文件
File[] files = file.listFiles();
//for each循环,files中的每一个放入item
for(File item:files)
{
byte[] b = new byte[256];
//针对item对象,创建输入流
FileInputStream fileInputStream = new FileInputStream(item);
int len = fileInputStream.read(b);
fileOutputStream.write(b,0,len);//注意write从0到len
fileInputStream.close();//输入流关闭
}
fileOutputStream.close();//输出流一直用着
}
}