0
点赞
收藏
分享

微信扫一扫

java -io流

耳一文 2022-03-30 阅读 32
java

目录

一、File类

构造器:

常用方法:

示例:

二、io流

三、字节流

     示例:

四、字节和字符桥接流

        手动编写字符间的转换

        使用字节到字符的转换流

五、字符流

六、缓冲流

        带有缓冲区的字节流

        带有缓冲区的字符流 


一、File类

可以通过file类获取文件或者文件夹的相关属性。

构造器:

File file = new File(String filePath);

常用方法:

1.isFile():j检测file是否为文件

2.isDirectory:检测file是否为文件夹

3.createNewFile():在指定的路径下创建文件,文件所在的目录必须存在

4.mkdir():创建目录,只能创建一级目录,无法创建多级目录

5.mkdirs():用于创建多级目录

6.delete():删除指定的文件,可以删除文件和文件夹(目录),但如果目 录中存在内容则无法删除,必须先删除目录中的内容才能删除目录

7.getAbsolutePath():获得文件的绝对路径

8.getName():获得文件名

9.istFiles():获得指定目录的所有子目录或文件的 File 对象

示例:

        

package com.jiazhong.io;

import java.io.File;
/*
* 编写Java程序:打印一个文件夹下的文件和目录名,并注明是文件还是目录。
* */

public class ioDemo1 {
public static void main(String[] args) {
File file = new File("E:/加中/javaWeb/4.24 IO流-File类/4.24 IO流-File类");
if(file.isDirectory()){
File[] files = file.listFiles();
if(files!=null&&files.length!=0) {
for (File file1 : files) {
if (file1.isDirectory()) {
System.out.println(file1.getName()+":是文件夹");
}else{
System.out.println(file1.getName()+":是文件");
}
}
}
}else {
System.out.println(":该文件是文件~");
}
}
}

package com.jiazhong.io;

import java.io.File;

/*
* 编写Java程序:删除指定的文件或文件夹,如果文件夹中有文件或子文件夹也一并删除。
* */


public class ioDemo2 {
public static void main(String[] args) {
File file = new File("E:/bbb");
delete(file);
}


public static void delete(File file){
if (file.exists()){
File[] files = file.listFiles();
if(files!=null&&files.length!=0){
for (File file1 : files) {
delete(file1);
}
file.delete();
}else {
file.delete();
}
}else {
System.out.println("该文件不存在!");
}
}
}
package com.jiazhong.io;

import java.io.File;

/*
* 编写Java程序:扫描整个硬盘中的所有文件,将文件的对象路径打印到控制台上
* */

public class ioDemo3 {
public static void main(String[] args) {
//获得磁盘中所有盘符的根目录
File[] roots = File.listRoots();
for (File root : roots) {
selectAll(root);
}
// selectAll(new File("D:/app/"));
}

public static void selectAll(File file){
if(file.exists()){
if(file.isDirectory()){
File[] files = file.listFiles();
if(files!=null&&files.length!=0){
for (File file1 : files) {
selectAll(file1);
}
}
}else {
System.out.println(file.getAbsolutePath());
}
}
}
}
package com.jiazhong.io;

import java.io.File;

/*
* 查找某个文件夹的所有同类型文件
* */


public class ioDemo4 {
public static void main(String[] args) {
File[] roots = File.listRoots();
for (File root : roots) {
selectById(root);
}

/* File file = new File("D:/app");
selectById(file);*/

}

//查找某类文件
public static void selectById(File file) {
if (file.exists()) {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null && files.length != 0) {
for (File file1 : files) {
selectById(file1);
}
}
} else {
String fileName = file.getName();
String ext = fileName.substring(fileName.lastIndexOf(".")+1);
if (ext.equals("docx") || ext.equals("doc")) {
System.out.println(file.getAbsolutePath());
}
}
}
}
}
package com.jiazhong.io;

import java.io.File;
import java.io.FilenameFilter;

/*
* 查找某个文件夹下的某个文件用过滤器
* */

public class ioDemo5 {
public static void main(String[] args) {
File file = new File("D:/");
File[] files = file.listFiles(new FilenameFilter() {
/*
* file 当前要遍历的文件对象
* fileName 当前要遍历的文件的文件名
* */

@Override
public boolean accept(File file, String fileName) {
//获取文件拓展名
String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
return ext.equalsIgnoreCase("doc") || ext.equalsIgnoreCase("docx");
}
});

for (File file1 : files) {
System.out.println(file1.getAbsolutePath());
}
}
}

二、io流

        输入流:指将外部文件中的数据读入到程序(内存)中的流

        输出流:指将程序中的数据写入到外部文件(磁盘)中的流

        io流是一个管道,可以将外部文件读入到内存中,也可以将内存中数据写入外部文件中去

三、字节流

        字节流操作文件时,使用 InputStream(字节输入流)和 OutputStream(字节输出 流)这两个类来实现,由于 InputStream 和 OutputStream 都是抽象类,在实际开发中 更多的使用子类实现 FileInputStream(文件字节输入流)和 FileOutputStream(文件字节 输出流);

        是以字节码的形式存储数据,更适合操作二进制文件(视频,音频)

     示例:

        

package com.jiazhong.字节流;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/*
* 字节输入流
* */

public class FileInputStream {
public static void main(String[] args) throws IOException {
InputStream inputStream = new java.io.FileInputStream("E:/new1.txt");
byte[] bytes = new byte[1024];
int len;//获取每次读取的长度,当没有可读取的内容时返回-1
while ((len=inputStream.read(bytes))!=-1){
String s = new String(bytes, 0, len);
System.out.println(s);
}
}
}
package com.jiazhong.字节流;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Scanner;

/*
* 字节输出流
* */

public class OutPutStream {
public static void main(String[] args) throws IOException {
OutputStream outputStream = new FileOutputStream("E:/new2.txt",true);//追加管道
Scanner sc = new Scanner(System.in);
while (true){
System.out.println("请输入一段字符串:");
String s = sc.next();
outputStream.write(s.getBytes());
outputStream.write("\r\n".getBytes());
if(s.equals("n")){
break;
}
outputStream.flush();//刷新,强行将管道中的数据写入磁盘中
}
outputStream.close();
}
}
package com.jiazhong.字节流;

import java.io.*;
import java.io.FileInputStream;

/*
* 使用输入输出流进行文件复制
* */

public class copy {
public static void main(String[] args) throws IOException {
//创建输入流管道
InputStream inputStream =new FileInputStream("E:\\加中\\JavaWeb开发.pdf");
//创建输出流管道
OutputStream outputStream =new FileOutputStream("E:/new.pdf");
long start = System.currentTimeMillis();
//定义字节数组
byte[] bytes = new byte[1024];
//定义变量
int len;
while ((len=inputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
}
long end = System.currentTimeMillis();
System.out.println("复制花费时间:"+(end-start)+"毫秒");
outputStream.close();
inputStream.close();
}
}

在使用输出流时一定要实现flush()方法;刷新管道,强行将管道中的数据写入磁盘中

四、字节和字符桥接流

        当外部文件与程序编码不同时,读写操作就可能会产生乱码问题。

        手动编写字符间的转换

        

package com.jiazhong.字节到字符的桥接流;

import java.io.*;

public class 手动转码 {
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("E:/a.txt");
byte[] bytes = new byte[1024];
int len=inputStream.read(bytes);
//解码,将文件编码方式转换java中Unicode的编码方式(默认UTF-8)
String string = new String(bytes,"GBK");
System.out.println(string);

OutputStream outputStream = new FileOutputStream("E:/a.txt",true);
//编码,将java数据编码为UTF-8字节数组(默认情况)
outputStream.write("你好吗".getBytes("GBK"));
outputStream.close();
inputStream.close();
}
}

        使用字节到字符的转换流

  Java.io 提供的两个转换流(处理流) InputStreamReader:将字节输入流转换为字符输入流                                                              OutputStreamWriter:将字节输出流转换为字符输出流来更好的解决此问题

package com.jiazhong.字节到字符的桥接流;


import java.io.*;

/*
* Java.io 提供的两个转换流(处理流)
InputStreamReader:将字节输入流转换为字符输入流
OutputStreamWriter:将字节输出流转换为字符输出流 需要时可以直接进行解码或编码
* */

public class 使用字节到字符的转换流 {
public static void main(String[] args) throws IOException {
//创建一个字节到字符转换流对象
Reader reader = new InputStreamReader(new FileInputStream("E:/b.txt"),"GBK");
char[] chars = new char[1024];
int read = reader.read(chars);
String s = new String(chars);
System.out.println(s);

Writer writer =new OutputStreamWriter(new FileOutputStream("E:/b.txt",true),"GBK");
writer.write("你好吗?");
writer.close();
reader.close();
}
}

五、字符流

字符流是以字符为单位读取数据,适合于读写文本文件

Reader 用于读取字符流的基础类,Writer 用于写入字符流的基础类

package com.jiazhong.字符流;


import java.io.*;

public class 字符流操作 {
public static void main(String[] args) throws IOException {
File file = new File("E:/h.txt");
if(file.exists()){
System.out.println("该文件已存在");
}else {
//新建文件
file.createNewFile();
}
Writer writer = new FileWriter(file);
writer.write("你好吗?");
writer.close();

Reader reader = new FileReader(file);
char[] chars = new char[1024];
int len = reader.read(chars);
String s = new String(chars, 0, len);
System.out.println(s);
}
}
package com.jiazhong.字符流;

import java.io.*;

public class 文件复制 {
public static void main(String[] args) throws IOException {
Reader reader = new FileReader("E:/a.txt");
Writer writer =new FileWriter("E:/f.txt");

char[] chars = new char[1024];
int len;
while ((len=reader.read(chars))!=-1){
writer.write(chars,0,len);
}
writer.close();
reader.close();
}
}

六、缓冲流

        缓冲流是对基础流的一个包装流(处理流),主要用于提高 IO 流的读写效率;

        Java 中针对字节流和字符流都提供了缓冲流

        带有缓冲区的字节流

package com.jiazhong.带有缓冲区的流;

/*
* 带有缓冲区的流相对效率较高
* */


import javax.swing.*;
import java.io.*;

public class 带有缓冲区的字节流 {
public static void main(String[] args) throws IOException {
//创建一字节输入流对象
InputStream inputStream = new FileInputStream("E:\\加中\\javaWeb\\4.15 JSTL的基本使用.rar");
//将字节输入流包装成一个带有缓冲区的字节输入流
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

OutputStream outputStream =new FileOutputStream("E:/a.rar");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
int len;
byte[] bytes = new byte[1024];
while ((len=bufferedInputStream.read(bytes))!=-1){
bufferedOutputStream.write(bytes,0,len);
}
bufferedOutputStream.close();
bufferedInputStream.close();
}
}

        带有缓冲区的字符流 

package com.jiazhong.带有缓冲区的流;

import java.io.*;

public class 带有缓冲区的字符流 {
public static void main(String[] args) throws IOException {
Reader reader = new FileReader("E:/a.txt");
BufferedReader bufferedReader = new BufferedReader(reader);

Writer writer = new FileWriter("E:/e.txt");
BufferedWriter bufferedWriter = new BufferedWriter(writer);

//readline:读取一行 若没有数据则返回null
String len;
while ((len=bufferedReader.readLine())!=null){
bufferedWriter.write(len);
bufferedWriter.newLine();//换行
}
bufferedWriter.close();
bufferedReader.close();
writer.close();
reader.close();
}
}
举报

相关推荐

0 条评论