2

JAVA基础之文件流输入输出

 2 years ago
source link: https://segmentfault.com/a/1190000040918592
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

JAVA基础之文件流输入输出

发布于 11 月 5 日

过去的文件流输出写法:

File f=new File("/Users/buxuesong/Documents/svn_code/demo/test.txt");
//OutputStream
OutputStream output = new FileOutputStream(f);

byte byteVal = 100;
output.write(byteVal);

byte[] byteBuff = {0,63,127};
output.write(byteBuff);

output.flush();
output.close();

//Writer
Writer writer = new FileWriter(f,true);
char charVal = 'a';
writer.write(charVal);

char[] charBuff = {'a','b','c'};
writer.write(charBuff);

过去文件流输入写法:

File f=new File("/Users/buxuesong/Documents/svn_code/demo/test.txt");
//InputStream
InputStream input = new FileInputStream(f);
int intVal;
while((intVal = input.read())>=0){
    byte byteVla = (byte) intVal;
    System.out.println(byteVla);
}

input = new FileInputStream(f);
int length;
byte[] byteBuff = {1,2,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};

while((length = input.read(byteBuff))>=0){
    for(int i = 0;i<length;i++){
        byte byteVal = byteBuff[i];
        System.out.println(byteVal);
    }
}

//Reader
Reader reader = new FileReader(f);
while ((intVal = reader.read())>=0){
    char charVal = (char) intVal;
    System.out.println(charVal);
}
reader = new FileReader(f);
char[] charBuff = {'a','b','c'};
while((length = reader.read(charBuff))>=0){
    for(int i=0;i<length;i++){
        char charVal = charBuff[i];
        System.out.println("==="+charVal);
    }
}

try with resource写法

try(BufferedReader br = new BufferedReader(new FileReader("/Users/buxuesong/Documents/svn_code/demo/test.txt"))){
    while ((intVal = br.read())>=0){
        char charVal = (char) intVal;
        System.out.println("BufferedReader"+charVal);
    }

}
try(BufferedReader br = new BufferedReader(new FileReader("/Users/buxuesong/Documents/svn_code/demo/testBufferedWriter.txt"))){
    String inValue;
    while((inValue = br.readLine())!=null){
        System.out.println("inValue"+inValue);
    }
}

新的输入输出写法:

try(BufferedReader br = Files.newBufferedReader(Paths.get("/Users/buxuesong/Documents/svn_code/demo/testBufferedWriter.txt"))){
    String inValue;
    while((inValue = br.readLine())!=null){
        System.out.println("Files.newBufferedReader="+inValue);
    }
}

List<String> lines = Files.readAllLines(Paths.get("/Users/buxuesong/Documents/svn_code/demo/testBufferedWriter.txt"));

for(String line:lines)System.out.println("Files.readAllLines=="+line);

try(BufferedWriter bw = Files.newBufferedWriter(Paths.get("/Users/buxuesong/Documents/svn_code/demo/testNewBufferedWriter.txt"))){
    for(String d:data){
        bw.write(d);
        bw.newLine();

    }
}

Zip压缩文件写法:

public class ZipFileTest {

    public static void main(String args[]){

        String[] data ={
                "Line 1",
                "Line 2 2",
                "Line 3 3 3",
                "Line 4 4 4 4",
                "Line 5 5 5 5 5"
        };
        try(FileSystem zipFs = openZip(Paths.get("/Users/buxuesong/Documents/svn_code/demo/myData.zip"))){
            copyToZip(zipFs);
            writeToFileInZip1(zipFs,data);
            writeToFileInZip2(zipFs,data);
        }catch (Exception e){
            System.out.println(e.getClass().getSimpleName()+"-"+e.getMessage());
        }
    }

    private static FileSystem openZip(Path zipPath) throws IOException,URISyntaxException {
        Map<String,String> providerProps = new HashMap<>();
        providerProps.put("create","true");
        URI zipUri = new URI("jar:file",zipPath.toUri().getPath(),null);
        FileSystem zipFs = FileSystems.newFileSystem(zipUri, providerProps);
        return zipFs;
    }

    private static void copyToZip(FileSystem zipFs) throws IOException{
        Path sourceFile = Paths.get("/Users/buxuesong/Documents/svn_code/demo/test.txt");
//        Path sourceFile =  .getDefault().getPath("/Users/buxuesong/Documents/svn_code/demo/test.txt");
        Path destFile = zipFs.getPath("/file1Copied.txt");

        Files.copy(sourceFile,destFile, StandardCopyOption.REPLACE_EXISTING);
    }

    private static void writeToFileInZip1(FileSystem zipFs, String[] data) throws IOException{
        try(BufferedWriter bw = Files.newBufferedWriter(zipFs.getPath("/newFile1.txt"))){
            for(String d:data){
                bw.write(d);
                bw.newLine();
            }
        }
    }
    private static void writeToFileInZip2(FileSystem zipFs, String[] data) throws IOException{
       Files.write(zipFs.getPath("/newFile2.txt"), Arrays.asList(data),
               Charset.defaultCharset(), StandardOpenOption.CREATE);
    }
}

Writer
output类型
Disk:FileWrite
In-Memory:CharArrayWriter
StringWriter, 写入StringBuffer
行为类型:
BufferedWriter
PrintWriter

StandardOpenOption类型
WRITE,APPEND写入
CREATE,CREATE_NEW,创建,创建新的
DELETE_ON_CLOSE,完成后删除(临时文件)

try(BufferedWriter bw = Files.newBufferedWriter(
        Paths.get("/Users/buxuesong/Documents/svn_code/test.txt")
        ,StandardOpenOption.CREATE,StandardOpenOption.WRITE)){
    PrintWriter pw = new PrintWriter(bw);
    pw.write("Hello World!\n");
    pw.printf("W:%4d X:%4d\n",5,235);
    Calendar cl = Calendar.getInstance();
    cl.set(1987,11,23);
    pw.printf(Locale.US,"I birthed on %1$tB %1$tA %1$tY",cl);
}catch (IOException e){
}
//输出文件
Hello World!
W:   5 X: 235
I birthed on December Wednesday 1987

Reader方法

//关闭流并释放与其关联的所有系统资源。
abstract void    close()    
//标记流中的当前位置。
void    mark(int readAheadLimit)    
//判断此流是否支持mark()操作。
boolean    markSupported()    
//返回不读取任何字符的新 Reader 。
static Reader    nullReader()    
//读一个字符。
int    read()    
//将字符读入数组。
int    read(char[] cbuf)    
//将字符读入数组的一部分。
abstract int    read(char[] cbuf, int off, int len)    
//尝试将字符读入指定的字符缓冲区。
int    read(CharBuffer target)    
//判断此流是否可以读取。
boolean    ready()    
//重置流。
void    reset()    
//跳过字符。
long    skip(long n)    
//读取此阅读器中的所有字符,并按照读取的顺序将字符写入给定的编写器。
long    transferTo(Writer out)    

DataOutputSteam & DataInputStream

public static void main(String[] args) {
    try(OutputStream out = Files.newOutputStream(Paths.get("C:\\Users\\Xuesong.Bu\\Desktop\\a.txt"))){
        DataOutputStream dos = new DataOutputStream(out);
        dos.writeInt(1);
        dos.writeLong(2222L);
        dos.writeDouble(1.23);
        dos.writeChar('H');
        dos.writeUTF("hha");
    }catch (Exception e){
        e.printStackTrace();
    }
    try(InputStream in = Files.newInputStream(Paths.get("C:\\Users\\Xuesong.Bu\\Desktop\\a.txt"))){
        DataInputStream dis = new DataInputStream(in);
        int a = dis.readInt();
        System.out.println(a);
        Long b = dis.readLong();
        System.out.println(b);
        Double c = dis.readDouble();
        System.out.println(c);
        char d = dis.readChar();
        System.out.println(d);
        String e = dis.readUTF();
        System.out.println(e);
    }catch (Exception e){
        e.printStackTrace();
    }
}
//输出
1
2222
1.23
H
hha

Files循环读取文件夹下子目录及文件

Path path = Paths.get("/Users/buxuesong/Documents");

FileVisitor<Path> fileVisitor = new FileVisitor<Path>(){
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        fileCount ++;
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
        return FileVisitResult.CONTINUE;
    }
};
Files.walkFileTree(path, fileVisitor);
System.out.println(fileCount);

//另外几种循环读取所有文件个数
Path path = Paths.get("/Users/buxuesong/Documents/python-learn/ch01");
Stream<Path> stream = Files.walk(path);
System.out.println(Files.walk(path)
        .filter(Files::isDirectory)
        .count());
System.out.println(Files.walk(path)
        .filter(Files::isRegularFile)
        .count());
System.out.println(stream.count());

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK