黑马程序员---文件和流操作

来源:互联网 发布:mac pro 充电器 编辑:程序博客网 时间:2024/04/28 22:49

---------------------- Java开发、Android培训、期待与您交流! ----------------------


1、文件和流操作

Java中,把一组有序的数据序列称为流。根据操作的类型,可据,向输出流写入数据以把流分为输入流和输出流两种。程序从输入流读取数

Java I/O系统负责处理程序的输入和输出,I/O类库位于java.io包中,它对各种常用的输入流和输出流进行了抽象。

如果数据流中最小的数据单元是字节,那么称这种流为字节流;如果数据流中最小的数据单元时字符,那么称这种流为字符流。I/O类库中,java.io.InputStreanjava.io.OutputStream分别表示字节输入流字节输出流java.io.Readerjava.io.Writer分别表示字符输入流字符输出流

2、 输入流和输出流概述

java.io包中,java.io.InputStream表示字节输入流,java.io.OutputStream表示字节输出流,它们都是抽象类不能被实例化

InputStream类提供了一系列和读取数据有关的方法。


以上第一个read方法从输入流读取一个字节,而其余两个read方法从输入流批量读取若干字节。在从文件或键盘读数据时,采用后面两个read方法可以减少进行物理读文件或键盘的次数,因此能提高I/O操作的效率。

java.io.OutputStream类提供了一系列与写数据有关的方法。


为了保证输入流和输出流被及时关闭,最好把关闭流的操作放在finally代码块中。I/O操作通常采用以下程序流程。

InputStream in;

OuputStream out;

try {

处理输入流

处理输出流

     } catch (IOException ex) 

{

     处理IO异常

} finally {

in.close();

out.close();

}


3.2.2文件输入流:FileInputStream


import java.io.FileInputStream;

import java.io.IOException;

public class FileInputStreamTester {

    public static void main(String[] args) throws IOException {

        FileInputStream in = new FileInputStream("D:\\test.txt");

        int data;

        while ((data=in.read()) != -1) {

           System.out. print(data + " ");

        }

        in.close();

    }

}

所有字节输出流都是OutputStream类的直接或者间接子类。输出流的种类和输入流的种类是大致对应的。

3 Reader/Writer概述

InputStreamOutStream类处理的是字节流,也就是说,数据流中的最小单元一个字节,它包括8个二进制位。在许多应用场合,Java程序需要读写文本文件。在文本文件中存放了采用特定字符编码的字符。为了便于读写各种字符编码的字符,java.io包中提供了Reader/Writer类,它们分别表示字符输入流字符输出流

在处理字符流,最主要的问题是进行字符编码的转化。Java语言采用Unicode字符编码。对于每一字符,Java虚拟机会为其分配两个字节的内存。而在文本文件中,字符有可能采用其他类型的编码,比如GBKUTF-8字符编码等。

文件的操作

与文件相关的类,集中在java.io包中。Java使用File类来统一操作文件和文件夹。(提供了文件或目录的有用信息。并不真正打开或存取文件。)

FileDemo.java,简单地列出文件或文件信息。


 import java.io.File;

import java.util.ArrayList;

 

public class FileDemo {

public static void main(String[] args) {

File file = new File("c:\\Windows");//c:\\Windows\\winhlp32.exe

if (file.isFile()) {// 是否为文件

System.out.println("文件");

System.out.println(file.canRead()?"可读":"不可读");

System.out.println(file.canWrite()?"可写":"不可写");

System.out.println(file.length() + "字节");

else {

// 列出所有的文件及目录

File[] files = file.listFiles();

ArrayList<File> fileList = new ArrayList<File>();

for (int i=0; i<files.length; i++) {

// 先列出目录

if (files[i].isDirectory()) {//是否为目录

// 取得路径名

System.out.println("[" + files[i].getPath() + "]"); 

else {

// 文件先存入fileList,待会再列出??

fileList.add(files[i]);

}

}

for (File f : fileList) {

System.out.print(f.toString());

}

System.out.println(); 

}

}

}

 

FileTest.java,给出了更多的File类方法的示例。


 

import java.io.File;

import java.io.IOException;

 

public class FileTest {

public static void main(String[] args) throws IOException {

//以当前路径来创建一个File对象

File file = new File(".");

//直接获取文件名,输出一点

System.out.println(file.getName());

//获取相对路径的父路径可能出错,下面代码输出null

System.out.println(file.getParent());

//获取绝对路径

System.out.println(file.getAbsoluteFile());

//获取上一级路径

System.out.println(file.getAbsoluteFile().getParent());

//在当前路径下创建一个临时文件

File tmpFile = File.createTempFile("aaa"".txt", file);

//指定当JVM退出时删除该文件

tmpFile.deleteOnExit();

//以系统当前时间作为新文件名来创建新文件

File newFile = new File(System.currentTimeMillis() + "");

System.out.println("newFile对象是否存在:" + newFile.exists());

//以指定newFile对象来创建一个文件

newFile.createNewFile();

        //newFile对象来创建一个目录,因为newFile已经存在,

        //所以下面方法返回false,即无法创建该目录

        newFile.mkdir();

      //使用list方法来列出当前路径下的所有文件和路径

        String[] fileList = file.list();

        System.out.println("======当前路径下所有文件和路径如下=====");

        for (String fileName : fileList) {

            System.out.println(fileName);

        }

 

        //listRoots静态方法列出所有的磁盘根路径。

        File[] roots = File.listRoots();

        System.out.println("======系统所有根路径如下=====");

        for (File root : roots) {

            System.out.println(root);

        }

}

}

流的相关示例

输入流的示例

import static net.mindview.util.Print.print;

 

import java.io.FileInputStream;

import java.io.IOException;

 

public class FileInputStreamTest {

public static void main(String[] args) throws IOException{

//创建字节输入流

FileInputStream fis = new FileInputStream("FileInputStreamTest.java");

//创建一个长度为1024竹筒

byte[] bbuf = new byte[1024];

//用于保存实际读取的字节数

int hasRead = 0;

//使用循环来重复取水过程

while ((hasRead = fis.read(bbuf)) > 0) {

//取出竹筒中水滴(字节),将字节数组转换成字符串输入!

import static net.mindview.util.Print.print;

(new String(bbuf, 0, hasRead));

}

fis.close();

}

}

 

File类方法的示例。


 import java.io.FileReader;

import java.io.IOException;

 

public class FileReaderTest {

public static void main(String[] args) throws IOException {

FileReader fr = null;

try {

//创建字符输入流

fr = new FileReader("FileInputStreamTest.java");

//创建一个长度为32竹筒

char[] cbuf = new char[32];

//用于保存实际读取的字符数

int hasRead = 0;

//使用循环来重复取水过程

while ((hasRead = fr.read(cbuf)) > 0) {

//取出竹筒中水滴(字节),将字符数组转换成字符串输入!

System.out.print(new String(cbuf , 0 , hasRead));

}

catch (IOException ioe) {

ioe.printStackTrace();

finally {

//使用finally块来关闭文件输入流

if (fr != null) {

fr.close();

}

}

}

}

输出流的示例

FileOutputStream.java,通过字节流实现文件复制。

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

 

public class FileOutputStreamTest {

public static void main(String[] args) throws IOException {

FileInputStream fis = null;

FileOutputStream fos = null;

try {

//创建字节输入流

fis = new FileInputStream("FileInputStreamTest.java");

//创建字节输入流

fos = new FileOutputStream("newFile.txt");

byte[] bbuf = new byte[32];

int hasRead = 0;

//循环从输入流中取出数据

while ((hasRead = fis.read(bbuf)) > 0) {

//每读取一次,即写入文件输出流,读了多少,就写多少。

                fos.write(bbuf, 0, hasRead);

}

catch (IOException ioe) {

ioe.printStackTrace();

finally {

//使用finally块来关闭文件输入流

            if (fis != null) {

                fis.close();

            }

            //使用finally块来关闭文件输出流

            if (fos != null) {

                fos.close();

            }

}

}

}

 

FileWriterTest.java,向文件中输入字符。

import java.io.*;

 

public class FileWriterTest {

    public static void main(String[] args) throws IOException {

        FileWriter fw = null;

        try {

            //创建字符输出流

            fw = new FileWriter("poem.txt");

            fw.write("锦瑟 李商隐\r\n");

            fw.write("锦瑟无端五十弦,一弦一柱思华年。\r\n");

            fw.write("庄生晓梦迷蝴蝶,望帝春心托杜鹃。\r\n");

            fw.write("沧海月明珠有泪,蓝田日暖玉生烟。\r\n");

            fw.write("此情可待成追忆,只是当时已惘然。\r\n");

        } catch (IOException ioe) {

            ioe.printStackTrace();

        } finally {

            //使用finally块来关闭文件输出流

            if (fw != null) {

                fw.close();

            }

        }

    }

}

 

字符编码问题

Java中的字符编码采用UNICODE字符集,但有些操作系统会采用其他的字符集,因此,需要解决字符编码转换的问题。

JDK使用Charset类来处理编码问题。

列出当前系统所支持的所有字符集。

import java.nio.charset.Charset;

import java.util.SortedMap;

 

public class CharsetTest {

public static void main(String[] args) {

//获取全部字符集

SortedMap<String,Charset>  map = Charset.availableCharsets();

for (String alias : map.keySet()){

//输出字符集的别名和对应的Charset对象

System.out.println(alias + "----->" + map.get(alias));

}

}

}

 

CharsetTransform.java,转换字符编码。

import java.nio.ByteBuffer;

import java.nio.CharBuffer;

import java.nio.charset.Charset;

import java.nio.charset.CharsetDecoder;

import java.nio.charset.CharsetEncoder;

 

public class CharsetTransform {

public static void main(String[] args) throws Exception {

//创建简体中文对应的Charset

Charset cn = Charset.forName("GBK");

//获取cn对象对应的编码器和解码器

CharsetEncoder cnEncoder = cn.newEncoder();

CharsetDecoder cnDecoder = cn.newDecoder();

//创建一个CharBuffer对象

CharBuffer cbuff = CharBuffer.allocate(8);

cbuff.put('');

cbuff.put('');

cbuff.put('');

cbuff.flip();

//CharBuffer中的字符序列转换成字节序列

ByteBuffer bbuff = cnEncoder.encode(cbuff);

//循环访问ByteBuffer中的每个字节

for (int i = 0; i < bbuff.capacity() ; i++) {

System.out.print(bbuff.get(i) + " ");

}

//ByteBuffer的数据解码成字符序列

System.out.println("\n" + cnDecoder.decode(bbuff));

}

}

 

 

---------------------- Java开发Android培训、期待与您交流! ----------------------详细请查看:www.itheima.com





0 0
原创粉丝点击