欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java中有关文件流的操作

程序员文章站 2024-03-04 15:06:17
...

文件流: 顾名思义,程序和文件打交道.

此时我们谈及的文件,值得是纯文本文件(txt的,不要使用Word,Excel),


在字节流中,暂时不要使用中文.
FileInputStream: 文件的字节输入流
FileOutputStream: 文件的字节输出流
FileReader:文件的字符输入流
FileWriter:文件的字符输出流

文件字符流:

文件的字节流:
FileInputStream:
FileOutputStream:

使用字节流操作汉字或特殊的符号语言的时候,容易乱码,建议使用字符流.
先有字节流,后有字符流,字符流是对字节流的补充.

使用记事本打开某个文件,可以看到内容的就是文本文件,否则可以理解二进制.
一般的,操作二进制文件(图片,音频,视频等)必须使用字节流.
一般的,操作文本文件使用字符流.
如果不清楚是哪一类型文件,使用字节流.

文件的字符流:
FileReader:
FileWriter:

代码:

文件字节输入流:

    public static void main(String[] args) throws IOException {
        File file = new File("file/stream.txt");
        InputStream in =new FileInputStream(file);
        File fileCopy = new File("file/streamCopy.txt");
        OutputStream out = new FileOutputStream(fileCopy);
        //System.out.println(in.read());
/*      int read 读取一个字节,返回读取的字节
        int read(byte[] b)读取多个字节,并存储到数组中
        int read(byte[] b, int off, int len) */
        byte[] b = new byte[11];
/*      
 *      输出文件内容方式一
 *      in.read(b);
        String str = new String(b);
        System.out.println(str);*/
        //System.out.println(Arrays.toString(b));打印结果为Unicode编码
        //输出文件内容方式二
        int len = -1;//-1表示文件读取到最后
        while((len = in.read(b))!=-1){
            String str = new String(b,0,len);
            //文件拷贝
            out.write(b,0,len);
            System.out.println(str);
        }
        in.close();
    }

文件字节输出流:

    public static void main(String[] args) throws Exception {
        //文件可以帮我创建但是目录不能够帮我们创建,点解file文件夹refresh刷新file文件夹
        File file = new File("file/stream.txt");//如果文件不存在会自动创建刷新项目文件可以看见出现该文件了
        //获取FileOutputStream文件输出流对象,false表示不追加,true向文件中追加内容
        OutputStream out = new FileOutputStream(file,false);
        //在write方法中传入的参数为int或者是Byte如果传入的是int常量为65则转为A
        out.write("hello java!".getBytes());
/*      write(int b);把一个字节写出到文件中
        write(byte[] b, int off, int len);从b数组中的第off位置开始向文件中写入len位数字*/
        out.close();
    }
}

文件字符输出流:

package IO;

import java.io.File;
import java.io.FileReader;
import java.io.Reader;

public class CharReaderDemo {
    public static void main(String[] args) throws Exception {
        //获取源文件
        File file = new File("file/aaa.txt");
        //获取流对象
        Reader reader = new FileReader(file);
        int len = -1;
        //每次只能读取5个字符
        char[] cnt = new char[5];
        while((len = reader.read(cnt)) != -1){
            System.out.println(cnt);
        }
    }
}

文件字符输入流:

package IO;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class CharWriteDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("file/aaa.txt");
        //如果想追加内容设为true,否则或者默认为false
        Writer out = new FileWriter(file,true);
        String str = "我是新添加的字符串";
        char[] c= str.toCharArray();
        out.write(c);
        out.close();
    }
}

文件拷贝操作和资源的正确关闭:

文件拷贝:

package IO;

import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

public class FileCopy {
    public static void main(String[] args) throws IOException {
        //获取源
        File srcfile = new File("file"); 
        File[] files = srcfile.listFiles(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                return (new File(dir,name).isFile()&&name.endsWith(".txt"));
            }
        });
        File newFile = new File("new/copyFile.txt");
        OutputStream out = new FileOutputStream(newFile,true);
        System.out.println("------------写入操作---------------");
        for (File file : files) {
            System.out.println("文件名"+file.getName());
            InputStream in  = new FileInputStream(file);
            int len = -1;
            byte[] b = new byte[10];
            len = in.read(b);
            while(len != -1){
                String fileContent = new String(b);
                System.out.println("文件内容"+fileContent+"有效长度"+len);
                out.write(b, 0, len);
                len = in.read(b);
            }
            in.close();
        }
        InputStream in1 = new FileInputStream(newFile);
        int len = -1;
        byte[] B = new byte[1024];
        System.out.println("----------输出拷贝后的文件内容-----------------");
        while((len = in1.read(B)) != -1){
            String str = new String(B);
            System.out.println(str);
        }
        in1.close();
        out.close();
    }
}

资源的正确关闭:
java中有关文件流的操作

文件字节流使用案例:
案例1:文件拷贝案例-拷贝指定目录的指定类型文件到指定目录.
分析: 比如把C:/java目录中所有的java文件拷贝到D:/text/把拷贝的所有文件的拓展名改为.txt.
java中有关文件流的操作
案例2:获取进程数据-编译和运行Java代码.

package IO;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class dynamicCompile {
    public static void main(String[] args) throws IOException {
        String str = "System.out.println(\"hello word!\")";
        exec(str);

    }
    static void exec(String str) throws IOException{
        //1.获取源文件
        File file = new File("file/Hello.java");
        //2.拼接一个完整的程序
        StringBuilder sb = new StringBuilder();
        sb.append("public class Hello {");
        sb.append("public static void main(String [] args) {").append(str).append(";").append("}}");
        //3.保存到hello.java文件中
        OutputStream out = new FileOutputStream(file);
        byte[] b = new byte[100];
        out.write(sb.toString().getBytes());
        out.close();
        //4.读取javac进程来编译hello.java
        String command = "javac Hello.java";
        Process javacProcess = Runtime.getRuntime().exec(command);
        //5.读取javac进程中的错误流信息
        InputStream error = javacProcess.getErrorStream();
        //6. 读取流中的数据
        byte[] buffer = new byte[1024];
        int len = -1;
        while((len = error.read(buffer)) != -1){
            String msg = new String(buffer, 0, len);
            System.out.println(msg);
        }
        error.close();
        //7.调用java进程来运行hello.class
        Process javaProcess = Runtime.getRuntime().exec("java Hello");
        //8.读取进程中的流信息
        InputStream info = javaProcess.getInputStream();
        while((len = info.read(buffer)) !=-1){
            String msg = new String(buffer, 0, len);
            System.out.println(msg);
        }
        info.close();
        //9.删除java和class文件
        file.delete();
    }
}
相关标签: java 文件流