您的位置:首页 > 编程语言 > Java开发

java输出/输出——文件读写示例代码总结

2017-06-01 16:10 656 查看
        JAVA程序所有的读写操作都是通过流来实现的,根据组成流的不同,可将其分为字节流和字符流。字节流是由字节组成的,主要用在处理二进制数据,字符流是由字符组成,主要处理文本的数据。(JAVA中,一个字节有8b,一个字符有两个字节)

    一、文件类

    File类不属于Java流系统,但它是文件流进行文件操作的辅助类,File类的对象并不打开文件或目录,而是指定要操作的文件或目录。

    使用createNewFile()创建新文件代码示例: 

/*使用createNewFile()创建新文件*/
public static void main(String[] args)
{
String path="G://test//1.txt";
/*另一种写法*/
//		String path="G:\\test\\1.txt";
File file=new File(path);
try {
file.createNewFile();
System.out.println("创建成功!");
} catch (IOException e) {
System.out.println("创建失败!");
e.printStackTrace();
}
}
    输出目录中的所有文件代码示例如下:

File file=new File(path);
String list[]=file.list();
File listFile[]=file.listFile();
     File类提供了list()和listFile()两种方法输出一个目录的所有文件。两者之间的不同是:list()方法只返回文件名,没有路径信息;listFile()不但返回文件名称还含有路径信息;

    二、字节流

    字节流一般用于读取或者写入二进制数据,如图片、音频文件;字符流无法正常处理的二进制可执行文件和压缩文件等。一般而言,只要是“非文本数据”就应该使用字节流来处理,因为字符流无法保证“非文件数据”的完整性。

    输入流代码示例:

/*输入流*/
public static void main(String[] args) throws Exception
{
String path="G:\\test\\1.txt";
File file=new File(path);
InputStream input=new FileInputStream(file);
byte b[]=new byte[(int)file.length()];
int temp=0;
int len=0;
while((temp=input.read())!=-1)
{
b[len]=(byte)temp;
len++;
}
input.close();
System.out.println(new String(b));
}
    输出流代码示例:(实现文件内容追加功能)
/*输出流*/
public static void main(String[] args)
{
String path="G:\\test\\1.txt";
File file=new File(path);
try {
/*以追加的形式输出*/
OutputStream out = new FileOutputStream(file,true);
String str="你好";
byte b[]=str.getBytes();
out.write(b);
out.close();
System.out.println("Success!");
} catch (IOException e) {
System.out.println("fail!");
e.printStackTrace();
}
}
    三、字符流

     输入流代码示例:

/*输出流*/
public static void main(String[] args)
{
String path="G:\\test\\1.txt";
File file=new File(path);
try {
Reader read=new FileReader(file);
//read的类读取数据的单位是字符(char)
char c[]=new char[(int)file.length()];
int temp=0;
int len=0;
//使用while循环读取文件的内容,到达结尾是temp=-1
while((temp=read.read())!=-1)
{
c[len]=(char)temp;
len++;
}
read.close();
System.out.println(c);
System.out.println("读取成功!");
} catch (IOException e) {
System.out.println("读取失败!");
e.printStackTrace();
}

}
     输出流代码示例:(实现文件内容追加功能)

/*输入流*/
public static void main(String[] args)
{
String path="G:\\test\\1.txt";
File file=new File(path);
String str="123 ";
try {
Writer out=new FileWriter(file,true);
out.write(str);
out.close();
System.out.println("写入成功!");
} catch (IOException e) {
System.out.println("写入失败!");
e.printStackTrace();
}
}
      

     截止目前,我们发现字节流和字符流的使用都很类似,除了在处理数据单位的不同之处,还有那些不同呢?实际上,字节流是对文件本身直接进行操作,不需要通过缓冲区;而字符流则要通过缓冲流来操作文件。换句话说,使用字节流时,就算没有执行close()方法关闭字节流的操作,还是可以向文件输出内容的。但是在字符流中,若不执行close()方法,就无法向文件写入内容。当然,不执行close()方法,即不降缓冲区内容刷新到文件,文件为空,但是可以使用flush()强制清除内容。

         
         什么是缓冲区?因为计算机访问外部设备或文件要比直接访问内存慢很多,如果我们每次调用read()或writer()方法访问外部设备或文件,CPU就要花费很多的时间在等待。为此我们开辟一个内存缓冲区的内存区域,当这个缓冲区被装满后,系统才将这个缓冲区的内容一次集中写到外部设备或读取进来给CPU,提高CPU的使用率。

      四、缓冲流:BufferedReader类

      相比而言,对于从文件读取数据或将数据写入文件,比起对缓冲区的读写要慢得多了。缓冲流把数据从原始流成块读入或把数据积累到一个大数据块后再成批写出,通过减少系统资源的读写次数来加快程序的执行。

      注意:bufferedReader是针对Reader的,是需要与其他字符流配合使用的,不直接针对文件的读取。

     使用Buff
4000
eredReader类读文件代码示例:

    public static void main(String[] args)
{
String path="G:\\test\\1.txt";
File file=new File(path);
String str=null;

try {
Reader read=new FileReader(file);
BufferedReader bin=new BufferedReader(read);
while ((str = bin.readLine()) != null)
{
System.out.println(str);
}
bin.close();
read.close();
} catch (IOException e) {
System.out.println("读取失败!");
e.printStackTrace();
}
}      BufferedWriter类是Writer的子类。与Writer相比,BufferedWriter类主要的改变是重写了flush()方法,该方法确保缓冲区的数据确实被写到输出流中。
      使用BufferedWriter类写/追加文件的代码示例:

public static void main(String[] args)
{
String path="G:\\test\\1.txt";
File file=new File(path);
String str[]={"123","234","345"};
try {
Writer writer=new FileWriter(file,true);//追加的形式
BufferedWriter bw=new BufferedWriter(writer);
for(int i=0;i<str.length;i++)
{
bw.write(str[i]);
bw.newLine();//写一个结尾‘\n’,以达到换行的目的
}
bw.close();
writer.close();
System.out.println("写入成功!");
} catch (IOException e) {
System.out.println("写入失败!");
e.printStackTrace();
}

}      五、其他的几个流:
    内存操作流:流数据有byte[]和char[]之分,java.io包提供ByteArrayInputStream和ByteArrayOutputStream类,用于实现字节数组的输入和输出。

    打印流:可以方便地将各种不同类型的数据打印输出到另一个输出流,PrintStream类可以配合不同的输出流,用来输出数据到各个目的地,如文件、数组等。

    Scanner类:方便地控制台中输入数据。

    随机访问文件类:RandomAccexxFile类......

   顺序输入流:SequenceInputStream类可以把多个输入流串流程一起,合并成一个输入流。

   压缩流:为了减少传输时的数据量提供了专门的压缩流,可以将文件或文件夹压缩成ZIP、JAR、GZIP等文件形式。

   对象序列化:向一个输出流写入一个对象;而对象的反序列化是指从一个输入流中读取一个对象。

  



   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: