第一篇:java 文件与输入输出流
实验2文件与输入输出流(1)
一、实验目的 能够使用File类表示文件或目录,获取相关信息,并进行文件操作; 能够利用InputStream和OutputStream的子类进行字节读、写操作,明白其优点及不足;
能够用FileInputStream和FileOutputStream进行文件读写的操作; 理解“逐层包装”思想,能够利用“数据流”(DataInputStream和DataOutputStream)包装字节流,方便各类数据的读写;
能够利用“缓冲字节流”(BufferedInputStream和BufferedOutputStream)包装字节流,加快数据的读写速度;
熟知System.in和System.out是PrintStream的实例。
二、实验步骤
在Eclipse环境中导入项目“code(lab_2)”,然后按要求完成各小题:
1.打开FileTest.java文件,请按下列要求进行操作:
(1)按要求填充程序所缺代码;
(2)程序的运行需要用到一个命令行参数,请分别用一个文件、目录作参数来运行程序,看一看结果有什么不同。
(在Eclipse中设置命令行参数方法:Run/Open Run Dialog „/(x)=Arguments设置)
2.在上一题的基础上,修改程序,使之具备输出指定目录下所有子目录中文件绝对路径名、大小的功能,如下所示:
子目录:C:jdk1.6.0sample
子目录:C:jdk1.6.0samplewebservices
子目录:C:jdk1.6.0samplewebservicesEbayServer
文件: C:jdk1.6.0samplewebservicesEbayServerbuild.properties,大小: 512 字节 文件: C:jdk1.6.0samplewebservicesEbayServerbuild.xml,大小: 3168 字节1
……
提示:参考课件 FileSpace.java内容,通过一个以“路径名”为参数的静态方法来实现:该方法先判断“路径名”是一个文件,还是一个目录?如果是文件,则输出其绝对路径和大小;若为一个目录,则先显示目录绝对路径,再列出该目录下的所有子目录和文件,通过循环和递归方法来执行后续处理。
3.文件FileOutputStreamTest.java的功能是:利用FileOutputStream类向myfile.txt文件写入'0'~'9'和“用字节流写入文件内容”,请填充程序所缺代码,并运行程序。然后打开myfile.txt文件,查看其内容是否与要求相符?
4.文件FileInputStreamTest1.java的功能是:利用FileInputStream类以“逐字节”方式读取myfile.txt文件内容,并输出。请填充程序所缺代码,并运行程序。问题:为什么程序输出的内容为乱码?
5.在FileInputStreamTest1.java的基础上,编写程序FileInputStreamTest2.java,利用FileInputStream类以“字节数组”方式读取myfile.txt文件内容,能正确输出,解决乱码问题。
思考题:乱码问题是怎样解决的?
6.若要将信息“Java开发典型模块大全”(书名)、“明日科技”(作者)、79.5(价格)等信息以UTF、double类型保存到文件books.txt中,请用“数据流”类编程实现。
第二篇:使用java输入输出流实现文件的复制
使用java输入输出流实现文件的复制:
public class Test {
public static void copy(File source,File target){
InputStream in=null;
OutputStream out=null;
try {
in=new BufferedInputStream(new FileInputStream(source));out=new BufferedOutputStream(new FileOutputStream(target));byte[] buff=new byte[1024];
while(in.read(buff)>0){
out.write(buff);
}
} catch(Exception e){
// TODO: handle exception
e.printStackTrace();
}finally{
try {
if(in!=null)
in.close();
if(out!=null)
out.close();
} catch(Exception e2){
// TODO: handle exception
}
}
}
public static void main(String[] args){
// TODO Auto-generated method stub
}
}
第三篇:关于java文件流的简单示例
package myjava;
import java.io.*;
public class InputStreamDemo1 {
//根据文件返回一个输入流 private FileInputStream getFileInputStream(File file){FileInputStream fis=null;try{fis=new FileInputStream(file);}catch(IOException e){System.out.println(e.getMessage());}return fis;} //根据文件返回一个输输出流 private FileOutputStream getFileOutputStream(File file){FileOutputStream fos=null;try{fos=new FileOutputStream(file);}catch(IOException e){System.out.println(e.getMessage());}catch(Exception e1){System.out.println(e1.getMessage());}return fos;} public static void main(String args[]){File input=new File(“G:Java网络编程.pdf”);File output=new File(“G:output.txt”);InputStreamDemo1 isd=new InputStreamDemo1();FileInputStream fis=isd.getFileInputStream(input);FileOutputStream fos=isd.getFileOutputStream(output);int b=0;
}} try {while((b=fis.read())!=-1){fos.write(b);} fis.close();fos.close();} catch(Exception e){System.out.println(e.getMessage());}
第四篇:Java 实验 文件管理与IO流
作业要求:每个题保存为一个.java文件,保存在同一工程文件夹中,文件夹的名字为E:Java你的班级+姓名,例如:E:Java信息11张三。
注意:上交的程序包含程序的执行结果,以注释的形式附在程序后面。
实验六文件管理与I/O流
一、实验目的1.熟悉用文件File类创建、删除、查看文件或目录。
2.字节流、字符流、缓冲流、随机流等流式文件的创建,读写操作。
3.用字符流和缓冲流从键盘接受字符串的方法。
二、实验内容
1.先运行该程序。源文件是sy6_1.java。然后按【思考问题】分析程序。
import java.io.*;
public class sy6_1{
public static void main(String[] args)throws Exception
{
int x=0;
File Mypath;
Mypath=new File(“E:aaaa”);
if(!Mypath.exists())
{System.out.println(“创建新目录”);Mypath.mkdir();}
else System.out.println(“目录已存在”);
File Myfile1=new File(Mypath,“myfile1.txt”);
File Myfile2=new File(Mypath,“myfile2.txt”);
File Myfile3=new File(Mypath,“myfile3.txt”);
FileInputStream Fin=new FileInputStream(Myfile1);
FileOutputStream Fout=new FileOutputStream(Myfile1);
DataOutputStream Dout=new DataOutputStream(new FileOutputStream(Myfile2));
DataInputStream Din=new DataInputStream(new FileInputStream(Myfile2));
PrintWriter PWout=new PrintWriter(new FileWriter(Myfile3));
RandomAccessFile RAread=new RandomAccessFile(Myfile3,“r”);
String str;
int num1;
BufferedReader buf;//缓冲流
buf=new BufferedReader(new InputStreamReader(System.in));
System.out.print(“请输入一个小于255整型数:”);
while(!(str=buf.readLine()).equalsIgnoreCase(“q”))
{ System.out.print(“请输入另一个小于255整型数,按Q结束:”);
num1=Integer.parseInt(str);
Fout.write(num1);
}Fout.close();
System.out.println(“你刚输入的数据是:”);
while((x=Fin.read())!=-1)
{ System.out.println(x);
}Fin.close();
System.out.print(“请输入int范围内整型数:”);
while(!(str=buf.readLine()).equalsIgnoreCase(“q”))
{ System.out.print(“请输入另一个整型数,按Q结束:”);
num1=Integer.parseInt(str);
Dout.writeInt(num1);
}Dout.close();
int leng=Din.available()/4;
int xxx=0;
while(xxx { xxx++; x=Din.readInt(); System.out.println(x); } Din.close(); System.out.print(“请输入第一个字符串:”); while((str=buf.readLine())!=null) { System.out.print(“请输入另一个字符串,按Ctrl+Z结束:”); PWout.println(str);//写入myfile3.txt中 } PWout.close(); RAread.seek(0); while(RAread.getFilePointer() {System.out.println(RAread.readLine());//从myfile3.txt中一行一行读并输出在控制台上 } RAread.close(); System.out.println(“完成”); } } 【思考问题】 ① 本程序共用到哪几种流式文件?都用于做什么? 答:基本输入输出流:System.in.输入(从键盘) System.out.输出(显示器) 字节流类:FileOutputStream 文件输出 FileInputStream 文件输入 DataOutputStream数据输出 DataInputStream数据输入 字符流类:PrintWriter输入 缓冲文件流:BufferedReader ② 运行完程序后,请用“我的电脑”找到创建的文件,并分别打开文件看其内容,你 看到的是你输入的数据吗? 答:myfile1和myfile2中的数据非输入数据,myfile3中可以看见输入的数据。③ 将创建输入流对象Fin放在输出流Fout前,看发生什么? ④ 对第二种流式文件判断文件占用字节的长度用available()方法,而此处用int leng=Din.available()/4;为什么除以4? 2.按照第1题的内容,修改程序要求每次重新运行不覆盖原内容,把所有其它流式文件全部改用随机流式文件来实现,新的数据填加在文件尾,然后读出校验。 import java.io.*; public class sy6_2 { public static void main(String[] args)throws Exception { File Mypath; Mypath = new File(“E:aaa”); if(!Mypath.exists()) {System.out.println(“创建新目录”);Mypath.mkdir();} else System.out.println(“目录已存在”); File Myfile1 = new File(Mypath, “myfile1.txt”); File Myfile2 = new File(Mypath, “myfile2.txt”); File Myfile3 = new File(Mypath, “myfile3.txt”); RandomAccessFile rf1 = new RandomAccessFile(Myfile1, “rw”); RandomAccessFile rf2 = new RandomAccessFile(Myfile2, “rw”); RandomAccessFile rf3 = new RandomAccessFile(Myfile3, “rw”); String str; int num1; BufferedReader buf;//缓冲流 buf = new BufferedReader(new InputStreamReader(System.in)); System.out.print(“请输入一个小于255整型数:”); rf1.seek(rf1.length());//指针移到文件尾进行写操作 while(!(str=buf.readLine()).equalsIgnoreCase(“q”)) { System.out.print(“请输入另一个小于255整型数,按Q结束:”);num1=Integer.parseInt(str); rf1.write(num1);//将整型数作为ascii码值所对应的字符写入myfile1.txt中} rf1.seek(0);//指针移到文件头进行读操作 int x=0; while((x=rf1.read())!=-1) { System.out.println(x); } rf1.close(); System.out.print(“请输入int范围内整型数:”); rf2.seek(rf2.length()); while(!(str = buf.readLine()).equalsIgnoreCase(“q”)){ System.out.print(“请输入另一个整型数,按Q结束:”); num1 = Integer.parseInt(str); rf2.writeInt(num1); } int x1 = 0; for(int l = 0;l { rf2.seek(l*4); x1 = rf2.readInt(); System.out.println(x1); } rf2.close(); System.out.print(“请输入第一个字符串:”); rf3.seek(rf3.length()); while((str = buf.readLine())!= null){ System.out.println(“请输入另一个字符串,按Ctrl+Z结束:”);rf3.writeUTF(str);//写入myfile3.txt中 } rf3.seek(0); while(rf3.getFilePointer()< rf3.length()){ System.out.println(rf3.readUTF());//从myfile3.txt中读出字符串并输出在控制台上 } rf3.close(); System.out.println(“完成”); } } 三、实验报告要求 1.回答第1题【思考问题】提出的问题。 2.写出第二题要求的源程序。 流的分类: 输入流(InputStream/Reader),输出流(OutputStream/Writer) 字节流(InputStream,OutputStream)字符流(Reader/Writer) 节点流(InputStream/Reader,OutputStream/Writer),处理流(过滤流)BufferedIO(缓冲),DataInputStream/DataOutputStream(各种数据类型), InputStreamReader/OutputStreamWriter(转换流),ByteArrayInputStream/ ByteArrayOutputStream(内存数组流)PipedInputStream/ PipedOutputStream(管道流,线程间通讯) 1.或者OutputStream可以创建一个文件,但是不能创建一个文件夹。 2.InputStream(OutputStream)和Reader(Writer)的区别在于字节和字符,对于非标准ASCII 编码(占用两个字节的字符)字节流会出现乱码。 3.使用bufferedIO是为了readline()方法和write(s),s是一个字符串。而且 bufferedinPutStream有mark和reset方法。 4.InputStreamReader和OutputStreamWriter可以把字节流转换为字符流。 InputStreamReader需要和InputStream套接。OutputStreamWriter需要和OutputStream套接。OutputStreamWriter可以写一个字符串。还有一个典型的应用就是在于对于System.in的处理。 InputStreamReaderisr = newInputStreamReader(System.in); BufferedReaderbr = newBufferedReader(isr); System.in是一个InputStream的子类,需要把它改成InputStreamReader然后使用BufferedReader读出每行的内容。 5.DataInputStream,DataOutputStream是用来对付原始的数据类型,比如int,long,double,float 和UTF。 6.ByteArrayInputStream和ByteArrayOutputStream在内存中创建一个字节数组。 import java.io.*; publicclassTestDataStream { publicstaticvoid main(String[] args){ ByteArrayOutputStreambaos = newByteArrayOutputStream();//在内存中创建了一个内存字节数组,并对上一个管道baos DataOutputStream dos = newDataOutputStream(baos);//使用DataOutputStream是为了使用writeDouble,writeBoolean等方法 try { dos.writeDouble(Math.random());//在字节数组当中写入8个字节的double类型的数字 dos.writeBoolean(true);//在字节数组中写入一个boolean类型的true,占用1个字节 ByteArrayInputStreambais = newByteArrayInputStream(baos.toByteArray());//bais也对到由baos对应的内存字节数组 System.out.println(bais.available());//内存数组当中有多少字节可用(也就是说被写入了多少个字节的内容) DataInputStream dis = newDataInputStream(bais);//使用DataInputStream是为了使用readDouble,readBoolean等方法 System.out.println(dis.readDouble());//先写进去的东西要先读是队列 System.out.println(dis.readBoolean());//后写进去的东西要后读 dos.close(); dis.close(); } catch(IOException e){ e.printStackTrace(); } } } 7.PipedInputStream和PipedOutputStream是管道流,用于线程间的通信。一个线程的PipedInputStream对象必须从另一个线程的PipedOutputStream对象读取输入。要使用管道流,必须同时构造管道输入流和输出流。 8.Print流就只有输出流,没有输入流。 Print流不会抛异常,而且都会自动flush。 System.setOut(ps);//修改系统输出的位置 9.Object流和序列化问题 将对象转换为字节流并保存起来(文件,磁盘,网络),这种机制叫做对象序列化。并在日后还原这个对象,这种机制叫对象的反序列化。将一个对象保存到永久存储设备上称为持续性。 使用ObjectOutputStream和ObjectInputStream来专门用来把一个object写入或者读出硬盘上。(常用于游戏存盘?)其做法是把整个的object写入磁盘或者读出。 当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。 为了把一个类的对象写到硬盘或者网络,就必须实现serializable接口或Externalizable接口。区别是在于和Externalizable(外部化)是接口是抽象方法,必须被实现。而Serializable(序列化)是一个标示形接口,也就是说,这样的接口是没有方法。Java当中还有很多这样的接口。但是我们必须实现这个接口,这个接口的意义是在于让java编译器知道这个该类需要实现了这个功能。要注意,如果该类没有实现这个接口,会抛出一个NotSerializableException。 有的时候,一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。为了解决这个问题,可以将这个引用标记为transient,那么对象仍然可以序列化。也就是说,transient修饰的成员变量在序列化的时候,是不给予考虑的,也就是说被transient修饰的内容是不会被保存的。 Externalizable接口当中有两个抽象方法,必须被实现.第五篇:08 Java当中的输入输出流的学习笔记 基本IO